Hello,

So Distributed OLTP is done. I was able to get barriers, side-effects, 
auto-halting, stalling traversers for bulking, etc. implemented since this 
morning and well, tada.

There are more classes now, so here is a link to the package root. Again, this 
is just a test/ package in TinkerGraph for now to make it easy for me to play.

        
https://github.com/apache/tinkerpop/tree/TINKERPOP-1564/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/akka
 
<https://github.com/apache/tinkerpop/tree/TINKERPOP-1564/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/akka>

In TinkerActorSystem, you will see 3 traversals that executed in the public 
static main(). Here is the output.

EXECUTING: [[withStrategies(VertexProgramStrategy)], [V(), match([[], [as(a), 
out(created), as(b)]], [[], [as(b), in(created), as(c)]], [[], [as(b), 
has(name, eq(lop))]]), where(a, neq(c)), select(a, b, c), by(name)]]
master[created]: akka://traversal-1552478766/user/master
worker[created]: akka://traversal-1552478766/user/master/worker-765740875
worker[created]: akka://traversal-1552478766/user/master/worker-458575643
worker[created]: akka://traversal-1552478766/user/master/worker-2134136508
master[result]: {a=peter, b=lop, c=josh}
master[result]: {a=marko, b=lop, c=peter}
master[result]: {a=josh, b=lop, c=marko}
master[result]: {a=josh, b=lop, c=peter}
master[result]: {a=peter, b=lop, c=marko}
master[result]: {a=marko, b=lop, c=josh}
//////////////////////////////////

EXECUTING: [[withStrategies(VertexProgramStrategy)], [V(), repeat([[], 
[both()]]), times(2), groupCount(a), by(name), cap(a), select(keys), unfold(), 
limit(3)]]
master[created]: akka://traversal--116529363/user/master
worker[created]: akka://traversal--116529363/user/master/worker-97122649
worker[created]: akka://traversal--116529363/user/master/worker-32927032
worker[created]: akka://traversal--116529363/user/master/worker-1156903778
master[result]: ripple
master[result]: peter
master[result]: vadas
//////////////////////////////////

EXECUTING: [[withStrategies(VertexProgramStrategy)], [V(), repeat([[], 
[both()]]), times(2), hasLabel(person), group(), by(name), by([[], 
[out(created), values(name), dedup(), fold()]])]]
master[created]: akka://traversal--558368687/user/master
worker[created]: akka://traversal--558368687/user/master/worker-704359101
worker[created]: akka://traversal--558368687/user/master/worker-767830874
worker[created]: akka://traversal--558368687/user/master/worker-1757847686
master[result]: {peter=[lop], vadas=[], josh=[ripple, lop], marko=[lop]}
//////////////////////////////////

Why are these traversals cool?

        1. match() works.
        2. side-effects work.
        3. reducing barriers work and check it, you can traverser beyond the 
local star graph!

What really opened everything up was realizing I could implement my own Mailbox.

        
https://github.com/apache/tinkerpop/blob/TINKERPOP-1564/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/akka/TraverserMailbox.java
 
<https://github.com/apache/tinkerpop/blob/TINKERPOP-1564/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/akka/TraverserMailbox.java>

This allows me to order how certain types of messages are read by the actors 
and most importantly, allows me to back Traverser messages by a TraverserSet 
and thus, we now have the bulking optimization.

So freakin’ cool.

Enjoy!,
Marko.

http://markorodriguez.com



> On Dec 7, 2016, at 5:13 AM, Marko Rodriguez <okramma...@gmail.com> wrote:
> 
> Hello,
> 
> I have been studying Akka lately as a way to implement distributed 
> OLTP/dynamic query routing. I have a working implementation.
> 
> This is a “toy implementation” currently in the TINKERPOP-1564 test/ of 
> tinkergraph-gremlin.
> 
> There are 3 classes: 
> 
> TinkerActorSystem
>       
> https://github.com/apache/tinkerpop/blob/0462411f1d1ad6fab9d3e6e58e5e158c9bb3f207/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/akka/TinkerActorSystem.java
>  
> <https://github.com/apache/tinkerpop/blob/0462411f1d1ad6fab9d3e6e58e5e158c9bb3f207/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/akka/TinkerActorSystem.java>
> This class creates an Akka ActorSystem for a submitted traversal. It then 
> spawns a MasterTraversalActor given the traversal and a partitioner. The 
> partitioner is currently hardcoded.
> 
> MasterTraversalActor
>       
> https://github.com/apache/tinkerpop/blob/0462411f1d1ad6fab9d3e6e58e5e158c9bb3f207/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/akka/MasterTraversalActor.java
>  
> <https://github.com/apache/tinkerpop/blob/0462411f1d1ad6fab9d3e6e58e5e158c9bb3f207/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/akka/MasterTraversalActor.java>
> This class spawns a WorkerTraversalActor for each partition in the 
> partitioner. It then “starts” each worker and awaits halted traversers 
> (results).
> 
> WorkerTraversalActor
>       
> https://github.com/apache/tinkerpop/blob/0462411f1d1ad6fab9d3e6e58e5e158c9bb3f207/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/akka/WorkerTraversalActor.java
>  
> <https://github.com/apache/tinkerpop/blob/0462411f1d1ad6fab9d3e6e58e5e158c9bb3f207/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/akka/WorkerTraversalActor.java>
> This class streams out its partition's start step traversers. If the 
> traverser references elements local to its partition, it process it. Else, it 
> messages the traverser to the respective worker partition. It also receives 
> traversers from remote workers and processes them accordingly. If it yields a 
> halted traverser, the worker sends the halted traverser to the master 
> traversal.
> 
> Here is the System.out data when using:
> 
> g.V().match(
>   as("a").out("created").as("b"),
>   as("b").in("created").as("c"),
>   as("b").has("name", eq("lop"))).
>     where("a", neq("c")).
>     select("a", "b", "c").by("name")
> 
> master[created]: akka://traversal-1552478766/user/master 
> <akka://traversal-1552478766/user/master>
> worker[created]: akka://traversal-1552478766/user/master/worker-1211806485 
> <akka://traversal-1552478766/user/master/worker-1211806485>
> worker[created]: akka://traversal-1552478766/user/master/worker-1261612621 
> <akka://traversal-1552478766/user/master/worker-1261612621>
> worker[created]: akka://traversal-1552478766/user/master/worker-1864420351 
> <akka://traversal-1552478766/user/master/worker-1864420351>
> worker[created]: akka://traversal-1552478766/user/master/worker-1054674616 
> <akka://traversal-1552478766/user/master/worker-1054674616>
> worker[created]: akka://traversal-1552478766/user/master/worker-593666157 
> <akka://traversal-1552478766/user/master/worker-593666157>
> master[result]: {a=marko, b=lop, c=peter}
> master[result]: {a=josh, b=lop, c=marko}
> master[result]: {a=marko, b=lop, c=josh}
> master[result]: {a=peter, b=lop, c=josh}
> master[result]: {a=peter, b=lop, c=marko}
> master[result]: {a=josh, b=lop, c=peter}
> 
> 
> This implementation currently does not support traversals with barriers or 
> side-effects. Moreover, it does not “stall the workers” to build up traverser 
> bulks. In other words, it currently messages one traverser at a time.
> 
> I hope you can appreciate the simplicity of implementation. Using 
> akka-remote, the code stays the same, save the URIs of the Akka actors 
> changes. Its all pretty basic in fact.
> 
> Enjoy,
> Marko.
> 
> http://markorodriguez.com <http://markorodriguez.com/>

Reply via email to