Cole Greer created TINKERPOP-3209:
-------------------------------------

             Summary: Inconsistency of "uncapped" side effects in OLAP
                 Key: TINKERPOP-3209
                 URL: https://issues.apache.org/jira/browse/TINKERPOP-3209
             Project: TinkerPop
          Issue Type: Improvement
          Components: process
    Affects Versions: 3.7.4
            Reporter: Cole Greer


The side-effect forms of group(), groupCount(), and tree(), when paired with a 
select() instead of a cap(), produce inconsistent results in OLAP. These 
traversals will occasionally throw a ConcurrentModificationException, 
suggesting some sort of race condition as a likely root cause.

Reproducer:

{code:java}
gremlin> g = TinkerFactory.createModern().traversal().withComputer()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], graphcomputer]
gremlin> g.V().groupCount("a").select("a")
==>[]
==>[]
==>[v[1]:1,v[2]:1]
==>[v[1]:1,v[2]:1,v[3]:1]
==>[v[1]:1,v[2]:1,v[3]:1,v[4]:1]
==>[v[1]:1,v[2]:1,v[3]:1,v[4]:1,v[5]:1]
gremlin> g.V().groupCount("a").select("a")
==>[]
==>[v[6]:1]
==>[v[6]:1]
==>[v[6]:1,v[3]:1]
==>[v[6]:1,v[3]:1]
==>[v[2]:1,v[6]:1,v[3]:1]
gremlin> g.V().groupCount("a").select("a")
==>[]
==>[]
==>[v[1]:1,v[2]:1]
==>[v[1]:1,v[2]:1,v[3]:1]
==>[v[1]:1,v[2]:1,v[3]:1,v[4]:1]
==>[v[1]:1,v[2]:1,v[3]:1,v[4]:1,v[5]:1]
gremlin> g.V().groupCount("a").select("a")
==>[]
==>[]
==>[]
==>[]
==>[v[2]:1,v[3]:1]
==>[v[1]:1,v[2]:1,v[3]:1,v[4]:1,v[5]:1]
gremlin> g.V().groupCount("a").select("a")
==>[]
==>[]
==>[]
==>[v[1]:1,v[2]:1,v[3]:1]
==>[v[1]:1,v[2]:1,v[3]:1,v[4]:1]
==>[v[1]:1,v[2]:1,v[3]:1,v[4]:1,v[5]:1]
gremlin> g.V().groupCount("a").select("a")
==>[]
==>[]
==>[v[1]:1,v[2]:1]
==>[v[1]:1,v[2]:1,v[3]:1]
==>[v[1]:1,v[2]:1,v[3]:1,v[4]:1]
==>[v[1]:1,v[2]:1,v[3]:1,v[4]:1,v[5]:1]
gremlin> g.V().groupCount("a").select("a")
==>[]
==>[v[1]:1]
==>[v[1]:1,v[2]:1]
==>[v[1]:1,v[2]:1,v[3]:1]
==>[v[1]:1,v[2]:1,v[3]:1,v[4]:1]
==>[v[1]:1,v[2]:1,v[3]:1,v[4]:1,v[5]:1]
gremlin> g.V().groupCount("a").select("a")
java.lang.RuntimeException: java.lang.IllegalStateException: 
java.util.ConcurrentModificationException
Type ':help' or ':h' for help.
Display stack trace? [yN]y
java.lang.IllegalStateException: java.lang.RuntimeException: 
java.lang.IllegalStateException: java.util.ConcurrentModificationException
        at 
org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.VertexProgramStep.processNextStart(VertexProgramStep.java:88)
        at 
org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.hasNext(AbstractStep.java:155)
        at 
org.apache.tinkerpop.gremlin.process.traversal.step.util.ExpandableStepIterator.next(ExpandableStepIterator.java:55)
        at 
org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep.processNextStart(ComputerResultStep.java:68)
        at 
org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.hasNext(AbstractStep.java:155)
        at 
org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.hasNext(DefaultTraversal.java:192)
        at 
org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
        at 
org.apache.tinkerpop.gremlin.console.Console$_closure3.doCall(Console.groovy:268)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at 
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:343)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:328)
        at 
org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:280)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1007)
        at groovy.lang.Closure.call(Closure.java:433)
        at groovy.lang.Closure.call(Closure.java:422)
        at 
org.apache.groovy.groovysh.Groovysh.setLastResult(Groovysh.groovy:483)
        at org.apache.groovy.groovysh.Groovysh.execute(Groovysh.groovy:209)
        at 
org.apache.tinkerpop.gremlin.console.GremlinGroovysh.super$3$execute(GremlinGroovysh.groovy)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at 
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:343)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:328)
        at groovy.lang.MetaClassImpl.doInvokeMethod(MetaClassImpl.java:1333)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1088)
        at 
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(ScriptBytecodeAdapter.java:146)
        at 
org.apache.tinkerpop.gremlin.console.GremlinGroovysh.execute(GremlinGroovysh.groovy:87)
        at 
org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
        at org.apache.groovy.groovysh.Shell.leftShift(Shell.groovy:121)
        at 
org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
        at org.apache.groovy.groovysh.ShellRunner.work(ShellRunner.groovy:93)
        at 
org.apache.groovy.groovysh.InteractiveShellRunner.work(InteractiveShellRunner.groovy:124)
        at 
org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
        at org.apache.groovy.groovysh.ShellRunner.run(ShellRunner.groovy:57)
        at 
org.apache.groovy.groovysh.InteractiveShellRunner.run(InteractiveShellRunner.groovy:96)
        at 
org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
        at 
org.apache.tinkerpop.gremlin.console.Console.<init>(Console.groovy:181)
        at 
org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
        at org.apache.tinkerpop.gremlin.console.Console.main(Console.groovy:580)
Caused by: java.util.concurrent.ExecutionException: java.lang.RuntimeException: 
java.lang.IllegalStateException: java.util.ConcurrentModificationException
        at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
        at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
        at 
org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.VertexProgramStep.processNextStart(VertexProgramStep.java:68)
        ... 42 more
Caused by: java.lang.RuntimeException: java.lang.IllegalStateException: 
java.util.ConcurrentModificationException
        at 
org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer.lambda$submit$3(TinkerGraphComputer.java:252)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.IllegalStateException: 
java.util.ConcurrentModificationException
        at 
org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerWorkerPool.executeVertexProgram(TinkerWorkerPool.java:115)
        at 
org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer.lambda$submit$3(TinkerGraphComputer.java:177)
        ... 4 more
Caused by: java.util.concurrent.ExecutionException: 
java.util.ConcurrentModificationException
        at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
        at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
        at 
org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerWorkerPool.executeVertexProgram(TinkerWorkerPool.java:111)
        ... 5 more
Caused by: java.util.ConcurrentModificationException
        at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1511)
        at java.base/java.util.HashMap$EntryIterator.next(HashMap.java:1544)
        at java.base/java.util.HashMap$EntryIterator.next(HashMap.java:1542)
        at 
org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceFactory.detach(ReferenceFactory.java:110)
        at 
org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.HaltedTraverserStrategy.halt(HaltedTraverserStrategy.java:60)
        at 
org.apache.tinkerpop.gremlin.process.computer.traversal.WorkerExecutor.lambda$drainStep$4(WorkerExecutor.java:238)
        at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
        at 
org.apache.tinkerpop.gremlin.process.computer.traversal.WorkerExecutor.drainStep(WorkerExecutor.java:231)
        at 
org.apache.tinkerpop.gremlin.process.computer.traversal.WorkerExecutor.execute(WorkerExecutor.java:152)
        at 
org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram.execute(TraversalVertexProgram.java:305)
        at 
org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer.lambda$submit$0(TinkerGraphComputer.java:182)
        at 
org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerWorkerPool.lambda$executeVertexProgram$0(TinkerWorkerPool.java:103)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at 
java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        ... 4 more
{code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to