This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch ci-fix in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 150500ca5a9f0dc33ee62f54b158c6eccebe89f3 Author: Stephen Mallette <[email protected]> AuthorDate: Fri Nov 19 10:40:22 2021 -0500 TINKERPOP-2626 Prevent premature close of traversal This is not a complete fix for this issue but does get rid of the premature close. Opted to try to close the Traversal as part of hasNext() as in a sense it is a way to complete iteration of the traversal. Without that change certain tests begin to fail so some additional change besides removing the premature close had to be added. --- CHANGELOG.asciidoc | 1 + .../gremlin/process/traversal/step/filter/RangeGlobalStep.java | 3 --- .../tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java | 4 +++- .../apache/tinkerpop/gremlin/structure/util/CloseableIterator.java | 3 +-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 7895524..1504016 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -23,6 +23,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima [[release-3-4-13]] === TinkerPop 3.4.13 (Release Date: NOT OFFICIALLY RELEASED YET) +* Fixed `RangeGlobalStep` which was prematurely closing the iterator. * Prevented XML External Entity (XXE) style attacks via `GraphMLReader` by disabling DTD and external entities by default. * Improved error message for failed serialization for HTTP-based requests. * Fixed a `NullPointerException` that could occur during a failed `Connection` initialization due to uninstantiated `AtomicInteger`. diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java index 37441eb..9824332 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java @@ -63,9 +63,6 @@ public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging, if (this.bypass) return true; if (this.high != -1 && this.counter.get() >= this.high) { - // This is a global step and this place would be the end of the traversal. - // Close the traversal to free up resources. - CloseableIterator.closeIterator(traversal); throw FastNoSuchElementException.instance(); } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java index cd3b7c4..3aa7bc1 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java @@ -193,7 +193,9 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> { @Override public boolean hasNext() { if (!this.locked) this.applyStrategies(); - return this.lastTraverser.bulk() > 0L || this.finalEndStep.hasNext(); + final boolean more = this.lastTraverser.bulk() > 0L || this.finalEndStep.hasNext(); + if (!more) CloseableIterator.closeIterator(this); + return more; } @Override diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/CloseableIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/CloseableIterator.java index 2464d11..5c33f8d 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/CloseableIterator.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/CloseableIterator.java @@ -51,8 +51,7 @@ public interface CloseableIterator<T> extends Iterator<T>, Closeable { if (iterator instanceof AutoCloseable) { try { ((AutoCloseable) iterator).close(); - } - catch (Exception e) { + } catch (Exception e) { throw new RuntimeException(e); } }
