| Emilio:     Great catch.  Should have thought about the multiple
      iterators. And thanks for the efficiency. 
 
 On 4/25/17 10:55 AM, Emilio Lahr-Vivaz
      wrote:
 
      
      Hi David,
 I think the issue you are having is calling collection.features()
      repeatedly. This method returns a new iterator each time you call
      it, which then must be closed. So calling
      `collection.features().hasNext(); collection.features().close();`
      will open two iterators, one of which is closed immediately and
      the other which is never closed. Since you're only ever checking
      the first result from a feature iterator, it's behaving correctly,
      but executing your query multiple times (once per iterator) and
      leaving open connections.
 
 There's another improvement that you could do (although it won't
      change the underlying result, it will be much more efficient)
      which is to use a modifying feature writer instead of doing a
      query and then modify (pseudo code example):
 
 SimpleFeatureWriter writer = dataStore.getFeatureWriter(typeName,
      filter, Transaction.AUTO_COMMIT);
 while (writer.hasNext()) {
 SimpleFeature toModify = writer.next();
 // set the attributes you want to update in the toModify feature
 writer.write();
 }
 writer.close();
 
 hth,
 
 Emilio
 
 
 On 04/24/2017 05:43 PM, David Boyd
        wrote:
 
        All:    I have been fighting these issues for some time and
          have narrowed it down to the below chunk of code. Based on the log file attached the error occurs randomly at
          the lines of code below labeled Error here in trace You will see a number of calls to
          collection.features().close() commented out.  If I enable
          those, I get a tonof errors about the socket already being closed.   I have
          tried enabling different combinations of the call to close
 and get basically the same results.
 The near random nature of this occurring if you look at the
          trace appears to be some sort of connection or thread pool timing issue based on reuse.
 
 Has anyone of the list seen this error.  I am using Accumulo
          1.7.2 and Geomesa 1.3.1.
      private boolean
          updateFeatureIfExists(String featuresetname, CoalesceRecord
          record)throws IOException, CQLException,
          CoalesceDataFormatException
 {
 boolean updated = false;
 SimpleFeatureStore store = (SimpleFeatureStore)
          connect.getGeoDataStore().getFeatureSource(featuresetname);
 FilterFactory2 ff =
          CommonFactoryFinder.getFilterFactory2();
 
 FeatureId fid =ff.featureId(record.getKey());
 // TODO Need to add compare of modified time to see if
          there was an update
 Filter filter = ff.id(Collections.singleton(fid));
 
 // Need to escape the fully qualified column in the
          feature set for filters
 //Filter filter =
          CQL.toFilter("\""+featuresetname+".recordKey\" =" + "'" +
          record.getKey() + "'");
 
 SimpleFeatureCollection collection =
          store.getFeatures(filter);
 int size = collection.size();
 boolean hasNext =
            collection.features().hasNext();    <<<<<
            Error here in trace
 LOGGER.info("Entity Collection size: {}  hasNext:
          {}",size,hasNext);
 
 if (hasNext )
 {
 SimpleFeature thefeature =
            collection.features().next();   <<< Error here in
            trace
 //LOGGER.info("Features found:
          {}",collection.size());
 //collection.features().close();
 // Transactions not supported by GEOMESA
 Transaction transaction = new
          DefaultTransaction();
 store.setTransaction(transaction);
 
 List<String> fieldNames  = new
          ArrayList<String>();
 List<Object> fieldVals = new ArrayList();
 String liststring;
 for (CoalesceField<?> field :
          record.getFields())
 {
 // update
 //store.modifyFeatures(field.getName(),
          field.getValue(), filter);
 fieldNames.add(field.getName());
 Object fieldvalue = field.getValue();
 switch (field.getDataType()) {
 
 // These types should be able to be
          handled directly
 case BOOLEAN_TYPE:
 case DOUBLE_TYPE:
 case FLOAT_TYPE:
 case INTEGER_TYPE:
 case LONG_TYPE:
 case STRING_TYPE:
 case URI_TYPE:
 case LINE_STRING_TYPE:
 case POLYGON_TYPE:
 fieldVals.add(fieldvalue);
 break;
 
 case STRING_LIST_TYPE:
 liststring =
          Arrays.toString((String[]) fieldvalue);
 fieldVals.add(liststring);
 break;
 case DOUBLE_LIST_TYPE:
 liststring =
          Arrays.toString((double[]) fieldvalue);
 fieldVals.add(liststring);
 break;
 case INTEGER_LIST_TYPE:
 liststring = Arrays.toString((int[])
          fieldvalue);
 fieldVals.add(liststring);
 break;
 case LONG_LIST_TYPE:
 liststring = Arrays.toString((long[])
          fieldvalue);
 fieldVals.add(liststring);
 break;
 case FLOAT_LIST_TYPE:
 liststring = Arrays.toString((float[])
          fieldvalue);
 fieldVals.add(liststring);
 break;
 case GUID_LIST_TYPE:
 liststring = Arrays.toString((UUID[])
          fieldvalue);
 fieldVals.add(liststring);
 break;
 case BOOLEAN_LIST_TYPE:
 
 liststring =
          Arrays.toString((boolean[]) fieldvalue);
 fieldVals.add(liststring);
 break;
 
 case GUID_TYPE:
 String guid = ((UUID)
          fieldvalue).toString();
 fieldVals.add(guid);
 break;
 
 case GEOCOORDINATE_LIST_TYPE:
 MultiPoint points = new
          GeometryFactory().createMultiPoint((Coordinate[]) fieldvalue);
 fieldVals.add(points);
 break;
 
 case GEOCOORDINATE_TYPE:
 Point point = new
          GeometryFactory().createPoint((Coordinate) fieldvalue);
 fieldVals.add(point);
 break;
 
 
 // Circles will be converted to polygons
 case CIRCLE_TYPE:
 // Create Polygon
 
 CoalesceCircle circle =
          (CoalesceCircle) fieldvalue;
 GeometricShapeFactory factory = new
          GeometricShapeFactory();
 factory.setSize(circle.getRadius());
 factory.setNumPoints(360); // 1 degree
          points
 factory.setCentre(circle.getCenter());
 Polygon shape =
          factory.createCircle();
 fieldVals.add(shape);
 break;
 
 case DATE_TIME_TYPE:
 fieldVals.add (((DateTime)
          fieldvalue).toDate());
 break;
 case FILE_TYPE:
 case BINARY_TYPE:
 default:
 break;
 }
 }
 
 try {
 store.modifyFeatures( fieldNames.toArray(new
          String[fieldNames.size()]), fieldVals.toArray(), filter);
 } catch (IllegalArgumentException e)
 {
 LOGGER.error(e.getMessage(), e);
 updated = false;
 
 return updated;
 }
 updated = true;
 transaction.commit();
 transaction.close();
 
 
 } //else {
 //    collection.features().close();
 // }
 
 
 return updated;
 }
 private boolean updateLinkIfExists(String featuresetname,
          CoalesceLinkage link)
 throws IOException, CQLException,
          CoalesceDataFormatException
 {
 boolean updated = false;
 SimpleFeatureStore store = (SimpleFeatureStore)
          connect.getGeoDataStore().getFeatureSource(featuresetname);
 FilterFactory2 ff =
          CommonFactoryFinder.getFilterFactory2();
 
 FeatureId fid =ff.featureId(link.getKey());
 
 Filter filter = ff.id(Collections.singleton(fid));
 
 // Need to escape the fully qualified column in the
          feature set for filters
 //Filter filter =
          CQL.toFilter("\""+featuresetname+".recordKey\" =" + "'" +
          record.getKey() + "'");
 
 SimpleFeatureCollection collection =
          store.getFeatures(filter);
 int size = collection.size();
 boolean hasNext =
            collection.features().hasNext();  <<< Error here in trace
 LOGGER.info("Linkage Collection size: {}  hasNext:
          {}",size,hasNext);
 
 if (hasNext)
 {
 //LOGGER.info("Found Linkages:
          {}",collection.size());
 SimpleFeature thefeature =
            collection.features().next(); <<<
            Error here in trace
 //            if (collection.features().hasNext()) {
 //                collection.features().close();
 //            }
 // Transactions not supported by GEOMESA
 Transaction transaction = new
          DefaultTransaction();
 store.setTransaction(transaction);
 //SimpleFeature thefeature =
          collection.features().next();
 
 final String linkfields[] = {
 LINKAGE_ENTITY1_KEY_COLUMN_NAME,
 LINKAGE_ENTITY1_NAME_COLUMN_NAME,
 LINKAGE_ENTITY1_SOURCE_COLUMN_NAME,
 LINKAGE_ENTITY1_VERSION_COLUMN_NAME,
 LINKAGE_ENTITY2_KEY_COLUMN_NAME,
 LINKAGE_ENTITY2_NAME_COLUMN_NAME,
 LINKAGE_ENTITY2_SOURCE_COLUMN_NAME,
 LINKAGE_ENTITY2_VERSION_COLUMN_NAME,
 LINKAGE_LAST_MODIFIED_COLUMN_NAME,
 LINKAGE_LABEL_COLUMN_NAME,
 LINKAGE_LINK_TYPE_COLUMN_NAME
 };
 Object[] values = new Object[] {
 link.getEntity1Key(),
 link.getEntity1Name(),
 link.getEntity1Source(),
 link.getEntity1Version(),
 link.getEntity2Key(),
 link.getEntity2Name(),
 link.getEntity2Source(),
 link.getEntity2Version(),
 link.getLastModified(),
 link.getLabel(),
 link.getLinkType()
 };
 
 
 store.modifyFeatures(linkfields, values, filter);
 updated = true;
 transaction.commit();
 transaction.close();
 
 } //else {
 //    collection.features().close();
 // }
 
 return updated;
 }
 
 
 -- 
========= mailto:dboyd@xxxxxxxxxxxxxxxxx ============
David W. Boyd                     
VP,  Data Solutions       
10432 Balls Ford, Suite 240  
Manassas, VA 20109         
office:   +1-703-552-2862        
cell:     +1-703-402-7908
============== http://www.incadencecorp.com/ ============
ISO/IEC JTC1 WG9, editor ISO/IEC 20547 Big Data Reference Architecture
Chair ANSI/INCITS TC Big Data
Co-chair NIST Big Data Public Working Group Reference Architecture
First Robotic Mentor - FRC, FTC - www.iliterobotics.org
Board Member- USSTEM Foundation - www.usstem.org
The information contained in this message may be privileged 
and/or confidential and protected from disclosure.  
If the reader of this message is not the intended recipient 
or an employee or agent responsible for delivering this message 
to the intended recipient, you are hereby notified that any 
dissemination, distribution or copying of this communication 
is strictly prohibited.  If you have received this communication 
in error, please notify the sender immediately by replying to 
this message and deleting the material from any computer.
  
 
 _______________________________________________
geomesa-users mailing list
geomesa-users@xxxxxxxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.locationtech.org/mailman/listinfo/geomesa-users 
 
 
 _______________________________________________
geomesa-users mailing list
geomesa-users@xxxxxxxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.locationtech.org/mailman/listinfo/geomesa-users 
 -- 
========= mailto:dboyd@xxxxxxxxxxxxxxxxx ============
David W. Boyd                     
VP,  Data Solutions       
10432 Balls Ford, Suite 240  
Manassas, VA 20109         
office:   +1-703-552-2862        
cell:     +1-703-402-7908
============== http://www.incadencecorp.com/ ============
ISO/IEC JTC1 WG9, editor ISO/IEC 20547 Big Data Reference Architecture
Chair ANSI/INCITS TC Big Data
Co-chair NIST Big Data Public Working Group Reference Architecture
First Robotic Mentor - FRC, FTC - www.iliterobotics.org
Board Member- USSTEM Foundation - www.usstem.org
The information contained in this message may be privileged 
and/or confidential and protected from disclosure.  
If the reader of this message is not the intended recipient 
or an employee or agent responsible for delivering this message 
to the intended recipient, you are hereby notified that any 
dissemination, distribution or copying of this communication 
is strictly prohibited.  If you have received this communication 
in error, please notify the sender immediately by replying to 
this message and deleting the material from any computer.
  |