You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/12/15 17:54:58 UTC

tinkerpop git commit: lots of cleanup and organization of the interfaces. trying to line up the GraphActors interfaces as much as possible with GraphComputer interfaces. JavaDoc'in.

Repository: tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1564 f3658a5a8 -> df2b6a484


lots of cleanup and organization of the interfaces. trying to line up the GraphActors interfaces as much as possible with GraphComputer interfaces. JavaDoc'in.


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/df2b6a48
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/df2b6a48
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/df2b6a48

Branch: refs/heads/TINKERPOP-1564
Commit: df2b6a4848158c5d3013d48a249d348d35f9f300
Parents: f3658a5
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Dec 15 10:54:54 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Dec 15 10:54:54 2016 -0700

----------------------------------------------------------------------
 .../akka/process/actor/AkkaGraphActors.java     | 11 +--
 .../gremlin/akka/process/actor/MasterActor.java | 11 ++-
 .../tinkerpop/gremlin/process/actor/Actor.java  |  2 +-
 .../gremlin/process/actor/ActorProgram.java     | 72 ++++++++++++++++++--
 .../gremlin/process/actor/ActorsResult.java     | 30 ++++++++
 .../actor/traversal/TraversalActorProgram.java  | 19 ++++--
 .../actor/traversal/TraversalMasterProgram.java |  2 +-
 .../process/actor/util/DefaultActorsResult.java | 42 ++++++++++++
 8 files changed, 171 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/df2b6a48/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java
----------------------------------------------------------------------
diff --git a/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java b/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java
index 8cfe56f..2f62beb 100644
--- a/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java
+++ b/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java
@@ -25,8 +25,10 @@ import com.typesafe.config.Config;
 import com.typesafe.config.ConfigFactory;
 import com.typesafe.config.ConfigValueFactory;
 import org.apache.tinkerpop.gremlin.process.actor.ActorProgram;
+import org.apache.tinkerpop.gremlin.process.actor.ActorsResult;
 import org.apache.tinkerpop.gremlin.process.actor.Address;
 import org.apache.tinkerpop.gremlin.process.actor.GraphActors;
+import org.apache.tinkerpop.gremlin.process.actor.util.DefaultActorsResult;
 import org.apache.tinkerpop.gremlin.structure.Partitioner;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
@@ -41,18 +43,17 @@ import java.util.stream.Collectors;
  */
 public final class AkkaGraphActors<R> implements GraphActors<R> {
 
-    private final ActorProgram<R> actorProgram;
     private final ActorSystem system;
     private final Address.Master master;
+    private final ActorsResult<R> result = new DefaultActorsResult<>();
 
     public AkkaGraphActors(final ActorProgram<R> actorProgram, final Partitioner partitioner) {
-        this.actorProgram = actorProgram;
         final Config config = ConfigFactory.defaultApplication().
                 withValue("message-priorities",
-                        ConfigValueFactory.fromAnyRef(this.actorProgram.getMessagePriorities().stream().map(Class::getCanonicalName).collect(Collectors.toList()).toString()));
+                        ConfigValueFactory.fromAnyRef(actorProgram.getMessagePriorities().get().stream().map(Class::getCanonicalName).collect(Collectors.toList()).toString()));
         this.system = ActorSystem.create("traversal-" + actorProgram.hashCode(), config);
         try {
-            this.master = new Address.Master(this.system.actorOf(Props.create(MasterActor.class, this.actorProgram, partitioner), "master").path().toString(), InetAddress.getLocalHost());
+            this.master = new Address.Master(this.system.actorOf(Props.create(MasterActor.class, actorProgram, partitioner, result), "master").path().toString(), InetAddress.getLocalHost());
         } catch (final UnknownHostException e) {
             throw new IllegalStateException(e.getMessage(), e);
         }
@@ -74,7 +75,7 @@ public final class AkkaGraphActors<R> implements GraphActors<R> {
             while (!this.system.isTerminated()) {
 
             }
-            return this.actorProgram.getResult();
+            return this.result.getResult();
         });
     }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/df2b6a48/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/MasterActor.java
----------------------------------------------------------------------
diff --git a/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/MasterActor.java b/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/MasterActor.java
index 29cd212..11069f2 100644
--- a/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/MasterActor.java
+++ b/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/MasterActor.java
@@ -26,6 +26,7 @@ import akka.dispatch.RequiresMessageQueue;
 import akka.japi.pf.ReceiveBuilder;
 import org.apache.tinkerpop.gremlin.process.actor.Actor;
 import org.apache.tinkerpop.gremlin.process.actor.ActorProgram;
+import org.apache.tinkerpop.gremlin.process.actor.ActorsResult;
 import org.apache.tinkerpop.gremlin.process.actor.Address;
 import org.apache.tinkerpop.gremlin.structure.Partition;
 import org.apache.tinkerpop.gremlin.structure.Partitioner;
@@ -46,8 +47,10 @@ public final class MasterActor extends AbstractActor implements RequiresMessageQ
     private final Address.Master master;
     private final List<Address.Worker> workers;
     private final Map<Address, ActorSelection> actors = new HashMap<>();
+    private final ActorsResult<?> result;
 
-    public MasterActor(final ActorProgram program, final Partitioner partitioner) {
+    public MasterActor(final ActorProgram program, final Partitioner partitioner, final ActorsResult<?> result) {
+        this.result = result;
         try {
             this.master = new Address.Master(self().path().toString(), InetAddress.getLocalHost());
         } catch (final UnknownHostException e) {
@@ -97,6 +100,12 @@ public final class MasterActor extends AbstractActor implements RequiresMessageQ
     @Override
     public void close() {
         context().system().terminate();
+
+    }
+
+    @Override
+    public <R> ActorsResult<R> result() {
+        return (ActorsResult<R>) this.result;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/df2b6a48/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/Actor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/Actor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/Actor.java
index ed627de..e2f596e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/Actor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/Actor.java
@@ -33,7 +33,6 @@ public interface Actor {
     public <M> void send(final Address toActor, final M message);
 
 
-
     public interface Master extends Actor {
 
         public List<Address.Worker> workers();
@@ -42,6 +41,7 @@ public interface Actor {
 
         public void close();
 
+        public <R> ActorsResult<R> result();
 
     }
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/df2b6a48/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/ActorProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/ActorProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/ActorProgram.java
index 3ae54d1..dd0d7e7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/ActorProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/ActorProgram.java
@@ -19,21 +19,85 @@
 
 package org.apache.tinkerpop.gremlin.process.actor;
 
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
 import java.util.List;
+import java.util.Optional;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public interface ActorProgram<M> {
+public interface ActorProgram<M> extends Cloneable {
+
+    public static final String ACTOR_PROGRAM = "gremlin.actorProgram";
+
+    /**
+     * When it is necessary to store the state of the ActorProgram, this method is called.
+     * This is typically required when the ActorProgram needs to be serialized to another machine.
+     * Note that what is stored is simply the instance/configuration state, not any processed data.
+     * The default implementation provided simply stores the ActorProgarm class name for reflective reconstruction.
+     * It is typically a good idea to ActorProgram.super.storeState().
+     *
+     * @param configuration the configuration to store the state of the ActorProgram in.
+     */
+    public default void storeState(final Configuration configuration) {
+        configuration.setProperty(ACTOR_PROGRAM, this.getClass().getName());
+    }
 
+    /**
+     * When it is necessary to load the state of the ActorProgram, this method is called.
+     * This is typically required when the ActorProgram needs to be serialized to another machine.
+     * Note that what is loaded is simply the instance state, not any processed data.
+     *
+     * @param graph         the graph that the ActorProgram will run against
+     * @param configuration the configuration to load the state of the ActorProgram from.
+     */
+    public default void loadState(final Graph graph, final Configuration configuration) {
+
+    }
+
+    /**
+     * Create the {@link org.apache.tinkerpop.gremlin.process.actor.Actor.Worker} program.
+     * This is typically used by {@link Worker} to spawn its program.
+     *
+     * @param worker the worker actor creating the worker program
+     * @return the worker program
+     */
     public Worker createWorkerProgram(final Actor.Worker worker);
 
+    /**
+     * Create the {@link org.apache.tinkerpop.gremlin.process.actor.Actor.Master} program.
+     * This is typically used by {@link Master} to spawn its program.
+     *
+     * @param master the master actor creating the master program
+     * @return the master program
+     */
     public Master createMasterProgram(final Actor.Master master);
 
-    public List<Class> getMessagePriorities();
-
-    public M getResult();
+    /**
+     * Get the ordered list of message classes where order determines the priority
+     * of message reception by the respective {@link Actor}. For instance,
+     * if an {@link Actor} has a message of type {@code X} and a message of type {@code Y}
+     * in its message buffer, and {@code X} has a higher priority, it will be fetched
+     * first from the buffer. If no list is provided then its FIFO.
+     * The default implementation returns an {@link Optional#empty()}.
+     *
+     * @return the optional ordered list of message priorities.
+     */
+    public default Optional<List<Class>> getMessagePriorities() {
+        return Optional.empty();
+    }
 
+    /**
+     * When multiple workers on a single machine need ActorProgram instances, it is possible to use clone.
+     * This will provide a speedier way of generating instances, over the {@link ActorProgram#storeState} and {@link ActorProgram#loadState} model.
+     * The default implementation simply returns the object as it assumes that the ActorProgram instance is a stateless singleton.
+     *
+     * @return A clone of the VertexProgram object
+     */
+    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+    public ActorProgram<M> clone();
 
     public static interface Worker<M> {
         public void setup();

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/df2b6a48/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/ActorsResult.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/ActorsResult.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/ActorsResult.java
new file mode 100644
index 0000000..c9db36a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/ActorsResult.java
@@ -0,0 +1,30 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.actor;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface ActorsResult<R> {
+
+    public R getResult();
+
+    public void setResult(final R result);
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/df2b6a48/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalActorProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalActorProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalActorProgram.java
index f9f86da..6bfdff7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalActorProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalActorProgram.java
@@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.actor.traversal;
 
 import org.apache.tinkerpop.gremlin.process.actor.Actor;
 import org.apache.tinkerpop.gremlin.process.actor.ActorProgram;
+import org.apache.tinkerpop.gremlin.process.actor.ActorsResult;
 import org.apache.tinkerpop.gremlin.process.actor.traversal.message.BarrierAddMessage;
 import org.apache.tinkerpop.gremlin.process.actor.traversal.message.BarrierDoneMessage;
 import org.apache.tinkerpop.gremlin.process.actor.traversal.message.SideEffectAddMessage;
@@ -45,6 +46,7 @@ import org.apache.tinkerpop.gremlin.structure.Partitioner;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -60,7 +62,7 @@ public final class TraversalActorProgram<R> implements ActorProgram<TraverserSet
             BarrierDoneMessage.class,
             Terminate.class);
 
-    private final Traversal.Admin<?, R> traversal;
+    private Traversal.Admin<?, R> traversal;
     private final Partitioner partitioner;
     public TraverserSet<R> result = new TraverserSet<>();
 
@@ -96,13 +98,18 @@ public final class TraversalActorProgram<R> implements ActorProgram<TraverserSet
     }
 
     @Override
-    public List<Class> getMessagePriorities() {
-        return MESSAGE_PRIORITIES;
+    public Optional<List<Class>> getMessagePriorities() {
+        return Optional.of(MESSAGE_PRIORITIES);
     }
 
-
     @Override
-    public TraverserSet<R> getResult() {
-        return this.result;
+    public ActorProgram<TraverserSet<R>> clone() {
+        try {
+            final TraversalActorProgram<R> clone = (TraversalActorProgram<R>) super.clone();
+            clone.traversal = this.traversal.clone();
+            return clone;
+        } catch (final CloneNotSupportedException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/df2b6a48/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalMasterProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalMasterProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalMasterProgram.java
index 87ed4e6..e15106f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalMasterProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalMasterProgram.java
@@ -138,7 +138,7 @@ final class TraversalMasterProgram<M> implements ActorProgram.Master<M> {
 
     @Override
     public void terminate() {
-
+        this.master.result().setResult(this.results);
     }
 
     private void broadcast(final Object message) {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/df2b6a48/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/util/DefaultActorsResult.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/util/DefaultActorsResult.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/util/DefaultActorsResult.java
new file mode 100644
index 0000000..c650ba1
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/util/DefaultActorsResult.java
@@ -0,0 +1,42 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.actor.util;
+
+import org.apache.tinkerpop.gremlin.process.actor.ActorsResult;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class DefaultActorsResult<R> implements ActorsResult<R> {
+
+    private R result;
+
+    public DefaultActorsResult() {
+
+    }
+
+    public R getResult() {
+        return this.result;
+    }
+
+    public void setResult(final R result) {
+        this.result = result;
+    }
+}