You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2016/06/17 20:45:07 UTC

[5/8] usergrid git commit: Use Guice magic instead of trying to serialize UniqueValueTable as an Akka creation prop.

Use Guice magic instead of trying to serialize UniqueValueTable as an Akka creation prop.


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

Branch: refs/heads/usergrid-1268-akka-211
Commit: e0d95bf0a0e9ec1cb622eb752ca895debfdbe465
Parents: b90985c
Author: Dave Johnson <sn...@apache.org>
Authored: Thu Jun 16 11:11:02 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Thu Jun 16 11:11:02 2016 -0400

----------------------------------------------------------------------
 .../uniquevalues/ClusterSingletonRouter.java    | 28 +++++++++--
 .../uniquevalues/GuiceActorProducer.java        | 46 ++++++++++++++++++
 .../uniquevalues/UniqueValueActor.java          | 25 ++++++++--
 .../uniquevalues/UniqueValuesServiceImpl.java   | 50 ++++++++++++++------
 4 files changed, 125 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/e0d95bf0/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/ClusterSingletonRouter.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/ClusterSingletonRouter.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/ClusterSingletonRouter.java
index d9c1aa4..7cc24eb 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/ClusterSingletonRouter.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/ClusterSingletonRouter.java
@@ -1,3 +1,19 @@
+/*
+ * 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.usergrid.persistence.collection.uniquevalues;
 
 import akka.actor.ActorRef;
@@ -5,6 +21,8 @@ import akka.actor.Props;
 import akka.actor.UntypedActor;
 import akka.routing.ConsistentHashingRouter;
 import akka.routing.FromConfig;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
 
 
 /**
@@ -14,10 +32,10 @@ public class ClusterSingletonRouter extends UntypedActor {
 
     private final ActorRef router;
 
-
-    public ClusterSingletonRouter( UniqueValuesTable table ) {
-        router = getContext().actorOf(
-                FromConfig.getInstance().props(Props.create(UniqueValueActor.class, table )), "router");
+    @Inject
+    public ClusterSingletonRouter( Injector injector ) {
+        router = getContext().actorOf( FromConfig.getInstance().props(
+            Props.create( GuiceActorProducer.class, injector, UniqueValueActor.class)), "router");
     }
 
     @Override
@@ -27,7 +45,7 @@ public class ClusterSingletonRouter extends UntypedActor {
             UniqueValueActor.Request request = (UniqueValueActor.Request)message;
 
             ConsistentHashingRouter.ConsistentHashableEnvelope envelope =
-                    new ConsistentHashingRouter.ConsistentHashableEnvelope( message, request.getConsistentHashKey() );
+                new ConsistentHashingRouter.ConsistentHashableEnvelope( message, request.getConsistentHashKey() );
             router.tell( envelope, getSender());
 
         } else {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/e0d95bf0/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/GuiceActorProducer.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/GuiceActorProducer.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/GuiceActorProducer.java
new file mode 100644
index 0000000..0e99bca
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/GuiceActorProducer.java
@@ -0,0 +1,46 @@
+/*
+ * 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.usergrid.persistence.collection.uniquevalues;
+
+import akka.actor.Actor;
+import akka.actor.IndirectActorProducer;
+import com.google.inject.Injector;
+
+
+public class GuiceActorProducer implements IndirectActorProducer {
+
+    final Injector injector;
+    final Class<? extends Actor> actorClass;
+
+    public GuiceActorProducer(Injector injector, Class<? extends Actor> actorClass) {
+        this.injector = injector;
+        this.actorClass = actorClass;
+    }
+
+    @Override
+    public Class<? extends Actor> actorClass() {
+        return actorClass;
+    }
+
+    @Override
+    public Actor produce() {
+        return injector.getInstance( actorClass );
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/e0d95bf0/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/UniqueValueActor.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/UniqueValueActor.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/UniqueValueActor.java
index 7becd47..fe2e356 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/UniqueValueActor.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/UniqueValueActor.java
@@ -1,9 +1,26 @@
+/*
+ * 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.usergrid.persistence.collection.uniquevalues;
 
 import akka.actor.ActorRef;
 import akka.actor.UntypedActor;
 import akka.cluster.pubsub.DistributedPubSub;
 import akka.cluster.pubsub.DistributedPubSubMediator;
+import com.google.inject.Inject;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.model.entity.Id;
@@ -21,15 +38,15 @@ public class UniqueValueActor extends UntypedActor {
 
     //private MetricsService metricsService;
 
-    final private UniqueValuesTable table;
-
     final private ActorRef mediator = DistributedPubSub.get(getContext().system()).mediator();
 
     private int count = 0;
 
+    @Inject
+    UniqueValuesTable table;
+
 
-    public UniqueValueActor( UniqueValuesTable table ) {
-        this.table = table;
+    public UniqueValueActor( ) {
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/usergrid/blob/e0d95bf0/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/UniqueValuesServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/UniqueValuesServiceImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/UniqueValuesServiceImpl.java
index b365b2b..5c12165 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/UniqueValuesServiceImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/UniqueValuesServiceImpl.java
@@ -31,6 +31,7 @@ import akka.util.Timeout;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ListMultimap;
 import com.google.inject.Inject;
+import com.google.inject.Injector;
 import com.google.inject.Singleton;
 import com.typesafe.config.Config;
 import com.typesafe.config.ConfigFactory;
@@ -52,6 +53,7 @@ import java.util.concurrent.TimeUnit;
 public class UniqueValuesServiceImpl implements UniqueValuesService {
     private static final Logger logger = LoggerFactory.getLogger( UniqueValuesServiceImpl.class );
 
+    private final Injector injector;
     AkkaFig akkaFig;
     UniqueValuesTable table;
     private String hostname;
@@ -78,7 +80,8 @@ public class UniqueValuesServiceImpl implements UniqueValuesService {
 
 
     @Inject
-    public UniqueValuesServiceImpl( AkkaFig akkaFig, UniqueValuesTable table ) {
+    public UniqueValuesServiceImpl(Injector injector, AkkaFig akkaFig, UniqueValuesTable table ) {
+        this.injector = injector;
         this.akkaFig = akkaFig;
         this.table = table;
 
@@ -155,16 +158,25 @@ public class UniqueValuesServiceImpl implements UniqueValuesService {
         // Create one actor system with request actor for each region
 
         if ( StringUtils.isEmpty( hostname )) {
-            throw new RuntimeException( "No value specified for akka.hostname");
+            throw new RuntimeException( "No value specified for " + AkkaFig.AKKA_HOSTNAME );
         }
 
         if ( StringUtils.isEmpty( currentRegion )) {
-            throw new RuntimeException( "No value specified for akka.region");
+            throw new RuntimeException( "No value specified for " + AkkaFig.AKKA_REGION );
+        }
+
+        if ( StringUtils.isEmpty( akkaFig.getRegionList() )) {
+            throw new RuntimeException( "No value specified for " + AkkaFig.AKKA_REGION_LIST );
+        }
+
+        if ( StringUtils.isEmpty( akkaFig.getRegionSeeds() )) {
+            throw new RuntimeException( "No value specified for " + AkkaFig.AKKA_REGION_SEEDS);
         }
 
         List regionList = Arrays.asList( akkaFig.getRegionList().toLowerCase().split(",") );
 
-        logger.info("Initializing Akka for hostname {} region {} regionList {}", hostname, currentRegion, regionList);
+        logger.info("Initializing Akka for hostname {} region {} regionList {} seeds {}",
+            hostname, currentRegion, regionList, akkaFig.getRegionSeeds() );
 
         String typesValue = akkaFig.getRegionTypes();
         String[] regionTypes = StringUtils.isEmpty( typesValue ) ? new String[0] : typesValue.split(",");
@@ -230,9 +242,13 @@ public class UniqueValuesServiceImpl implements UniqueValuesService {
                 // create cluster singleton supervisor for actor system
                 ClusterSingletonManagerSettings settings =
                         ClusterSingletonManagerSettings.create( system ).withRole("io");
+
+                // Akka.system().actorOf(Props.create(GuiceInjectedActor.class, INJECTOR,Retreiver.class))
+
                 system.actorOf( ClusterSingletonManager.props(
-                        Props.create( ClusterSingletonRouter.class, table ),
-                        PoisonPill.getInstance(), settings ), "uvRouter");
+                    //Props.create( ClusterSingletonRouter.class, table ),
+                    Props.create( GuiceActorProducer.class, injector, ClusterSingletonRouter.class),
+                    PoisonPill.getInstance(), settings ), "uvRouter");
             }
 
             // create proxy for sending messages to singleton
@@ -450,10 +466,12 @@ public class UniqueValuesServiceImpl implements UniqueValuesService {
         } catch ( UniqueValueException e ) {
 
             for (Field field : entity.getFields()) {
-                try {
-                    cancelUniqueField( scope, entity, version, field, region );
-                } catch (Throwable ignored) {
-                    logger.debug( "Error canceling unique field", ignored );
+                if (field.isUnique()) {
+                    try {
+                        cancelUniqueField( scope, entity, version, field, region );
+                    } catch (Throwable ignored) {
+                        logger.debug( "Error canceling unique field", ignored );
+                    }
                 }
             }
             throw e;
@@ -480,10 +498,12 @@ public class UniqueValuesServiceImpl implements UniqueValuesService {
         } catch ( UniqueValueException e ) {
 
             for (Field field : entity.getFields()) {
-                try {
-                    cancelUniqueField( scope, entity, version, field, region) ;
-                } catch (Throwable ignored) {
-                    logger.debug( "Error canceling unique field", ignored );
+                if (field.isUnique()) {
+                    try {
+                        cancelUniqueField( scope, entity, version, field, region );
+                    } catch (Throwable ex ) {
+                        logger.error( "Error canceling unique field", ex );
+                    }
                 }
             }
             throw e;
@@ -546,7 +566,7 @@ public class UniqueValuesServiceImpl implements UniqueValuesService {
             throw new RuntimeException( "No request actor for type, cannot verify unique fields!" );
         }
 
-        UniqueValueActor.Confirmation request = new UniqueValueActor.Confirmation(
+        UniqueValueActor.Cancellation request = new UniqueValueActor.Cancellation(
             scope, entity.getId(), version, field );
 
         requestActor.tell( request, null );