I analysed and debugged a bit and found the following explanation: * depending on the constructor of ConcurrentSkipListMap the natural ordering is defined by the keys of the map (Feature-Ids) * Iterator of values() and entrySet() "returns the values in ascending order of the corresponding keys"
which brakes the code. For now I'm reverting the merge commit and looking for a better solution. - Frank 2015-11-02 21:53 GMT+01:00 Frank Gasdorf <[email protected]>: > Interessting and Sure, going to have a look at. Wondering because I > refactored to preserve ordering, tests in GeoTools are fine. > > 2015-11-02 21:17 GMT+01:00 Andrea Aime <[email protected]>: > >> Hi Jody and Frank, >> it looks like the changes to MemoryDataStore are breaking tests in >> GeoServer: >> >> Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.652 sec >> <<< FAILURE! >> testEscapes(org.geoserver.wfs.response.CSVOutputFormatTest) Time >> elapsed: 501 sec <<< FAILURE! >> org.junit.ComparisonFailure: expected:<A l[abel with "quotes"]> but >> was:<A l[ong label >> with windows >> newlines]> >> at org.junit.Assert.assertEquals(Assert.java:115) >> at org.junit.Assert.assertEquals(Assert.java:144) >> at >> org.geoserver.wfs.response.CSVOutputFormatTest.testEscapes(CSVOutputFormatTest.java:118) >> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >> at >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) >> at >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >> at java.lang.reflect.Method.invoke(Method.java:606) >> at >> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) >> at >> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) >> at >> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) >> at >> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) >> at >> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) >> at >> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) >> at org.junit.rules.RunRules.evaluate(RunRules.java:20) >> at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) >> at >> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) >> at >> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) >> at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) >> at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) >> at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) >> at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) >> at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) >> at >> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) >> at >> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) >> at org.junit.runners.ParentRunner.run(ParentRunner.java:309) >> at >> org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252) >> at >> org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) >> at >> org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) >> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >> at >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) >> at >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >> at java.lang.reflect.Method.invoke(Method.java:606) >> at >> org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) >> at >> org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) >> at >> org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) >> at >> org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) >> at >> org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) >> >> The test in question is indeed using a MemoryDataStore. I checked which >> other parts of GeoServer tests >> might be affected, came up with the following list (only including what's >> in supported land): >> >> > find . -name "*.java" | xargs grep MemoryDataStore >> ./wms/src/test/java/org/geoserver/wms/svg/SVGMapProducerTest.java:import >> org.geotools.data.memory.MemoryDataStore; >> ./wms/src/test/java/org/geoserver/wms/svg/SVGMapProducerTest.java: >> MemoryDataStore ds = new MemoryDataStore(); >> ./wms/src/test/java/org/geoserver/wms/WMSMockData.java:import >> org.geotools.data.memory.MemoryDataStore; >> ./wms/src/test/java/org/geoserver/wms/WMSMockData.java: private >> MemoryDataStore dataStore; >> ./wms/src/test/java/org/geoserver/wms/WMSMockData.java: dataStore >> = new MemoryDataStore(); >> ./wms/src/test/java/org/geoserver/wms/WMSMockData.java: >> dataStore.setNamespaceURI("http://geoserver.org"); // required for >> GeoTools 12 implemetnation of MemoryDataStore >> ./wms/src/test/java/org/geoserver/wms/WMSMockData.java: * Creates a >> vector layer with associated FeatureType in the internal MemoryDataStore >> with the >> ./wms/src/main/java/org/geoserver/wms/map/GetMapXmlReader.java:import >> org.geotools.data.memory.MemoryDataStore; >> ./wms/src/main/java/org/geoserver/wms/map/GetMapXmlReader.java: >> MemoryDataStore reTypedDS = new MemoryDataStore(reader); >> ./wms/src/main/java/org/geoserver/wms/map/GetMapKvpRequestReader.java:import >> org.geotools.data.memory.MemoryDataStore; >> ./wms/src/main/java/org/geoserver/wms/map/GetMapKvpRequestReader.java: >> MemoryDataStore reTypedDS = new MemoryDataStore(new >> ForceCoordinateSystemFeatureReader( >> ./web/demo/src/main/java/org/geoserver/web/crs/CRSAreaOfValidityMapBuilder.java:import >> org.geotools.data.memory.MemoryDataStore; >> ./web/demo/src/main/java/org/geoserver/web/crs/CRSAreaOfValidityMapBuilder.java: >> MemoryDataStore ds = new MemoryDataStore(); >> ./wfs/src/test/java/org/geoserver/wfs/response/CSVOutputFormatTest.java:import >> org.geotools.data.memory.MemoryDataStore; >> ./wfs/src/test/java/org/geoserver/wfs/response/CSVOutputFormatTest.java: >> MemoryDataStore data = new MemoryDataStore(); >> >> Could you have a look? >> >> Cheers >> Andrea >> >> >> On Sat, Oct 31, 2015 at 1:26 PM, Frank Gasdorf < >> [email protected]> wrote: >> >>> Hello folks, >>> >>> I updated the initial pull request. Additional to the internal >>> ConcurrentSkipListMap usage I synched the access to internal HashMaps >>> (memory >>> & schema objects) to avoid issues with concurrent access (createSchema, >>> removeSchema (see pull https://github.com/geotools/geotools/pull/1022) >>> and addFeatures and features() methodes) >>> >>> Do you have any comments or requests for change on the outstanding pull >>> request https://github.com/geotools/geotools/pull/1002 >>> >>> Hope anybody of you can have a look at while I start working on the pull >>> to backport it into 14.x >>> >>> Thanks a lot >>> >>> - Frank >>> >>> >>> 2015-09-13 9:09 GMT+02:00 Andrea Aime <[email protected]>: >>> >>>> On Thu, Sep 10, 2015 at 11:13 PM, Jody Garnett <[email protected]> >>>> wrote: >>>> >>>>> Since its not an "Ordered" DataStore that should preserve order I'd >>>>>> suggest to remove these tests. Opinions? >>>>>> >>>>> >>>>> If you change the functionality, change the test to match. There >>>>> should now be several feature collection implementations to choose from so >>>>> code that requires a TreeSet based functionality has a migration path. >>>>> >>>>> I'm wondering how you would think about this "proposal". However, >>>>>> STRtree internal creates a new List every type the Index is requested. I >>>>>> haven't investigated thread savety of STRtree yet. Maybe anybody of you >>>>>> has >>>>>> much more experiance than me to give feedback on that >>>>>> >>>>> >>>>> The index needs to get rebuilt each time a feature is modified, so >>>>> other than that overhead (which could be pushed off until "commit" ) it >>>>> should be workable. The List should not be a problem, as it offers you a >>>>> bit of independence (at the cost of possibly traversing through out of >>>>> date >>>>> information). >>>>> >>>>> >>>> One coud use a quadtree index instead, it can be modified without >>>> rebuilding it, but it's more prone to degeration to linked list, >>>> the STRTree is packed and optimized for balancing, but as you say, it's >>>> a pain if stuff gets modified. >>>> I don't think any of the JTS indexes is thread safe. >>>> >>>> Cheers >>>> Andrea >>>> >>>> -- >>>> == >>>> GeoServer Professional Services from the experts! Visit >>>> http://goo.gl/it488V for more information. >>>> == >>>> >>>> Ing. Andrea Aime >>>> @geowolf >>>> Technical Lead >>>> >>>> GeoSolutions S.A.S. >>>> Via Poggio alle Viti 1187 >>>> 55054 Massarosa (LU) >>>> Italy >>>> phone: +39 0584 962313 >>>> fax: +39 0584 1660272 >>>> mob: +39 339 8844549 >>>> >>>> http://www.geo-solutions.it >>>> http://twitter.com/geosolutions_it >>>> >>>> *AVVERTENZE AI SENSI DEL D.Lgs. 196/2003* >>>> >>>> Le informazioni contenute in questo messaggio di posta elettronica e/o >>>> nel/i file/s allegato/i sono da considerarsi strettamente riservate. Il >>>> loro utilizzo è consentito esclusivamente al destinatario del messaggio, >>>> per le finalità indicate nel messaggio stesso. Qualora riceviate questo >>>> messaggio senza esserne il destinatario, Vi preghiamo cortesemente di >>>> darcene notizia via e-mail e di procedere alla distruzione del messaggio >>>> stesso, cancellandolo dal Vostro sistema. Conservare il messaggio stesso, >>>> divulgarlo anche in parte, distribuirlo ad altri soggetti, copiarlo, od >>>> utilizzarlo per finalità diverse, costituisce comportamento contrario ai >>>> principi dettati dal D.Lgs. 196/2003. >>>> >>>> >>>> >>>> The information in this message and/or attachments, is intended solely >>>> for the attention and use of the named addressee(s) and may be confidential >>>> or proprietary in nature or covered by the provisions of privacy act >>>> (Legislative Decree June, 30 2003, no.196 - Italy's New Data Protection >>>> Code).Any use not in accord with its purpose, any disclosure, reproduction, >>>> copying, distribution, or either dissemination, either whole or partial, is >>>> strictly forbidden except previous formal approval of the named >>>> addressee(s). If you are not the intended recipient, please contact >>>> immediately the sender by telephone, fax or e-mail and delete the >>>> information in this message that has been received in error. The sender >>>> does not give any warranty or accept liability as the content, accuracy or >>>> completeness of sent messages and accepts no responsibility for changes >>>> made after they were sent or for other risks which arise as a result of >>>> e-mail transmission, viruses, etc. >>>> >>>> ------------------------------------------------------- >>>> >>> >>> >>> _______________________________________________ >>> udig-dev mailing list >>> [email protected] >>> To change your delivery options, retrieve your password, or unsubscribe >>> from this list, visit >>> https://locationtech.org/mailman/listinfo/udig-dev >>> >> >> >> >> -- >> == >> GeoServer Professional Services from the experts! Visit >> http://goo.gl/it488V for more information. >> == >> >> Ing. Andrea Aime >> @geowolf >> Technical Lead >> >> GeoSolutions S.A.S. >> Via Poggio alle Viti 1187 >> 55054 Massarosa (LU) >> Italy >> phone: +39 0584 962313 >> fax: +39 0584 1660272 >> mob: +39 339 8844549 >> >> http://www.geo-solutions.it >> http://twitter.com/geosolutions_it >> >> *AVVERTENZE AI SENSI DEL D.Lgs. 196/2003* >> >> Le informazioni contenute in questo messaggio di posta elettronica e/o >> nel/i file/s allegato/i sono da considerarsi strettamente riservate. Il >> loro utilizzo è consentito esclusivamente al destinatario del messaggio, >> per le finalità indicate nel messaggio stesso. Qualora riceviate questo >> messaggio senza esserne il destinatario, Vi preghiamo cortesemente di >> darcene notizia via e-mail e di procedere alla distruzione del messaggio >> stesso, cancellandolo dal Vostro sistema. Conservare il messaggio stesso, >> divulgarlo anche in parte, distribuirlo ad altri soggetti, copiarlo, od >> utilizzarlo per finalità diverse, costituisce comportamento contrario ai >> principi dettati dal D.Lgs. 196/2003. >> >> >> >> The information in this message and/or attachments, is intended solely >> for the attention and use of the named addressee(s) and may be confidential >> or proprietary in nature or covered by the provisions of privacy act >> (Legislative Decree June, 30 2003, no.196 - Italy's New Data Protection >> Code).Any use not in accord with its purpose, any disclosure, reproduction, >> copying, distribution, or either dissemination, either whole or partial, is >> strictly forbidden except previous formal approval of the named >> addressee(s). If you are not the intended recipient, please contact >> immediately the sender by telephone, fax or e-mail and delete the >> information in this message that has been received in error. The sender >> does not give any warranty or accept liability as the content, accuracy or >> completeness of sent messages and accepts no responsibility for changes >> made after they were sent or for other risks which arise as a result of >> e-mail transmission, viruses, etc. >> >> ------------------------------------------------------- >> > >
------------------------------------------------------------------------------
_______________________________________________ GeoTools-Devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/geotools-devel
