You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2019/06/25 19:29:51 UTC

[tinkerpop] branch master updated (75b2ab2 -> 6f74db7)

This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git.


    from 75b2ab2  Merge pull request #1145 from BrynCooke/TINKERPOP-2243
     add c13e8fd  TINKERPOP-2238 Fixed iterator leaks for GraphMLWriter
     add 05143f4  TINKERPOP-2238 Fixed iterator leak in subgraph() step
     add 32ee56f  TINKERPOP-2238 Fixed iterator leak in SubgraphStrategy test
     add 8eb734d  TINKERPOP-2238 Fixed iterator leaks in BLVP test
     add d89bb78  TINKERPOP-2238 Fixed GraphComputerTest iterator leak
     add 5935b8f  TINKERPOP-2238 Fixed iterator leaks in  generator tests
     add ac22cf9  TINKERPOP-2238 Removed the temporary IgnoreIteratorLeak
     add cba5081  TINKERPOP-2238 Updates to dev docs around iterator leaks.
     new 1f7e0e1  Merge branch 'TINKERPOP-2238' into tp33
     new d0d32fa  Merge branch 'tp33' into tp34
     new 6f74db7  Merge branch 'tp34'

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../dev/developer/development-environment.asciidoc |   1 +
 docs/src/dev/provider/index.asciidoc               |   8 +-
 .../traversal/step/sideEffect/SubgraphStep.java    |  17 +-
 .../structure/io/graphml/GraphMLWriter.java        | 179 +++++++++++----------
 .../tinkerpop/gremlin/AbstractGremlinTest.java     |   8 +-
 .../tinkerpop/gremlin/IgnoreIteratorLeak.java      |  41 -----
 .../algorithm/generator/AbstractGeneratorTest.java |  21 ++-
 .../generator/CommunityGeneratorTest.java          |   3 -
 .../generator/DistributionGeneratorTest.java       |   5 +-
 .../process/computer/GraphComputerTest.java        |   9 +-
 .../traversal/TraversalInterruptionTest.java       |   2 -
 .../traversal/step/sideEffect/SubgraphTest.java    |   2 -
 .../decoration/SubgraphStrategyProcessTest.java    |   4 +-
 .../tinkerpop/gremlin/structure/io/IoTest.java     |   3 -
 .../tinkergraph/structure/TinkerGraphIterator.java |  12 +-
 15 files changed, 147 insertions(+), 168 deletions(-)
 delete mode 100644 gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/IgnoreIteratorLeak.java


[tinkerpop] 01/03: Merge branch 'TINKERPOP-2238' into tp33

Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 1f7e0e143b8581c91d3be43ba0a777478deec040
Merge: dcf9e07 cba5081
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Tue Jun 25 14:51:17 2019 -0400

    Merge branch 'TINKERPOP-2238' into tp33

 .../dev/developer/development-environment.asciidoc |   1 +
 docs/src/dev/provider/index.asciidoc               |   8 +-
 .../traversal/step/sideEffect/SubgraphStep.java    |  17 ++-
 .../structure/io/graphml/GraphMLWriter.java        | 169 +++++++++++----------
 .../tinkerpop/gremlin/AbstractGremlinTest.java     |   8 +-
 .../tinkerpop/gremlin/IgnoreIteratorLeak.java      |  41 -----
 .../algorithm/generator/AbstractGeneratorTest.java |  21 ++-
 .../generator/CommunityGeneratorTest.java          |   3 -
 .../generator/DistributionGeneratorTest.java       |   5 +-
 .../process/computer/GraphComputerTest.java        |   9 +-
 .../bulkloading/BulkLoaderVertexProgramTest.java   |   9 +-
 .../traversal/TraversalInterruptionTest.java       |   2 -
 .../traversal/step/sideEffect/SubgraphTest.java    |   2 -
 .../decoration/SubgraphStrategyProcessTest.java    |   4 +-
 .../tinkerpop/gremlin/structure/io/IoTest.java     |   2 -
 .../tinkergraph/structure/TinkerGraphIterator.java |  12 +-
 16 files changed, 148 insertions(+), 165 deletions(-)



[tinkerpop] 03/03: Merge branch 'tp34'

Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 6f74db7551299334eb17a16cfebcc77634b53dc6
Merge: 75b2ab2 d0d32fa
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Tue Jun 25 15:29:39 2019 -0400

    Merge branch 'tp34'

 .../dev/developer/development-environment.asciidoc |   1 +
 docs/src/dev/provider/index.asciidoc               |   8 +-
 .../traversal/step/sideEffect/SubgraphStep.java    |  17 +-
 .../structure/io/graphml/GraphMLWriter.java        | 179 +++++++++++----------
 .../tinkerpop/gremlin/AbstractGremlinTest.java     |   8 +-
 .../tinkerpop/gremlin/IgnoreIteratorLeak.java      |  41 -----
 .../algorithm/generator/AbstractGeneratorTest.java |  21 ++-
 .../generator/CommunityGeneratorTest.java          |   3 -
 .../generator/DistributionGeneratorTest.java       |   5 +-
 .../process/computer/GraphComputerTest.java        |   9 +-
 .../traversal/TraversalInterruptionTest.java       |   2 -
 .../traversal/step/sideEffect/SubgraphTest.java    |   2 -
 .../decoration/SubgraphStrategyProcessTest.java    |   4 +-
 .../tinkerpop/gremlin/structure/io/IoTest.java     |   3 -
 .../tinkergraph/structure/TinkerGraphIterator.java |  12 +-
 15 files changed, 147 insertions(+), 168 deletions(-)


[tinkerpop] 02/03: Merge branch 'tp33' into tp34

Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit d0d32fa00dfe7430d806e313f6e00155c02de3c4
Merge: e8de6e9 1f7e0e1
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Tue Jun 25 15:29:13 2019 -0400

    Merge branch 'tp33' into tp34

 .../dev/developer/development-environment.asciidoc |   1 +
 docs/src/dev/provider/index.asciidoc               |   8 +-
 .../traversal/step/sideEffect/SubgraphStep.java    |  17 +-
 .../structure/io/graphml/GraphMLWriter.java        | 179 +++++++++++----------
 .../tinkerpop/gremlin/AbstractGremlinTest.java     |   8 +-
 .../tinkerpop/gremlin/IgnoreIteratorLeak.java      |  41 -----
 .../algorithm/generator/AbstractGeneratorTest.java |  21 ++-
 .../generator/CommunityGeneratorTest.java          |   3 -
 .../generator/DistributionGeneratorTest.java       |   5 +-
 .../process/computer/GraphComputerTest.java        |   9 +-
 .../bulkloading/BulkLoaderVertexProgramTest.java   |   9 +-
 .../traversal/TraversalInterruptionTest.java       |   2 -
 .../traversal/step/sideEffect/SubgraphTest.java    |   2 -
 .../decoration/SubgraphStrategyProcessTest.java    |   4 +-
 .../tinkerpop/gremlin/structure/io/IoTest.java     |   3 -
 .../tinkergraph/structure/TinkerGraphIterator.java |  12 +-
 16 files changed, 153 insertions(+), 171 deletions(-)

diff --cc docs/src/dev/provider/index.asciidoc
index 162e907,1185d0c..54e5f98
--- a/docs/src/dev/provider/index.asciidoc
+++ b/docs/src/dev/provider/index.asciidoc
@@@ -773,12 -813,15 +774,15 @@@ the query is finished
  
  TinkerPop provides you with the ability to test for such resource leaks by checking for leaks when you run the
  Gremlin-Test suites against your implementation. To enable this leak detection, providers should increment the
- `StoreIteratorCounter` whenever a reource is opened and decrement it when it is closed. A reference implementation
+ `StoreIteratorCounter` whenever a resource is opened and decrement it when it is closed. A reference implementation
  is provided with TinkerGraph as `TinkerGraphIterator.java`.
  
+ Assertions for leak detection are enabled by default when running the test suite. They can be temporarily disabled
+ by way of a system property - simply set `-DtestIteratorLeaks=false".
+ 
  === Accessibility via GremlinPlugin
  
 -image:gremlin-plugin.png[width=100,float=left] The applications distributed with TinkerPop3 do not distribute with
 +image:gremlin-plugin.png[width=100,float=left] The applications distributed with TinkerPop do not distribute with
  any graph system implementations besides TinkerGraph. If your implementation is stored in a Maven repository (e.g.
  Maven Central Repository), then it is best to provide a <<gremlin-plugins,`GremlinPlugin`>> implementation so the respective jars can be
  downloaded according and when required by the user. Neo4j's GremlinPlugin is provided below for reference.
diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java
index 59812f0,6d31cc8..8f0d1e0
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java
@@@ -214,24 -213,16 +215,24 @@@ public final class GraphMLWriter implem
              return writer;
          } else
              return utf8Writer;
 -    }
 +        }
  
      private void writeTypes(final Map<String, String> identifiedVertexKeyTypes,
 -                            final Map<String, String> identifiedEdgeKeyTypes,
 -                            final XMLStreamWriter writer) throws XMLStreamException {
 +            final Map<String, String> identifiedEdgeKeyTypes,
 +            final XMLStreamWriter writer) throws XMLStreamException {
          // <key id="weight" for="edge" attr.name="weight" attr.type="float"/>
-         final Collection<String> vertexKeySet = getVertexKeysAndNormalizeIfRequired(identifiedVertexKeyTypes);
-         final Collection<String> edgeKeySet = getEdgeKeysAndNormalizeIfRequired(identifiedEdgeKeyTypes);
+         final Collection<String> vertexKeySet = getKeysAndNormalizeIfRequired(identifiedVertexKeyTypes);
++        final Collection<String> edgeKeySet = getKeysAndNormalizeIfRequired(identifiedEdgeKeyTypes);
 +        // in case vertex and edge may have the same attribute name, the key id in graphml have to be different
 +        intersection = CollectionUtils.intersection(vertexKeySet, edgeKeySet);
 +
          for (String key : vertexKeySet) {
              writer.writeStartElement(GraphMLTokens.KEY);
 -            writer.writeAttribute(GraphMLTokens.ID, key);
 +            if (intersection.contains(key)) {
 +                writer.writeAttribute(GraphMLTokens.ID, key.concat(GraphMLTokens.VERTEX_SUFFIX));
 +            } else {
 +                writer.writeAttribute(GraphMLTokens.ID, key);
 +            }
              writer.writeAttribute(GraphMLTokens.FOR, GraphMLTokens.NODE);
              writer.writeAttribute(GraphMLTokens.ATTR_NAME, key);
              writer.writeAttribute(GraphMLTokens.ATTR_TYPE, identifiedVertexKeyTypes.get(key));
@@@ -252,66 -241,62 +253,70 @@@
      }
  
      private void writeEdges(final XMLStreamWriter writer, final Graph graph) throws XMLStreamException {
-         if (normalize) {
-             final List<Edge> edges = IteratorUtils.list(graph.edges());
-             Collections.sort(edges, Comparators.ELEMENT_COMPARATOR);
- 
-             for (Edge edge : edges) {
-                 writer.writeStartElement(GraphMLTokens.EDGE);
-                 writer.writeAttribute(GraphMLTokens.ID, edge.id().toString());
-                 writer.writeAttribute(GraphMLTokens.SOURCE, edge.outVertex().id().toString());
-                 writer.writeAttribute(GraphMLTokens.TARGET, edge.inVertex().id().toString());
- 
-                 writer.writeStartElement(GraphMLTokens.DATA);
-                 writer.writeAttribute(GraphMLTokens.KEY, this.edgeLabelKey);
-                 writer.writeCharacters(edge.label());
-                 writer.writeEndElement();
+         final Iterator<Edge> iterator = graph.edges();
+         try {
+             if (normalize) {
+                 final List<Edge> edges = IteratorUtils.list(iterator);
+                 Collections.sort(edges, Comparators.ELEMENT_COMPARATOR);
  
-                 final List<String> keys = new ArrayList<>(edge.keys());
-                 Collections.sort(keys);
+                 for (Edge edge : edges) {
+                     writer.writeStartElement(GraphMLTokens.EDGE);
+                     writer.writeAttribute(GraphMLTokens.ID, edge.id().toString());
+                     writer.writeAttribute(GraphMLTokens.SOURCE, edge.outVertex().id().toString());
+                     writer.writeAttribute(GraphMLTokens.TARGET, edge.inVertex().id().toString());
  
-                 for (String key : keys) {
                      writer.writeStartElement(GraphMLTokens.DATA);
-                     if (intersection != null && intersection.contains(key)) {
-                         writer.writeAttribute(GraphMLTokens.KEY, key + GraphMLTokens.EDGE_SUFFIX);
-                     } else {
-                         writer.writeAttribute(GraphMLTokens.KEY, key);
+                     writer.writeAttribute(GraphMLTokens.KEY, this.edgeLabelKey);
+                     writer.writeCharacters(edge.label());
+                     writer.writeEndElement();
+ 
+                     final List<String> keys = new ArrayList<>(edge.keys());
+                     Collections.sort(keys);
+ 
+                     for (String key : keys) {
+                         writer.writeStartElement(GraphMLTokens.DATA);
 -                        writer.writeAttribute(GraphMLTokens.KEY, key);
++                        if (intersection != null && intersection.contains(key)) {
++                            writer.writeAttribute(GraphMLTokens.KEY, key + GraphMLTokens.EDGE_SUFFIX);
++                        } else {
++                            writer.writeAttribute(GraphMLTokens.KEY, key);
++                        }
+                         // technically there can't be a null here as gremlin structure forbids that occurrence even if Graph
+                         // implementations support it, but out to empty string just in case.
+                         writer.writeCharacters(edge.property(key).orElse("").toString());
+                         writer.writeEndElement();
                      }
-                     // technically there can't be a null here as gremlin structure forbids that occurrence even if Graph
-                     // implementations support it, but out to empty string just in case.
-                     writer.writeCharacters(edge.property(key).orElse("").toString());
                      writer.writeEndElement();
                  }
-                 writer.writeEndElement();
-             }
-         } else {
-             final Iterator<Edge> iterator = graph.edges();
-             while (iterator.hasNext()) {
-                 final Edge edge = iterator.next();
-                 writer.writeStartElement(GraphMLTokens.EDGE);
-                 writer.writeAttribute(GraphMLTokens.ID, edge.id().toString());
-                 writer.writeAttribute(GraphMLTokens.SOURCE, edge.outVertex().id().toString());
-                 writer.writeAttribute(GraphMLTokens.TARGET, edge.inVertex().id().toString());
- 
-                 writer.writeStartElement(GraphMLTokens.DATA);
-                 writer.writeAttribute(GraphMLTokens.KEY, this.edgeLabelKey);
-                 writer.writeCharacters(edge.label());
-                 writer.writeEndElement();
+             } else {
+                 while (iterator.hasNext()) {
+                     final Edge edge = iterator.next();
+                     writer.writeStartElement(GraphMLTokens.EDGE);
+                     writer.writeAttribute(GraphMLTokens.ID, edge.id().toString());
+                     writer.writeAttribute(GraphMLTokens.SOURCE, edge.outVertex().id().toString());
+                     writer.writeAttribute(GraphMLTokens.TARGET, edge.inVertex().id().toString());
  
-                 for (String key : edge.keys()) {
                      writer.writeStartElement(GraphMLTokens.DATA);
-                     if (intersection != null && intersection.contains(key)) {
-                         writer.writeAttribute(GraphMLTokens.KEY, key + GraphMLTokens.EDGE_SUFFIX);
-                     } else {
-                         writer.writeAttribute(GraphMLTokens.KEY, key);
+                     writer.writeAttribute(GraphMLTokens.KEY, this.edgeLabelKey);
+                     writer.writeCharacters(edge.label());
+                     writer.writeEndElement();
+ 
+                     for (String key : edge.keys()) {
+                         writer.writeStartElement(GraphMLTokens.DATA);
 -                        writer.writeAttribute(GraphMLTokens.KEY, key);
++                        if (intersection != null && intersection.contains(key)) {
++                            writer.writeAttribute(GraphMLTokens.KEY, key + GraphMLTokens.EDGE_SUFFIX);
++                        } else {
++                            writer.writeAttribute(GraphMLTokens.KEY, key);
++                        }
+                         // technically there can't be a null here as gremlin structure forbids that occurrence even if Graph
+                         // implementations support it, but out to empty string just in case.
+                         writer.writeCharacters(edge.property(key).orElse("").toString());
+                         writer.writeEndElement();
                      }
-                     // technically there can't be a null here as gremlin structure forbids that occurrence even if Graph
-                     // implementations support it, but out to empty string just in case.
-                     writer.writeCharacters(edge.property(key).orElse("").toString());
                      writer.writeEndElement();
                  }
-                 writer.writeEndElement();
              }
+         } finally {
+             CloseableIterator.closeIterator(iterator);
          }
      }
  
diff --cc gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
index c2650c4,95cfbb4..933be7c
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
@@@ -31,7 -31,7 +31,6 @@@ import org.apache.tinkerpop.gremlin.str
  import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
  import org.apache.tinkerpop.gremlin.util.iterator.StoreIteratorCounter;
  import org.junit.After;
--import org.junit.Assert;
  import org.junit.Before;
  import org.junit.Rule;
  import org.junit.rules.TestName;
@@@ -79,18 -76,8 +77,16 @@@ public abstract class AbstractGremlinTe
          final LoadGraphWith[] loadGraphWiths = testMethod.getAnnotationsByType(LoadGraphWith.class);
          final LoadGraphWith loadGraphWith = loadGraphWiths.length == 0 ? null : loadGraphWiths[0];
          final LoadGraphWith.GraphData loadGraphWithData = null == loadGraphWith ? null : loadGraphWith.value();
 +        final Set<FeatureRequirement> featureRequirementSet = getFeatureRequirementsForTest(testMethod, loadGraphWiths);
  
-         this.shouldTestIteratorLeak =  !this.getClass().isAnnotationPresent(IgnoreIteratorLeak.class);
- 
          graphProvider = GraphManager.getGraphProvider();
 +
 +        // pre-check if available from graph provider to avoid graph creation
 +        final Optional<Graph.Features> staticFeatures = graphProvider.getStaticFeatures();
 +        if (staticFeatures.isPresent()) {
 +            assumeRequirementsAreMetForTest(featureRequirementSet, staticFeatures.get(), true);
 +        }
 +
          graphProvider.getTestListener().ifPresent(l -> l.onTestStart(this.getClass(), name.getMethodName()));
  
          // Reset the counter for open iterators by this test
diff --cc gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java
index 89e7b4e,9152655..cf1c790
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java
@@@ -20,10 -20,9 +20,9 @@@ package org.apache.tinkerpop.gremlin.pr
  
  import org.apache.commons.configuration.MapConfiguration;
  import org.apache.tinkerpop.gremlin.LoadGraphWith;
- import org.apache.tinkerpop.gremlin.IgnoreIteratorLeak;
  import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
  import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
 -import org.apache.tinkerpop.gremlin.process.remote.RemoteGraph;
 +import org.apache.tinkerpop.gremlin.structure.RemoteGraph;
  import org.apache.tinkerpop.gremlin.process.traversal.Order;
  import org.apache.tinkerpop.gremlin.process.traversal.P;
  import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
diff --cc gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/IoTest.java
index 796de31,64bc361..af73ada
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/IoTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/IoTest.java
@@@ -21,7 -21,7 +21,6 @@@ package org.apache.tinkerpop.gremlin.st
  import org.apache.commons.configuration.Configuration;
  import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
  import org.apache.tinkerpop.gremlin.FeatureRequirement;
--import org.apache.tinkerpop.gremlin.IgnoreIteratorLeak;
  import org.apache.tinkerpop.gremlin.LoadGraphWith;
  import org.apache.tinkerpop.gremlin.TestHelper;
  import org.apache.tinkerpop.gremlin.structure.Direction;
@@@ -110,90 -110,7 +109,88 @@@ import static org.junit.Assume.assumeTh
  public class IoTest {
      private static final Logger logger = LoggerFactory.getLogger(IoTest.class);
  
 +    private static final String CLASSIC_GRAPH_WITH_COLOR = "<?xml version=\"1.0\" ?>\n" +
 +            "<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.1/graphml.xsd\">\n" +
 +            "    <key id=\"age\" for=\"node\" attr.name=\"age\" attr.type=\"int\"></key>\n" +
 +            "    <key id=\"colorV\" for=\"node\" attr.name=\"color\" attr.type=\"string\"></key>\n" +
 +            "    <key id=\"labelV\" for=\"node\" attr.name=\"labelV\" attr.type=\"string\"></key>\n" +
 +            "    <key id=\"lang\" for=\"node\" attr.name=\"lang\" attr.type=\"string\"></key>\n" +
 +            "    <key id=\"name\" for=\"node\" attr.name=\"name\" attr.type=\"string\"></key>\n" +
 +            "    <key id=\"colorE\" for=\"edge\" attr.name=\"color\" attr.type=\"string\"></key>\n" +
 +            "    <key id=\"labelE\" for=\"edge\" attr.name=\"labelE\" attr.type=\"string\"></key>\n" +
 +            "    <key id=\"weight\" for=\"edge\" attr.name=\"weight\" attr.type=\"float\"></key>\n" +
 +            "    <graph id=\"G\" edgedefault=\"directed\">\n" +
 +            "        <node id=\"1\">\n" +
 +            "            <data key=\"labelV\">vertex</data>\n" +
 +            "            <data key=\"age\">29</data>\n" +
 +            "            <data key=\"colorV\">#6495ed</data>\n" +
 +            "            <data key=\"name\">marko</data>\n" +
 +            "        </node>\n" +
 +            "        <node id=\"2\">\n" +
 +            "            <data key=\"labelV\">vertex</data>\n" +
 +            "            <data key=\"age\">27</data>\n" +
 +            "            <data key=\"colorV\">#6495ed</data>\n" +
 +            "            <data key=\"name\">vadas</data>\n" +
 +            "        </node>\n" +
 +            "        <node id=\"3\">\n" +
 +            "            <data key=\"labelV\">vertex</data>\n" +
 +            "            <data key=\"lang\">java</data>\n" +
 +            "            <data key=\"colorV\">#6495ed</data>\n" +
 +            "            <data key=\"name\">lop</data>\n" +
 +            "        </node>\n" +
 +            "        <node id=\"4\">\n" +
 +            "            <data key=\"labelV\">vertex</data>\n" +
 +            "            <data key=\"age\">32</data>\n" +
 +            "            <data key=\"colorV\">#6495ed</data>\n" +
 +            "            <data key=\"name\">josh</data>\n" +
 +            "        </node>\n" +
 +            "        <node id=\"5\">\n" +
 +            "            <data key=\"labelV\">vertex</data>\n" +
 +            "            <data key=\"lang\">java</data>\n" +
 +            "            <data key=\"colorV\">#6495ed</data>\n" +
 +            "            <data key=\"name\">ripple</data>\n" +
 +            "        </node>\n" +
 +            "        <node id=\"6\">\n" +
 +            "            <data key=\"labelV\">vertex</data>\n" +
 +            "            <data key=\"age\">35</data>\n" +
 +            "            <data key=\"colorV\">#6495ed</data>\n" +
 +            "            <data key=\"name\">peter</data>\n" +
 +            "        </node>\n" +
 +            "        <edge id=\"10\" source=\"4\" target=\"5\">\n" +
 +            "            <data key=\"labelE\">created</data>\n" +
 +            "            <data key=\"colorE\">#ee0000</data>\n" +
 +            "            <data key=\"weight\">1.0</data>\n" +
 +            "        </edge>\n" +
 +            "        <edge id=\"11\" source=\"4\" target=\"3\">\n" +
 +            "            <data key=\"labelE\">created</data>\n" +
 +            "            <data key=\"colorE\">#ee0000</data>\n" +
 +            "            <data key=\"weight\">0.4</data>\n" +
 +            "        </edge>\n" +
 +            "        <edge id=\"12\" source=\"6\" target=\"3\">\n" +
 +            "            <data key=\"labelE\">created</data>\n" +
 +            "            <data key=\"colorE\">#ee0000</data>\n" +
 +            "            <data key=\"weight\">0.2</data>\n" +
 +            "        </edge>\n" +
 +            "        <edge id=\"7\" source=\"1\" target=\"2\">\n" +
 +            "            <data key=\"labelE\">knows</data>\n" +
 +            "            <data key=\"colorE\">#ee0000</data>\n" +
 +            "            <data key=\"weight\">0.5</data>\n" +
 +            "        </edge>\n" +
 +            "        <edge id=\"8\" source=\"1\" target=\"4\">\n" +
 +            "            <data key=\"labelE\">knows</data>\n" +
 +            "            <data key=\"colorE\">#ee0000</data>\n" +
 +            "            <data key=\"weight\">1.0</data>\n" +
 +            "        </edge>\n" +
 +            "        <edge id=\"9\" source=\"1\" target=\"3\">\n" +
 +            "            <data key=\"labelE\">created</data>\n" +
 +            "            <data key=\"colorE\">#ee0000</data>\n" +
 +            "            <data key=\"weight\">0.4</data>\n" +
 +            "        </edge>\n" +
 +            "    </graph>\n" +
 +            "</graphml>";
 +
-     @IgnoreIteratorLeak
      public static class GraphMLTest extends AbstractGremlinTest {
 +
          @Test
          @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
          @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)