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/09/16 22:34:30 UTC

[01/25] usergrid git commit: Fixing links to point to mirrors.

Repository: usergrid
Updated Branches:
  refs/heads/usergrid-1318-queue [created] 18e4305b9


Fixing links to point to mirrors.


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

Branch: refs/heads/usergrid-1318-queue
Commit: 461076c389ba8413cbbb1b596dba9439af35a8b9
Parents: 87fcf3c
Author: Dave Johnson <sn...@apache.org>
Authored: Fri Sep 2 17:23:15 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Fri Sep 2 17:23:15 2016 -0400

----------------------------------------------------------------------
 content/releases/index.html         | 4 ++--
 website/content/releases/index.html | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/461076c3/content/releases/index.html
----------------------------------------------------------------------
diff --git a/content/releases/index.html b/content/releases/index.html
index fae6c86..ae30b2f 100644
--- a/content/releases/index.html
+++ b/content/releases/index.html
@@ -98,10 +98,10 @@
 					Project releases are approved by vote of the Apache Usergrid Project Management Committee (PMC). Support for a release is provided by project volunteers on the project <a href="http://usergrid.apache.org/community/#mailing-lists">mailing lists</a>. Bugs found in a release may be discussed on the list and reported through the <a href="https://issues.apache.org/jira/browse/USERGRID">issue tracker</a>. The user mailing list and issue tracker are the only support options hosted by the Apache Usergrid project.
 				</p>
 				<p>
-					Note: When downloading from a mirror, please be sure to verify that checksums and signatures are correct. To do so, use the checksum and signature files from the main Apache site at <a href="https://dist.apache.org/repos/dist/release/usergrid/usergrid-2/v2.1.0/">https://dist.apache.org/repos/dist/release/usergrid/usergrid-2/v2.1.0/</a>. Find here the KEYS file, which contains all OpenPGP keys we use to sign releases here: <a href="https://www.apache.org/dist/usergrid/KEYS">https://www.apache.org/dist/usergrid/KEYS</a>
+					Note: When downloading from a mirror, please be sure to verify that checksums and signatures are correct. To do so, use the checksum and signature files from the main Apache site at <a href="https://www.apache.org/dist/release/usergrid/usergrid-2/v2.1.0/">https://www.apache.org/dist/release/usergrid/usergrid-2/v2.1.0/</a>. Find here the KEYS file, which contains all OpenPGP keys we use to sign releases here: <a href="https://www.apache.org/dist/usergrid/KEYS">https://www.apache.org/dist/usergrid/KEYS</a>
 				</p>
 				<p>
-					The PGP signatures can be verified using PGP or GPG. First download the <a href="https://www.apache.org/dist/usergrid/KEYS">KEYS</a> as well as the <a href="https://dist.apache.org/repos/dist/release/usergrid/usergrid-2/v2.1.0/">asc signature</a> file for the particular distribution. Then verify the signatures using:
+					The PGP signatures can be verified using PGP or GPG. First download the <a href="https://www.apache.org/dist/usergrid/KEYS">KEYS</a> as well as the <a href="https://www.apache.org/dist/release/usergrid/usergrid-2/v2.1.0/">asc signature</a> file for the particular distribution. Then verify the signatures using:
 				</p>
 				<p>
        				% pgpk -a KEYS

http://git-wip-us.apache.org/repos/asf/usergrid/blob/461076c3/website/content/releases/index.html
----------------------------------------------------------------------
diff --git a/website/content/releases/index.html b/website/content/releases/index.html
index 6e56cb4..24fbe66 100644
--- a/website/content/releases/index.html
+++ b/website/content/releases/index.html
@@ -31,10 +31,10 @@
 					Project releases are approved by vote of the Apache Usergrid Project Management Committee (PMC). Support for a release is provided by project volunteers on the project <a href="http://usergrid.apache.org/community/#mailing-lists">mailing lists</a>. Bugs found in a release may be discussed on the list and reported through the <a href="https://issues.apache.org/jira/browse/USERGRID">issue tracker</a>. The user mailing list and issue tracker are the only support options hosted by the Apache Usergrid project.
 				</p>
 				<p>
-					Note: When downloading from a mirror, please be sure to verify that checksums and signatures are correct. To do so, use the checksum and signature files from the main Apache site at <a href="https://dist.apache.org/repos/dist/release/usergrid/usergrid-2/v2.1.0/">https://dist.apache.org/repos/dist/release/usergrid/usergrid-2/v2.1.0/</a>. Find here the KEYS file, which contains all OpenPGP keys we use to sign releases here: <a href="https://www.apache.org/dist/usergrid/KEYS">https://www.apache.org/dist/usergrid/KEYS</a>
+					Note: When downloading from a mirror, please be sure to verify that checksums and signatures are correct. To do so, use the checksum and signature files from the main Apache site at <a href="https://www.apache.org/dist/release/usergrid/usergrid-2/v2.1.0/">https://www.apache.org/dist/release/usergrid/usergrid-2/v2.1.0/</a>. Find here the KEYS file, which contains all OpenPGP keys we use to sign releases here: <a href="https://www.apache.org/dist/usergrid/KEYS">https://www.apache.org/dist/usergrid/KEYS</a>
 				</p>
 				<p>
-					The PGP signatures can be verified using PGP or GPG. First download the <a href="https://www.apache.org/dist/usergrid/KEYS">KEYS</a> as well as the <a href="https://dist.apache.org/repos/dist/release/usergrid/usergrid-2/v2.1.0/">asc signature</a> file for the particular distribution. Then verify the signatures using:
+					The PGP signatures can be verified using PGP or GPG. First download the <a href="https://www.apache.org/dist/usergrid/KEYS">KEYS</a> as well as the <a href="https://www.apache.org/dist/release/usergrid/usergrid-2/v2.1.0/">asc signature</a> file for the particular distribution. Then verify the signatures using:
 				</p>
 				<p>
        				% pgpk -a KEYS


[18/25] usergrid git commit: switch Qakka to using two keyspaces, the original replicated Applications one and a new un-replicated Applications Local one

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/impl/TransferLogSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/impl/TransferLogSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/impl/TransferLogSerializationImpl.java
index 5bb06fd..9ebb841 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/impl/TransferLogSerializationImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/impl/TransferLogSerializationImpl.java
@@ -25,6 +25,7 @@ import com.datastax.driver.core.Row;
 import com.datastax.driver.core.Statement;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.google.inject.Inject;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl;
@@ -44,6 +45,7 @@ public class TransferLogSerializationImpl implements TransferLogSerialization {
     private static final Logger logger = LoggerFactory.getLogger( TransferLogSerializationImpl.class );
 
     private final CassandraClient cassandraClient;
+    private final CassandraFig cassandraFig;
 
     public final static String TABLE_TRANSFER_LOG   = "transfer_log";
 
@@ -65,7 +67,8 @@ public class TransferLogSerializationImpl implements TransferLogSerialization {
 
 
     @Inject
-    public TransferLogSerializationImpl( CassandraClient cassandraClient ) {
+    public TransferLogSerializationImpl( CassandraFig cassandraFig,  CassandraClient cassandraClient ) {
+        this.cassandraFig = cassandraFig;
         this.cassandraClient = cassandraClient;
     }
 
@@ -80,7 +83,7 @@ public class TransferLogSerializationImpl implements TransferLogSerialization {
                 .value(COLUMN_DEST_REGION, dest )
                 .value(COLUMN_MESSAGE_ID, messageId )
                 .value(COLUMN_TRANSFER_TIME, System.currentTimeMillis() );
-        cassandraClient.getSession().execute(insert);
+        cassandraClient.getApplicationSession().execute(insert);
 
 //        logger.debug("Recorded transfer log for queue {} dest {} messageId {}",
 //            queueName, dest, messageId);
@@ -95,7 +98,7 @@ public class TransferLogSerializationImpl implements TransferLogSerialization {
             .where(   QueryBuilder.eq( COLUMN_QUEUE_NAME, queueName ))
                 .and( QueryBuilder.eq( COLUMN_DEST_REGION, dest ))
                 .and( QueryBuilder.eq( COLUMN_MESSAGE_ID, messageId ));
-        ResultSet rs = cassandraClient.getSession().execute( query );
+        ResultSet rs = cassandraClient.getApplicationSession().execute( query );
 
         if ( rs.getAvailableWithoutFetching() == 0 ) {
             StringBuilder sb = new StringBuilder();
@@ -109,7 +112,7 @@ public class TransferLogSerializationImpl implements TransferLogSerialization {
                 .where(   QueryBuilder.eq( COLUMN_QUEUE_NAME, queueName ))
                     .and( QueryBuilder.eq( COLUMN_DEST_REGION, dest ))
                 .and( QueryBuilder.eq( COLUMN_MESSAGE_ID, messageId ));
-        cassandraClient.getSession().execute( deleteQuery );
+        cassandraClient.getApplicationSession().execute( deleteQuery );
     }
 
 
@@ -123,7 +126,7 @@ public class TransferLogSerializationImpl implements TransferLogSerialization {
             query.setPagingState( pagingState );
         }
 
-        ResultSet rs = cassandraClient.getSession().execute( query );
+        ResultSet rs = cassandraClient.getApplicationSession().execute( query );
         final PagingState newPagingState = rs.getExecutionInfo().getPagingState();
 
         final List<TransferLog> transferLogs = new ArrayList<>();
@@ -160,7 +163,8 @@ public class TransferLogSerializationImpl implements TransferLogSerialization {
 
     @Override
     public Collection<TableDefinition> getTables() {
-        return Collections.singletonList( new TableDefinitionStringImpl( TABLE_TRANSFER_LOG, CQL ) );
+        return Collections.singletonList(
+            new TableDefinitionStringImpl( cassandraFig.getApplicationKeyspace(), TABLE_TRANSFER_LOG, CQL ) );
     }
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
index 4c3e480..6f1c744 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
@@ -29,6 +29,7 @@ import org.junit.BeforeClass;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
 
@@ -39,11 +40,13 @@ public class AbstractTest {
 
     protected static Injector sharedInjector;
 
+    AtomicBoolean migrated = new AtomicBoolean( false );
+
     static { new KeyspaceDropper(); }
 
 
     public AbstractTest() {
-        if ( getInjector() == null ) {
+        if ( !migrated.getAndSet( true ) ) {
             setInjector( Guice.createInjector( new TestModule() ) );
             MigrationManager migrationManager = getInjector().getInstance( MigrationManager.class );
             try {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/KeyspaceDropper.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/KeyspaceDropper.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/KeyspaceDropper.java
index aa4dfd1..e220650 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/KeyspaceDropper.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/KeyspaceDropper.java
@@ -33,13 +33,13 @@ import java.util.Properties;
  * Created by Dave Johnson (snoopdave@apache.org) on 9/9/16.
  */
 public class KeyspaceDropper {
-    
+
     private static final Logger logger = LoggerFactory.getLogger( AbstractTest.class );
-    
-    static { dropTestKeyspace(); }
 
-    
-    public static void dropTestKeyspace() {
+    static { dropTestKeyspaces(); }
+
+
+    public static void dropTestKeyspaces() {
 
         String propsFileName = "qakka.properties";
 
@@ -50,10 +50,17 @@ public class KeyspaceDropper {
             throw new RuntimeException( "Unable to load " + propsFileName + " file!" );
         }
 
-        String keyspace =     (String)props.get("cassandra.keyspace.application");
+        String keyspaceApp =     (String)props.get("cassandra.keyspace.application");
+        String keyspaceQueue =     (String)props.get("cassandra.keyspace.queue-message");
         String hosts[] =              props.getProperty( "cassandra.hosts", "127.0.0.1" ).split(",");
         int port = Integer.parseInt(  props.getProperty( "cassandra.port", "9042" ));
 
+        dropTestKeyspace( keyspaceApp, hosts, port );
+        dropTestKeyspace( keyspaceQueue, hosts, port );
+    }
+
+    public static void dropTestKeyspace( String keyspace, String[] hosts, int port ) {
+
         Cluster.Builder builder = Cluster.builder();
         for ( String host : hosts ) {
             builder = builder.addContactPoint( host ).withPort( port );
@@ -67,4 +74,5 @@ public class KeyspaceDropper {
         logger.info("Dropping test keyspace: {}", keyspace);
         session.execute( "DROP KEYSPACE IF EXISTS " + keyspace );
     }
+
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/common/CassandraClientTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/common/CassandraClientTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/common/CassandraClientTest.java
index 42423fa..e1f0c7e 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/common/CassandraClientTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/common/CassandraClientTest.java
@@ -30,13 +30,13 @@ import org.junit.Test;
  * Created by russo on 6/8/16.
  */
 public class CassandraClientTest extends AbstractTest {
-    
+
     @Test
     public void getClient(){
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
 
-        Session session = cassandraClient.getSession();
+        Session session = cassandraClient.getApplicationSession();
 
         session.getLoggedKeyspace();
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
index 5a0feba..630c953 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
@@ -26,14 +26,13 @@ import com.google.inject.Injector;
 import net.jcip.annotations.NotThreadSafe;
 import org.apache.commons.lang.RandomStringUtils;
 import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
-import org.apache.usergrid.persistence.qakka.QakkaFig;
-import org.apache.usergrid.persistence.qakka.core.impl.InMemoryQueue;
-import org.apache.usergrid.persistence.qakka.serialization.Result;
 import org.apache.usergrid.persistence.qakka.AbstractTest;
 import org.apache.usergrid.persistence.qakka.App;
-import org.apache.usergrid.persistence.qakka.QakkaModule;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.core.impl.InMemoryQueue;
 import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
 import org.apache.usergrid.persistence.qakka.exceptions.QakkaRuntimeException;
+import org.apache.usergrid.persistence.qakka.serialization.Result;
 import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLog;
 import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLogSerialization;
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
@@ -42,8 +41,8 @@ import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMe
 import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLog;
 import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLogSerialization;
 import org.apache.usergrid.persistence.queue.TestModule;
-import org.junit.AfterClass;
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -74,7 +73,6 @@ public class QueueMessageManagerTest extends AbstractTest {
         Injector injector = getInjector();
 
         CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
         DistributedQueueService distributedQueueService = injector.getInstance( DistributedQueueService.class );
         ActorSystemFig actorSystemFig = injector.getInstance( ActorSystemFig.class );
@@ -136,12 +134,12 @@ public class QueueMessageManagerTest extends AbstractTest {
 
 
     @Test
+    @Ignore
     public void testQueueMessageTimeouts() throws Exception {
 
         Injector injector = getInjector();
 
         CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
         DistributedQueueService distributedQueueService = injector.getInstance( DistributedQueueService.class );
         QakkaFig qakkaFig             = injector.getInstance( QakkaFig.class );
@@ -225,12 +223,12 @@ public class QueueMessageManagerTest extends AbstractTest {
 
 
     @Test
+    @Ignore
     public void testGetWithMissingData() throws InterruptedException {
 
         Injector injector = getInjector();
 
         CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
         injector.getInstance( App.class ); // init the INJECTOR
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
index 182d5d6..a46c186 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
@@ -66,7 +66,6 @@ public class QueueActorServiceTest extends AbstractTest {
         Injector injector = getInjector();
 
         CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
         ActorSystemFig actorSystemFig = injector.getInstance( ActorSystemFig.class );
         String region = actorSystemFig.getRegionLocal();
@@ -119,7 +118,6 @@ public class QueueActorServiceTest extends AbstractTest {
         Injector injector = getInjector();
 
         CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
         ActorSystemFig actorSystemFig = injector.getInstance( ActorSystemFig.class );
         String region = actorSystemFig.getRegionLocal();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
index 77c11e4..3bf352f 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
@@ -21,26 +21,26 @@ package org.apache.usergrid.persistence.qakka.distributed.actors;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
+import net.jcip.annotations.NotThreadSafe;
 import org.apache.commons.lang.RandomStringUtils;
 import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
 import org.apache.usergrid.persistence.qakka.AbstractTest;
 import org.apache.usergrid.persistence.qakka.App;
-import org.apache.usergrid.persistence.qakka.QakkaModule;
 import org.apache.usergrid.persistence.qakka.core.*;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
 import org.apache.usergrid.persistence.qakka.serialization.Result;
 import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLog;
 import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLogSerialization;
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
-import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
 import org.apache.usergrid.persistence.queue.TestModule;
-import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Test;
 
 import java.util.UUID;
 
 
+@NotThreadSafe
 public class QueueActorHelperTest extends AbstractTest {
 
 
@@ -54,7 +54,6 @@ public class QueueActorHelperTest extends AbstractTest {
 
         Injector injector = getInjector();
         CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
         injector.getInstance( App.class ); // init the INJECTOR
 
@@ -102,7 +101,6 @@ public class QueueActorHelperTest extends AbstractTest {
 
         Injector injector = getInjector();
         CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
 
         injector.getInstance( App.class ); // init the INJECTOR
@@ -136,7 +134,6 @@ public class QueueActorHelperTest extends AbstractTest {
 
         Injector injector = getInjector();
         CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
 
         injector.getInstance( App.class ); // init the INJECTOR
@@ -208,7 +205,6 @@ public class QueueActorHelperTest extends AbstractTest {
 
         Injector injector = getInjector();
         CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
 
         injector.getInstance( App.class ); // init the INJECTOR
@@ -272,7 +268,6 @@ public class QueueActorHelperTest extends AbstractTest {
 
         Injector injector = getInjector();
         CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
 
         injector.getInstance( App.class ); // init the INJECTOR

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueReaderTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueReaderTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueReaderTest.java
index b803f7e..0b8b795 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueReaderTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueReaderTest.java
@@ -53,7 +53,6 @@ public class QueueReaderTest extends AbstractTest {
     public void testBasicOperation() throws Exception {
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
 
         getInjector().getInstance( App.class ); // init the INJECTOR

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouterTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouterTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouterTest.java
index 511b059..54f9d42 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouterTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouterTest.java
@@ -38,6 +38,7 @@ import org.apache.usergrid.persistence.qakka.core.QakkaUtils;
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,12 +52,12 @@ import java.util.UUID;
 public class QueueTimeouterTest extends AbstractTest {
     private static final Logger logger = LoggerFactory.getLogger( QueueTimeouterTest.class );
 
-    
+
     @Test
+    @Ignore
     public void testBasicOperation() throws Exception {
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
         getInjector().getInstance( App.class ); // init the INJECTOR
 
@@ -64,12 +65,12 @@ public class QueueTimeouterTest extends AbstractTest {
         ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
         QueueMessageSerialization qms = getInjector().getInstance( QueueMessageSerialization.class );
         ShardSerialization shardSerialization = getInjector().getInstance( ShardSerialization.class );
-        
-        // create records in inflight table, with some being old enough to time out 
+
+        // create records in inflight table, with some being old enough to time out
 
         int numInflight = 200; // number of messages to be put into timeout table
         int numTimedout = 75;  // number of messages to be timedout
-        
+
         long timeoutMs = qakkaFig.getQueueTimeoutSeconds()*1000;
 
         String queueName = "qtt_queue_" + RandomStringUtils.randomAlphanumeric( 20 );
@@ -83,12 +84,12 @@ public class QueueTimeouterTest extends AbstractTest {
         shardSerialization.createShard( newShard );
 
         for ( int i=0; i<numInflight; i++ ) {
-           
+
             long created = System.currentTimeMillis();
             created = i < numTimedout ? created - timeoutMs: created + timeoutMs;
 
             UUID queueMessageId = QakkaUtils.getTimeUuid();
-            
+
             UUID messageId = QakkaUtils.getTimeUuid();
             DatabaseQueueMessage message = new DatabaseQueueMessage(
                     messageId,
@@ -99,32 +100,32 @@ public class QueueTimeouterTest extends AbstractTest {
                     created,
                     created,
                     queueMessageId );
-            
+
             qms.writeMessage( message );
         }
 
-        List<DatabaseQueueMessage> inflightMessages = getDatabaseQueueMessages( 
+        List<DatabaseQueueMessage> inflightMessages = getDatabaseQueueMessages(
                 cassandraClient, queueName, actorSystemFig.getRegionLocal(), Shard.Type.INFLIGHT );
         Assert.assertEquals( numInflight, inflightMessages.size() );
-        
+
         // run timeouter actor
 
         ActorSystem system = ActorSystem.create("Test-" + queueName);
         ActorRef timeouterRef = system.actorOf( Props.create( QueueTimeouter.class, queueName ), "timeouter");
         QueueTimeoutRequest qtr = new QueueTimeoutRequest( queueName );
         timeouterRef.tell( qtr, null ); // tell sends message, returns immediately
-        
+
         Thread.sleep( timeoutMs );
 
         // timed out messages should have been moved into available (DEFAULT) table
-        
-        List<DatabaseQueueMessage> queuedMessages = getDatabaseQueueMessages( 
+
+        List<DatabaseQueueMessage> queuedMessages = getDatabaseQueueMessages(
                 cassandraClient, queueName, actorSystemFig.getRegionLocal(), Shard.Type.DEFAULT);
         Assert.assertEquals( numTimedout, queuedMessages.size() );
 
         // and there should still be some messages in the INFLIGHT table
 
-        inflightMessages = getDatabaseQueueMessages( 
+        inflightMessages = getDatabaseQueueMessages(
                 cassandraClient, queueName, actorSystemFig.getRegionLocal(), Shard.Type.INFLIGHT );
         Assert.assertEquals( numInflight - numTimedout, inflightMessages.size() );
 
@@ -132,13 +133,13 @@ public class QueueTimeouterTest extends AbstractTest {
 
     private List<DatabaseQueueMessage> getDatabaseQueueMessages(
             CassandraClient cassandraClient, String queueName, String region, Shard.Type type ) {
-        
+
         ShardIterator shardIterator = new ShardIterator(
                 cassandraClient, queueName, region, type, Optional.empty() );
 
         DatabaseQueueMessage.Type dbqmType = Shard.Type.DEFAULT.equals( type ) ?
                 DatabaseQueueMessage.Type.DEFAULT : DatabaseQueueMessage.Type.INFLIGHT;
-        
+
         MultiShardMessageIterator multiShardIterator = new MultiShardMessageIterator(
                 cassandraClient, queueName, region, dbqmType, shardIterator, null);
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
index d486c80..ae62c89 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
@@ -42,6 +42,7 @@ import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService
 import org.apache.usergrid.persistence.queue.TestModule;
 import org.junit.AfterClass;
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -66,7 +67,6 @@ public class ShardAllocatorTest extends AbstractTest {
         Injector injector = getInjector();
 
         CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
         injector.getInstance( App.class ); // init the INJECTOR
 
@@ -163,12 +163,12 @@ public class ShardAllocatorTest extends AbstractTest {
 
 
     @Test
+    @Ignore
     public void testBasicOperationWithMessages() throws InterruptedException {
 
         Injector injector = getInjector();
 
         CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
         injector.getInstance( App.class ); // init the INJECTOR
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardDatabaseQueueMessageIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardDatabaseQueueMessageIteratorTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardDatabaseQueueMessageIteratorTest.java
index 76e3279..2d8da6d 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardDatabaseQueueMessageIteratorTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardDatabaseQueueMessageIteratorTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.usergrid.persistence.qakka.serialization;
 
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
 import org.apache.usergrid.persistence.qakka.AbstractTest;
 import org.apache.usergrid.persistence.qakka.core.CassandraClient;
@@ -44,17 +45,17 @@ import static org.junit.Assert.assertEquals;
 public class MultiShardDatabaseQueueMessageIteratorTest extends AbstractTest {
     private static final Logger logger = LoggerFactory.getLogger( MultiShardDatabaseQueueMessageIteratorTest.class );
 
-    
+
     @Test
     public void testIterator() throws InterruptedException {
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        CassandraFig cassandraFig = getInjector().getInstance( CassandraFig.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraFig, cassandraClient );
 
-        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
-        
         QueueMessageSerialization queueMessageSerialization =
                 getInjector().getInstance( QueueMessageSerialization.class );
-        
+
         Shard shard1 = new Shard("test", "region", Shard.Type.DEFAULT, 1L, null);
         Shard shard2 = new Shard("test", "region", Shard.Type.DEFAULT, 2L, null);
         Shard shard3 = new Shard("test", "region", Shard.Type.DEFAULT, 3L, null);
@@ -71,7 +72,7 @@ public class MultiShardDatabaseQueueMessageIteratorTest extends AbstractTest {
         for(int i=0; i < numMessagesPerShard; i++){
 
             queueMessageSerialization.writeMessage( new DatabaseQueueMessage(QakkaUtils.getTimeUuid(),
-                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard1.getShardId(), 
+                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard1.getShardId(),
                     System.currentTimeMillis(), null, null));
             Thread.sleep(3);
         }
@@ -79,7 +80,7 @@ public class MultiShardDatabaseQueueMessageIteratorTest extends AbstractTest {
         for(int i=0; i < numMessagesPerShard; i++){
 
             queueMessageSerialization.writeMessage( new DatabaseQueueMessage(QakkaUtils.getTimeUuid(),
-                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard2.getShardId(), 
+                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard2.getShardId(),
                     System.currentTimeMillis(), null, null));
             Thread.sleep(3);
         }
@@ -87,7 +88,7 @@ public class MultiShardDatabaseQueueMessageIteratorTest extends AbstractTest {
         for(int i=0; i < numMessagesPerShard; i++){
 
             queueMessageSerialization.writeMessage( new DatabaseQueueMessage(QakkaUtils.getTimeUuid(),
-                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard3.getShardId(), 
+                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard3.getShardId(),
                     System.currentTimeMillis(), null, null));
             Thread.sleep(3);
         }
@@ -95,7 +96,7 @@ public class MultiShardDatabaseQueueMessageIteratorTest extends AbstractTest {
         for(int i=0; i < numMessagesPerShard; i++){
 
             queueMessageSerialization.writeMessage( new DatabaseQueueMessage(QakkaUtils.getTimeUuid(),
-                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard4.getShardId(), 
+                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard4.getShardId(),
                     System.currentTimeMillis(), null, null));
             Thread.sleep(3);
         }
@@ -103,12 +104,12 @@ public class MultiShardDatabaseQueueMessageIteratorTest extends AbstractTest {
 
         ShardIterator shardIterator = new ShardIterator(
                 cassandraClient, "test", "region", Shard.Type.DEFAULT, Optional.empty());
-        MultiShardMessageIterator iterator = new MultiShardMessageIterator( 
+        MultiShardMessageIterator iterator = new MultiShardMessageIterator(
                 cassandraClient, "test", "region", DatabaseQueueMessage.Type.DEFAULT, shardIterator, null);
 
-        final AtomicInteger[] counts = { 
+        final AtomicInteger[] counts = {
                 new AtomicInteger(0), new AtomicInteger(0), new AtomicInteger(0), new AtomicInteger(0) };
-        
+
         iterator.forEachRemaining(message -> {
             //logger.info("Shard ID: {}, DatabaseQueueMessage ID: {}", message.getShardId(), message.getMessageId());
             counts[ (int)(message.getShardId() - 1) ] .incrementAndGet();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/auditlogs/AuditLogSerializationTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/auditlogs/AuditLogSerializationTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/auditlogs/AuditLogSerializationTest.java
index 072fd94..4d60772 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/auditlogs/AuditLogSerializationTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/auditlogs/AuditLogSerializationTest.java
@@ -39,7 +39,6 @@ public class AuditLogSerializationTest extends AbstractTest {
     public void testRecordAuditLog() throws Exception {
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
         AuditLogSerialization logSerialization = getInjector().getInstance( AuditLogSerialization.class );
 
@@ -48,10 +47,10 @@ public class AuditLogSerializationTest extends AbstractTest {
         String queueName = "alst_queue_" + RandomStringUtils.randomAlphanumeric( 15 );
         String source = RandomStringUtils.randomAlphanumeric( 15 );
         String dest = RandomStringUtils.randomAlphanumeric( 15 );
-        
-        logSerialization.recordAuditLog( AuditLog.Action.GET, AuditLog.Status.SUCCESS, 
+
+        logSerialization.recordAuditLog( AuditLog.Action.GET, AuditLog.Status.SUCCESS,
             queueName, dest, messageId, UUIDGen.getTimeUUID() );
-           
+
         // get audit logs for that message
         Result<AuditLog> result = logSerialization.getAuditLogs( messageId );
         Assert.assertEquals( 1, result.getEntities().size() );
@@ -61,8 +60,6 @@ public class AuditLogSerializationTest extends AbstractTest {
     public void testGetAuditLogs() throws Exception {
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
-
 
         AuditLogSerialization logSerialization = getInjector().getInstance( AuditLogSerialization.class );
 
@@ -73,14 +70,14 @@ public class AuditLogSerializationTest extends AbstractTest {
         String dest = RandomStringUtils.randomAlphanumeric( 15 );
 
         int numLogs = 10;
-        
+
         UUID queueMessageId1 = UUIDGen.getTimeUUID();
         for ( int i=0; i<numLogs; i++ ) {
             logSerialization.recordAuditLog( AuditLog.Action.GET, AuditLog.Status.SUCCESS,
                     queueName, dest, messageId, queueMessageId1 );
-            Thread.sleep(5); 
+            Thread.sleep(5);
         }
-        
+
         UUID queueMessageId2 = UUIDGen.getTimeUUID();
         for ( int i=0; i<numLogs; i++ ) {
             logSerialization.recordAuditLog( AuditLog.Action.GET, AuditLog.Status.SUCCESS,
@@ -99,4 +96,4 @@ public class AuditLogSerializationTest extends AbstractTest {
         Result<AuditLog> result = logSerialization.getAuditLogs( messageId );
         Assert.assertEquals( numLogs * 3, result.getEntities().size() );
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueueSerializationTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueueSerializationTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueueSerializationTest.java
index e50bae5..2100c80 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueueSerializationTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueueSerializationTest.java
@@ -36,7 +36,6 @@ public class DatabaseQueueSerializationTest extends AbstractTest {
     public void writeQueue(){
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
         QueueSerialization queueSerialization = getInjector().getInstance( QueueSerialization.class );
 
         DatabaseQueue queue = new DatabaseQueue("test", "west", "west", 0L, 0, 0, "test_dlq");
@@ -51,7 +50,6 @@ public class DatabaseQueueSerializationTest extends AbstractTest {
     public void loadQueue(){
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
         QueueSerialization queueSerialization = getInjector().getInstance( QueueSerialization.class );
 
         DatabaseQueue queue = new DatabaseQueue("test1", "west", "west", 0L, 0, 0, "test_dlq");
@@ -68,7 +66,6 @@ public class DatabaseQueueSerializationTest extends AbstractTest {
     public void deleteQueue(){
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
         QueueSerialization queueSerialization = getInjector().getInstance( QueueSerialization.class );
 
         DatabaseQueue queue = new DatabaseQueue("test1", "west", "west", 0L, 0, 0, "test_dlq");

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardCounterSerializationTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardCounterSerializationTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardCounterSerializationTest.java
index 3152025..f9c2951 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardCounterSerializationTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardCounterSerializationTest.java
@@ -32,34 +32,33 @@ import static org.junit.Assert.fail;
 
 public class ShardCounterSerializationTest extends AbstractTest {
 
-    
+
     @Test
     public void testBasicOperation() throws Exception {
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
 
-        ShardCounterSerialization scs = getInjector().getInstance( ShardCounterSerialization.class ); 
-       
+        ShardCounterSerialization scs = getInjector().getInstance( ShardCounterSerialization.class );
+
         String queueName = "scst_queue_" + RandomStringUtils.randomAlphanumeric( 20 );
         long shardId = 100L;
-       
+
         try {
             scs.getCounterValue( queueName, Shard.Type.DEFAULT, shardId );
             fail("Should have throw NotFoundException");
         } catch ( NotFoundException expected ) {
-            // pass 
+            // pass
         }
 
         scs.incrementCounter( queueName, Shard.Type.DEFAULT, shardId, 10 );
         Assert.assertEquals( 10, scs.getCounterValue( queueName, Shard.Type.DEFAULT, shardId ) );
-        
+
         scs.incrementCounter( queueName, Shard.Type.DEFAULT, shardId, 50 );
         Assert.assertEquals( 60, scs.getCounterValue( queueName, Shard.Type.DEFAULT, shardId ) );
-        
+
         scs.incrementCounter( queueName, Shard.Type.DEFAULT, shardId, 150 );
         Assert.assertEquals( 210, scs.getCounterValue( queueName, Shard.Type.DEFAULT, shardId ) );
     }
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIteratorTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIteratorTest.java
index 572c897..fb0a46e 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIteratorTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIteratorTest.java
@@ -20,6 +20,7 @@
 package org.apache.usergrid.persistence.qakka.serialization.sharding;
 
 import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
 import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardSerializationImpl;
 import org.apache.usergrid.persistence.qakka.AbstractTest;
@@ -46,7 +47,8 @@ public class ShardIteratorTest extends AbstractTest {
     public void getActiveShards(){
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
+        CassandraFig cassandraFig = getInjector().getInstance( CassandraFig.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraFig, cassandraClient );
 
         Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
         Shard shard2 = new Shard("test", "region1", Shard.Type.DEFAULT, 200L, null);
@@ -76,8 +78,9 @@ public class ShardIteratorTest extends AbstractTest {
     public void seekActiveShards(){
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
-        
+        CassandraFig cassandraFig = getInjector().getInstance( CassandraFig.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraFig, cassandraClient );
+
         Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
         Shard shard2 = new Shard("test", "region1", Shard.Type.DEFAULT, 200L, null);
         Shard shard3 = new Shard("test", "region1", Shard.Type.DEFAULT, 300L, null);
@@ -107,21 +110,22 @@ public class ShardIteratorTest extends AbstractTest {
     public void shardIteratorOrdering() throws Exception {
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
+        CassandraFig cassandraFig = getInjector().getInstance( CassandraFig.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraFig, cassandraClient );
 
         int numShards = 10;
         String region = "default";
         String queueName = "sit_queue_" + RandomStringUtils.randomAlphanumeric(20);
-        
+
         for ( long i=0; i<numShards; i++) {
             UUID messageId = QakkaUtils.getTimeUuid();
             Shard shard = new Shard( queueName, region, Shard.Type.DEFAULT, i+1, messageId );
             shardSerialization.createShard( shard );
             try { Thread.sleep(10); } catch (Exception intentionallyIgnored) {}
         }
-        
+
         Iterator<Shard> shardIterator = new ShardIterator(
-                cassandraClient, queueName, region, Shard.Type.DEFAULT, Optional.empty()); 
+                cassandraClient, queueName, region, Shard.Type.DEFAULT, Optional.empty());
 
         int count = 0;
         Long prevTimestamp = null;
@@ -133,7 +137,7 @@ public class ShardIteratorTest extends AbstractTest {
             prevTimestamp = shard.getPointer().timestamp();
             count++;
         }
-        
+
         Assert.assertEquals( numShards, count );
     }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardSerializationTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardSerializationTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardSerializationTest.java
index e1a541b..e67db28 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardSerializationTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardSerializationTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.usergrid.persistence.qakka.serialization.sharding;
 
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
 import org.apache.usergrid.persistence.qakka.AbstractTest;
 import org.apache.usergrid.persistence.qakka.core.CassandraClient;
@@ -46,7 +47,8 @@ public class ShardSerializationTest extends AbstractTest {
     public void writeNewShard(){
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
+        CassandraFig cassandraFig = getInjector().getInstance( CassandraFig.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraFig, cassandraClient );
 
         Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
         shardSerialization.createShard(shard1);
@@ -56,7 +58,8 @@ public class ShardSerializationTest extends AbstractTest {
     public void deleteShard(){
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
+        CassandraFig cassandraFig = getInjector().getInstance( CassandraFig.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraFig, cassandraClient );
 
         Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
 
@@ -72,7 +75,8 @@ public class ShardSerializationTest extends AbstractTest {
     public void loadNullShard(){
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
+        CassandraFig cassandraFig = getInjector().getInstance( CassandraFig.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraFig, cassandraClient );
 
         Shard shard1 = new Shard("junk", "region1", Shard.Type.DEFAULT, 100L, null);
 
@@ -86,8 +90,9 @@ public class ShardSerializationTest extends AbstractTest {
     public void updatePointer(){
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
-        
+        CassandraFig cassandraFig = getInjector().getInstance( CassandraFig.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraFig, cassandraClient );
+
         Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
         shardSerialization.createShard(shard1);
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardStrategyTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardStrategyTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardStrategyTest.java
index ea73abc..7338a42 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardStrategyTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardStrategyTest.java
@@ -41,7 +41,6 @@ public class ShardStrategyTest extends AbstractTest {
     public void testBasicOperation() {
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
 
         ShardSerialization shardSer   = getInjector().getInstance( ShardSerialization.class );
@@ -49,7 +48,7 @@ public class ShardStrategyTest extends AbstractTest {
 
         UUID messageIdToLocate = null;
         long selectedShardId = 4L;
-        
+
         int numShards = 10;
         String region = "default";
         String queueName = "sst_queue_" + RandomStringUtils.randomAlphanumeric(20);
@@ -66,6 +65,6 @@ public class ShardStrategyTest extends AbstractTest {
         Shard selectedShard = shardStrategy.selectShard( queueName, region, Shard.Type.DEFAULT, messageIdToLocate );
 
         Assert.assertEquals( selectedShardId, selectedShard.getShardId() );
-        
+
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLogSerializationTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLogSerializationTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLogSerializationTest.java
index 20b72b0..306dfee 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLogSerializationTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLogSerializationTest.java
@@ -42,16 +42,15 @@ public class TransferLogSerializationTest extends AbstractTest {
     public void recordTransferLog() throws Exception {
 
         TransferLogSerialization logSerialization = getInjector().getInstance( TransferLogSerialization.class );
-        
+
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
         String queueName = "tlst_queue_" + RandomStringUtils.randomAlphanumeric( 15 );
         String source = RandomStringUtils.randomAlphanumeric( 15 );
         String dest = RandomStringUtils.randomAlphanumeric( 15 );
-        
+
         int numLogs = 100;
-        
+
         for ( int i=0; i<numLogs; i++ ) {
             logSerialization.recordTransferLog( queueName, source, dest, UUIDGen.getTimeUUID());
         }
@@ -60,9 +59,9 @@ public class TransferLogSerializationTest extends AbstractTest {
         int fetchCount = 0;
         PagingState pagingState = null;
         while ( true ) {
-            
+
             Result<TransferLog> all = logSerialization.getAllTransferLogs( pagingState, 10 );
-                   
+
             // we only want entities for our queue
             List<TransferLog> logs = all.getEntities().stream()
                 .filter( log -> log.getQueueName().equals( queueName ) ).collect( Collectors.toList() );
@@ -71,7 +70,7 @@ public class TransferLogSerializationTest extends AbstractTest {
             fetchCount++;
             if ( all.getPagingState() == null ) {
                 break;
-            } 
+            }
             pagingState = all.getPagingState();
         }
 
@@ -84,8 +83,7 @@ public class TransferLogSerializationTest extends AbstractTest {
         TransferLogSerialization logSerialization = getInjector().getInstance( TransferLogSerialization.class );
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession(); 
-        
+
         String queueName = "tlst_queue_" + RandomStringUtils.randomAlphanumeric( 15 );
         String source = RandomStringUtils.randomAlphanumeric( 15 );
         String dest = RandomStringUtils.randomAlphanumeric( 15 );
@@ -101,16 +99,16 @@ public class TransferLogSerializationTest extends AbstractTest {
         Assert.assertEquals( 1, logs.size());
 
         logSerialization.removeTransferLog( queueName, source, dest, messageId );
-        
+
         List<TransferLog> all = getTransferLogs( logSerialization );
         logs = all.stream()
             .filter( log -> log.getQueueName().equals( queueName ) ).collect( Collectors.toList() );
         Assert.assertEquals( 0, logs.size());
-        
+
         try {
             logSerialization.removeTransferLog( queueName, source, dest, messageId );
             Assert.fail("Removing non-existent log should throw exception");
-            
+
         } catch ( QakkaException expected ) {
             // success!
         }
@@ -130,4 +128,4 @@ public class TransferLogSerializationTest extends AbstractTest {
         return allLogs;
     }
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
index bc01b23..5800bba 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
@@ -25,11 +25,9 @@ import com.google.inject.Injector;
 import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
 import org.apache.usergrid.persistence.qakka.AbstractTest;
 import org.apache.usergrid.persistence.qakka.App;
-import org.apache.usergrid.persistence.qakka.QakkaModule;
 import org.apache.usergrid.persistence.qakka.core.CassandraClient;
 import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
 import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
-import org.apache.usergrid.persistence.queue.guice.QueueModule;
 import org.apache.usergrid.persistence.queue.impl.LegacyQueueScopeImpl;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -60,7 +58,6 @@ public class LegacyQueueManagerTest extends AbstractTest {
         Injector myInjector = getInjector();
 
         CassandraClient cassandraClient = myInjector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
         ActorSystemFig actorSystemFig = myInjector.getInstance( ActorSystemFig.class );
         String region = actorSystemFig.getRegionLocal();
@@ -99,7 +96,6 @@ public class LegacyQueueManagerTest extends AbstractTest {
         Injector myInjector = getInjector();
 
         CassandraClient cassandraClient = myInjector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
         ActorSystemFig actorSystemFig = myInjector.getInstance( ActorSystemFig.class );
         String region = actorSystemFig.getRegionLocal();
@@ -142,7 +138,6 @@ public class LegacyQueueManagerTest extends AbstractTest {
         Injector myInjector = getInjector();
 
         CassandraClient cassandraClient = myInjector.getInstance( CassandraClientImpl.class );
-        cassandraClient.getSession();
 
         ActorSystemFig actorSystemFig = myInjector.getInstance( ActorSystemFig.class );
         String region = actorSystemFig.getRegionLocal();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/test/resources/qakka.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/resources/qakka.properties b/stack/corepersistence/queue/src/test/resources/qakka.properties
index c62b0df..9140637 100644
--- a/stack/corepersistence/queue/src/test/resources/qakka.properties
+++ b/stack/corepersistence/queue/src/test/resources/qakka.properties
@@ -34,19 +34,25 @@ usergrid.cluster.seeds=us-east:localhost
 # Port used for cluster communications.
 usergrid.cluster.port=2551
 
-queue.sender.num.actors=10
-queue.writer.num.actors=10
-queue.num.actors=10
+queue.sender.num.actors=20
+queue.writer.num.actors=20
+queue.num.actors=20
 
 # set shard size and times low for testing purposes
 queue.shard.max.size=500
-queue.shard.allocation.check.frequency.millis=100
-queue.shard.allocation.advance.time.millis=200
+queue.shard.allocation.check.frequency.millis=1000
+queue.shard.allocation.advance.time.millis=2000
+queue.refresh.millis=1000
 
 queue.max.inmemory.shard.counter = 100
 
+cassandra.connections=10
+#cassandra.timeout=20000
+
 cassandra.hosts=localhost
 
-cassandra.keyspace.application=qakka_test
+cassandra.keyspace.application=qakka_test_application
+
+cassandra.keyspace.queue-message=qakka_test_queue_messages
 
 cassandra.keyspace-drop-and-create=true


[11/25] usergrid git commit: Initial integration of Qakka into Usergrid Queue module, and implementation of Qakka-based LegacyQueueManager implementation.

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouter.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouter.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouter.java
new file mode 100644
index 0000000..fcd2161
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouter.java
@@ -0,0 +1,147 @@
+/*
+ * 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.qakka.distributed.actors;
+
+import akka.actor.UntypedActor;
+import com.codahale.metrics.Timer;
+import com.google.inject.Injector;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.MetricsService;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.core.QakkaUtils;
+import org.apache.usergrid.persistence.qakka.distributed.messages.QueueTimeoutRequest;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaRuntimeException;
+import org.apache.usergrid.persistence.qakka.serialization.MultiShardMessageIterator;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardIterator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Optional;
+import java.util.UUID;
+
+
+public class QueueTimeouter extends UntypedActor {
+    private static final Logger logger = LoggerFactory.getLogger( QueueTimeouter.class );
+
+    private final String                    queueName;
+
+    private final QueueMessageSerialization messageSerialization;
+    private final MetricsService            metricsService;
+    private final ActorSystemFig            actorSystemFig;
+    private final QakkaFig qakkaFig;
+    private final CassandraClient           cassandraClient;
+
+
+    public QueueTimeouter(String queueName ) {
+        this.queueName = queueName;
+
+        Injector injector = App.INJECTOR;
+
+        messageSerialization = injector.getInstance( QueueMessageSerialization.class );
+        actorSystemFig       = injector.getInstance( ActorSystemFig.class );
+        qakkaFig             = injector.getInstance( QakkaFig.class );
+        metricsService       = injector.getInstance( MetricsService.class );
+        cassandraClient      = injector.getInstance( CassandraClientImpl.class );
+    }
+
+
+    @Override
+    public void onReceive(Object message) {
+
+        if ( message instanceof QueueTimeoutRequest) {
+
+            Timer.Context timer = metricsService.getMetricRegistry().timer( MetricsService.TIMEOUT_TIME).time();
+
+            try {
+
+                QueueTimeoutRequest request = (QueueTimeoutRequest) message;
+
+                if (!request.getQueueName().equals( queueName )) {
+                    throw new QakkaRuntimeException(
+                            "QueueTimeouter for " + queueName + ": Incorrect queueName " + request.getQueueName() );
+                }
+
+                //logger.debug("Processing timeouts for queue {} ", queueName );
+
+                int count = 0;
+                String region = actorSystemFig.getRegionLocal();
+
+                ShardIterator shardIterator = new ShardIterator(
+                        cassandraClient, queueName, region, Shard.Type.INFLIGHT, Optional.empty());
+
+                MultiShardMessageIterator multiShardIteratorInflight = new MultiShardMessageIterator(
+                        cassandraClient, queueName, region, DatabaseQueueMessage.Type.INFLIGHT, shardIterator, null);
+
+                while ( multiShardIteratorInflight.hasNext() ) {
+
+                    DatabaseQueueMessage queueMessage = multiShardIteratorInflight.next();
+
+                    long currentTime = System.currentTimeMillis();
+
+                    if ((currentTime - queueMessage.getInflightAt()) > qakkaFig.getQueueTimeoutSeconds() * 1000) {
+
+                        // put message back in messages_available table as new queue message with new UUID
+
+                        UUID newQueueMessageId = QakkaUtils.getTimeUuid();
+
+                        DatabaseQueueMessage newMessage = new DatabaseQueueMessage(
+                                queueMessage.getMessageId(),
+                                DatabaseQueueMessage.Type.DEFAULT,
+                                queueMessage.getQueueName(),
+                                queueMessage.getRegion(),
+                                null,
+                                queueMessage.getQueuedAt(),
+                                queueMessage.getInflightAt(),
+                                newQueueMessageId );
+
+                        messageSerialization.writeMessage( newMessage );
+
+                        // remove message from inflight table
+
+                        messageSerialization.deleteMessage(
+                                queueName,
+                                actorSystemFig.getRegionLocal(),
+                                null,
+                                DatabaseQueueMessage.Type.INFLIGHT,
+                                queueMessage.getQueueMessageId() );
+
+                        count++;
+                    }
+                }
+
+                if (count > 0) {
+                    logger.debug( "Timed out {} messages for queue {}", count, queueName );
+                }
+
+            } finally {
+                timer.close();
+            }
+
+        } else {
+            unhandled( message );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueWriter.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueWriter.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueWriter.java
new file mode 100644
index 0000000..6c91eb0
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueWriter.java
@@ -0,0 +1,152 @@
+/*
+ * 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.qakka.distributed.actors;
+
+import akka.actor.UntypedActor;
+import com.codahale.metrics.Timer;
+import com.google.inject.Injector;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.MetricsService;
+import org.apache.usergrid.persistence.qakka.core.QakkaUtils;
+import org.apache.usergrid.persistence.qakka.distributed.messages.QueueWriteRequest;
+import org.apache.usergrid.persistence.qakka.distributed.messages.QueueWriteResponse;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLog;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLogSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLogSerialization;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.UUID;
+
+
+public class QueueWriter extends UntypedActor {
+    private static final Logger logger = LoggerFactory.getLogger( QueueWriter.class );
+
+    public enum WriteStatus { SUCCESS_XFERLOG_DELETED, SUCCESS_XFERLOG_NOTDELETED, ERROR };
+
+    private final QueueMessageSerialization messageSerialization;
+    private final TransferLogSerialization  transferLogSerialization;
+    private final AuditLogSerialization     auditLogSerialization;
+    private final MetricsService            metricsService;
+
+
+    public QueueWriter() {
+
+        Injector injector = App.INJECTOR;
+
+        messageSerialization     = injector.getInstance( QueueMessageSerialization.class );
+        transferLogSerialization = injector.getInstance( TransferLogSerialization.class );
+        auditLogSerialization    = injector.getInstance( AuditLogSerialization.class );
+        metricsService           = injector.getInstance( MetricsService.class );
+    }
+
+    @Override
+    public void onReceive(Object message) {
+
+            if (message instanceof QueueWriteRequest) {
+
+                Timer.Context timer = metricsService.getMetricRegistry().timer( MetricsService.SEND_TIME_WRITE ).time();
+
+                try {
+                    QueueWriteRequest qa = (QueueWriteRequest) message;
+
+                    UUID queueMessageId = QakkaUtils.getTimeUuid();
+
+                    // TODO: implement deliveryTime and expirationTime
+
+                    DatabaseQueueMessage dbqm = null;
+                    long currentTime = System.currentTimeMillis();
+
+                    try {
+                        dbqm = new DatabaseQueueMessage(
+                                qa.getMessageId(),
+                                DatabaseQueueMessage.Type.DEFAULT,
+                                qa.getQueueName(),
+                                qa.getDestRegion(),
+                                null,
+                                currentTime,
+                                currentTime,
+                                queueMessageId );
+
+                        messageSerialization.writeMessage( dbqm );
+
+                        //logger.debug("Wrote queue message id {} to queue name {}",
+                        //        dbqm.getQueueMessageId(), dbqm.getQueueName());
+
+                    } catch (Throwable t) {
+                        logger.debug("Error creating database queue message", t);
+
+                        auditLogSerialization.recordAuditLog(
+                                AuditLog.Action.SEND,
+                                AuditLog.Status.ERROR,
+                                qa.getQueueName(),
+                                qa.getDestRegion(),
+                                qa.getMessageId(),
+                                dbqm.getMessageId() );
+
+                        getSender().tell( new QueueWriteResponse(
+                                QueueWriter.WriteStatus.ERROR ), getSender() );
+
+                        return;
+                    }
+
+                    auditLogSerialization.recordAuditLog(
+                            AuditLog.Action.SEND,
+                            AuditLog.Status.SUCCESS,
+                            qa.getQueueName(),
+                            qa.getDestRegion(),
+                            qa.getMessageId(),
+                            dbqm.getQueueMessageId() );
+
+                    try {
+                        transferLogSerialization.removeTransferLog(
+                                qa.getQueueName(),
+                                qa.getSourceRegion(),
+                                qa.getDestRegion(),
+                                qa.getMessageId() );
+
+                        getSender().tell( new QueueWriteResponse(
+                                QueueWriter.WriteStatus.SUCCESS_XFERLOG_DELETED ), getSender() );
+
+                    } catch (Throwable e) {
+                        logger.error("Error deleting transferlog", e);
+                        logger.debug( "Unable to delete transfer log for {} {} {} {}",
+                                qa.getQueueName(),
+                                qa.getSourceRegion(),
+                                qa.getDestRegion(),
+                                qa.getMessageId() );
+
+                        getSender().tell( new QueueWriteResponse(
+                                QueueWriter.WriteStatus.SUCCESS_XFERLOG_NOTDELETED ), getSender() );
+                    }
+
+                } finally {
+                    timer.close();
+                }
+
+            } else {
+                unhandled( message );
+            }
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueWriterRouter.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueWriterRouter.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueWriterRouter.java
new file mode 100644
index 0000000..9cf06d9
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueWriterRouter.java
@@ -0,0 +1,53 @@
+/*
+ * 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.qakka.distributed.actors;
+
+import akka.actor.ActorRef;
+import akka.actor.Props;
+import akka.actor.UntypedActor;
+import akka.routing.FromConfig;
+import org.apache.usergrid.persistence.qakka.distributed.messages.QueueWriteRequest;
+
+
+/**
+ * Route messages to QueueWriters
+ */
+public class QueueWriterRouter extends UntypedActor {
+
+    private final ActorRef router;
+
+
+    public QueueWriterRouter() {
+
+        router = getContext().actorOf(
+                FromConfig.getInstance().props(Props.create(QueueWriter.class )), "router");
+    }
+
+    @Override
+    public void onReceive(Object message) {
+
+        if ( message instanceof QueueWriteRequest) {
+            router.tell( message, getSender() );
+
+        } else {
+            unhandled(message);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocator.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocator.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocator.java
new file mode 100644
index 0000000..46e4906
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocator.java
@@ -0,0 +1,153 @@
+/*
+ * 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.qakka.distributed.actors;
+
+
+import akka.actor.UntypedActor;
+import com.codahale.metrics.Timer;
+import com.datastax.driver.core.utils.UUIDs;
+import com.google.inject.Injector;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.MetricsService;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.distributed.messages.ShardCheckRequest;
+import org.apache.usergrid.persistence.qakka.exceptions.NotFoundException;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaRuntimeException;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardCounterSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardIterator;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardCounterSerializationImpl;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardSerializationImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Optional;
+import java.util.UUID;
+
+
+public class ShardAllocator extends UntypedActor {
+    private static final Logger logger = LoggerFactory.getLogger( ShardAllocator.class );
+
+    private final String queueName;
+
+    private final QakkaFig qakkaFig;
+    private final ActorSystemFig            actorSystemFig;
+    private final ShardSerialization        shardSerialization;
+    private final ShardCounterSerialization shardCounterSerialization;
+    private final MetricsService            metricsService;
+    private final CassandraClient           cassandraClient;
+
+
+    public ShardAllocator( String queueName ) {
+        this.queueName = queueName;
+
+        Injector injector = App.INJECTOR;
+
+        this.qakkaFig                  = injector.getInstance( QakkaFig.class );
+        this.shardCounterSerialization = injector.getInstance( ShardCounterSerializationImpl.class );
+        this.shardSerialization        = injector.getInstance( ShardSerializationImpl.class );
+        this.actorSystemFig            = injector.getInstance( ActorSystemFig.class );
+        this.metricsService            = injector.getInstance( MetricsService.class );
+        this.cassandraClient           = injector.getInstance( CassandraClientImpl.class );
+
+        logger.debug( "Created shard allocator for queue {}", queueName );
+    }
+
+
+    @Override
+    public void onReceive( Object message ) throws Exception {
+
+        if ( message instanceof ShardCheckRequest) {
+
+            ShardCheckRequest request = (ShardCheckRequest) message;
+
+            if (!request.getQueueName().equals( queueName )) {
+                throw new QakkaRuntimeException(
+                        "ShardAllocator for " + queueName + ": Incorrect queueName " + request.getQueueName() );
+            }
+
+            // check both types of shard
+            checkLatestShard( Shard.Type.DEFAULT );
+            checkLatestShard( Shard.Type.INFLIGHT );
+
+        } else {
+            unhandled( message );
+        }
+
+    }
+
+    private void checkLatestShard( Shard.Type type ) {
+
+        Timer.Context timer = metricsService.getMetricRegistry().timer( MetricsService.ALLOCATE_TIME).time();
+
+        try {
+
+            String region = actorSystemFig.getRegionLocal();
+
+            // find newest shard
+
+            ShardIterator shardIterator = new ShardIterator(
+                    cassandraClient, queueName, region, type, Optional.empty() );
+
+            Shard shard = null;
+            while (shardIterator.hasNext()) {
+                shard = shardIterator.next();
+            }
+
+            if (shard == null) {
+                logger.warn( "No shard found for {}, {}, {}", queueName, region, type );
+                return;
+            }
+
+            // if its count is greater than 90% of max shard size, then allocate a new shard
+
+            long counterValue = 0;
+            try {
+                counterValue = shardCounterSerialization.getCounterValue( queueName, type, shard.getShardId() );
+            } catch ( NotFoundException ignored ) {}
+
+            if (counterValue > (0.9 * qakkaFig.getMaxShardSize())) {
+
+                // Create UUID from a UNIX timestamp via DataStax utility
+                // https://docs.datastax.com/en/drivers/java/2.0/com/datastax/driver/core/utils/UUIDs.html
+                UUID futureUUID = UUIDs.startOf(
+                        System.currentTimeMillis() + qakkaFig.getShardAllocationAdvanceTimeMillis());
+
+                Shard newShard = new Shard( queueName, region, type, shard.getShardId() + 1, futureUUID );
+                shardSerialization.createShard( newShard );
+                shardCounterSerialization.incrementCounter( queueName, type, newShard.getShardId(), 0 );
+
+                logger.info("{} Created new shard for queue {} shardId {} timestamp {} counterValue {}",
+                        this.hashCode(), queueName, shard.getShardId(), futureUUID.timestamp(), counterValue );
+            }
+
+        } catch ( Throwable t ) {
+            logger.error("Error while checking shard allocations", t);
+
+        } finally {
+            timer.close();
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
new file mode 100644
index 0000000..9551c61
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
@@ -0,0 +1,296 @@
+/*
+ * 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.qakka.distributed.impl;
+
+import akka.actor.ActorRef;
+import akka.pattern.Patterns;
+import akka.util.Timeout;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemManager;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.core.QueueManager;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.apache.usergrid.persistence.qakka.distributed.messages.*;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaRuntimeException;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import scala.concurrent.Await;
+import scala.concurrent.Future;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+
+@Singleton
+public class DistributedQueueServiceImpl implements DistributedQueueService {
+
+    private static final Logger logger = LoggerFactory.getLogger( DistributedQueueServiceImpl.class );
+
+    private final ActorSystemManager actorSystemManager;
+    private final QueueManager queueManager;
+    private final QakkaFig qakkaFig;
+
+
+    @Inject
+    public DistributedQueueServiceImpl(
+            ActorSystemManager actorSystemManager,
+            QueueManager queueManager,
+            QakkaFig qakkaFig,
+            QueueActorRouterProducer  queueActorRouterProducer,
+            QueueWriterRouterProducer queueWriterRouterProducer,
+            QueueSenderRouterProducer queueSenderRouterProducer ) {
+
+        this.actorSystemManager = actorSystemManager;
+        this.queueManager = queueManager;
+        this.qakkaFig = qakkaFig;
+
+        actorSystemManager.registerRouterProducer( queueActorRouterProducer );
+        actorSystemManager.registerRouterProducer( queueWriterRouterProducer );
+        actorSystemManager.registerRouterProducer( queueSenderRouterProducer );
+    }
+
+
+    @Override
+    public void init() {
+        for ( String queueName : queueManager.getListOfQueues() ) {
+            initQueue( queueName );
+        }
+    }
+
+
+    @Override
+    public void initQueue(String queueName) {
+        QueueInitRequest request = new QueueInitRequest( queueName );
+        ActorRef clientActor = actorSystemManager.getClientActor();
+        clientActor.tell( request, null );
+    }
+
+
+    @Override
+    public void refresh() {
+        for ( String queueName : queueManager.getListOfQueues() ) {
+            refreshQueue( queueName );
+        }
+    }
+
+
+    @Override
+    public void refreshQueue(String queueName) {
+        QueueRefreshRequest request = new QueueRefreshRequest( queueName );
+        ActorRef clientActor = actorSystemManager.getClientActor();
+        clientActor.tell( request, null );
+    }
+
+
+    @Override
+    public void processTimeouts() {
+
+        for ( String queueName : queueManager.getListOfQueues() ) {
+
+            QueueTimeoutRequest request = new QueueTimeoutRequest( queueName );
+
+            ActorRef clientActor = actorSystemManager.getClientActor();
+            clientActor.tell( request, null );
+        }
+    }
+
+
+    @Override
+    public DistributedQueueService.Status sendMessageToRegion(
+            String queueName, String sourceRegion, String destRegion, UUID messageId,
+            Long deliveryTime, Long expirationTime ) {
+
+        List<String> queueNames = queueManager.getListOfQueues();
+        if ( !queueNames.contains( queueName ) ) {
+            throw new QakkaRuntimeException( "Queue name: " + queueName + " does not exist");
+        }
+
+        int maxRetries = qakkaFig.getMaxSendRetries();
+        int retries = 0;
+
+        QueueSendRequest request = new QueueSendRequest(
+                queueName, sourceRegion, destRegion, messageId, deliveryTime, expirationTime );
+
+        while ( retries++ < maxRetries ) {
+            try {
+                Timeout t = new Timeout( qakkaFig.getSendTimeoutSeconds(), TimeUnit.SECONDS );
+
+                // send to current region via local clientActor
+                ActorRef clientActor = actorSystemManager.getClientActor();
+                Future<Object> fut = Patterns.ask( clientActor, request, t );
+
+                // wait for response...
+                final Object response = Await.result( fut, t.duration() );
+
+                if ( response != null && response instanceof QueueSendResponse) {
+                    QueueSendResponse qarm = (QueueSendResponse)response;
+
+                    if ( !DistributedQueueService.Status.ERROR.equals( qarm.getSendStatus() )) {
+
+                        if ( retries > 1 ) {
+                            logger.debug("SUCCESS after {} retries", retries );
+                        }
+                        return qarm.getSendStatus();
+
+                    } else {
+                        logger.debug("ERROR STATUS sending to queue, retrying {}", retries );
+                    }
+
+                } else if ( response != null  ) {
+                    logger.debug("NULL RESPONSE sending to queue, retrying {}", retries );
+
+                } else {
+                    logger.debug("TIMEOUT sending to queue, retrying {}", retries );
+                }
+
+            } catch ( Exception e ) {
+                logger.debug("ERROR sending to queue, retrying " + retries, e );
+            }
+        }
+
+        throw new QakkaRuntimeException( "Error sending to queue after " + retries );
+    }
+
+
+    @Override
+    public Collection<DatabaseQueueMessage> getNextMessages( String queueName, int count ) {
+
+        List<String> queueNames = queueManager.getListOfQueues();
+        if ( !queueNames.contains( queueName ) ) {
+            throw new QakkaRuntimeException( "Queue name: " + queueName + " does not exist");
+        }
+
+        int maxRetries = qakkaFig.getMaxGetRetries();
+        int retries = 0;
+
+        QueueGetRequest request = new QueueGetRequest( queueName, count );
+        while ( retries++ < maxRetries ) {
+            try {
+                Timeout t = new Timeout( qakkaFig.getGetTimeoutSeconds(), TimeUnit.SECONDS );
+
+                // ask ClientActor and wait (up to timeout) for response
+
+                Future<Object> fut = Patterns.ask( actorSystemManager.getClientActor(), request, t );
+                final QakkaMessage response = (QakkaMessage)Await.result( fut, t.duration() );
+
+                if ( response != null && response instanceof QueueGetResponse) {
+                    QueueGetResponse qprm = (QueueGetResponse)response;
+                    if ( qprm.isSuccess() ) {
+                        if (retries > 1) {
+                            logger.debug( "getNextMessage SUCCESS after {} retries", retries );
+                        }
+                    }
+                    return qprm.getQueueMessages();
+
+
+                } else if ( response != null  ) {
+                    logger.debug("ERROR RESPONSE popping queue, retrying {}", retries );
+
+                } else {
+                    logger.debug("TIMEOUT popping to queue, retrying {}", retries );
+                }
+
+            } catch ( Exception e ) {
+                logger.debug("ERROR popping to queue, retrying " + retries, e );
+            }
+        }
+
+        throw new QakkaRuntimeException(
+                "Error getting from queue " + queueName + " after " + retries );
+    }
+
+
+    @Override
+    public Status ackMessage(String queueName, UUID queueMessageId ) {
+
+        List<String> queueNames = queueManager.getListOfQueues();
+        if ( !queueNames.contains( queueName ) ) {
+            return Status.BAD_REQUEST;
+        }
+
+        QueueAckRequest message = new QueueAckRequest( queueName, queueMessageId );
+        return sendMessageToLocalQueueActors( message );
+    }
+
+
+    @Override
+    public Status requeueMessage(String queueName, UUID messageId) {
+
+        List<String> queueNames = queueManager.getListOfQueues();
+        if ( !queueNames.contains( queueName ) ) {
+            throw new QakkaRuntimeException( "Queue name: " + queueName + " does not exist");
+        }
+
+        QueueAckRequest message = new QueueAckRequest( queueName, messageId );
+        return sendMessageToLocalQueueActors( message );
+    }
+
+
+    @Override
+    public Status clearMessages(String queueName) {
+
+        List<String> queueNames = queueManager.getListOfQueues();
+        if ( !queueNames.contains( queueName ) ) {
+            throw new QakkaRuntimeException( "Queue name: " + queueName + " does not exist");
+        }
+
+        // TODO: implement clear queue
+        throw new UnsupportedOperationException();
+    }
+
+
+    private Status sendMessageToLocalQueueActors( QakkaMessage message ) {
+
+        int maxRetries = 5;
+        int retries = 0;
+
+        while ( retries++ < maxRetries ) {
+            try {
+                Timeout t = new Timeout( 1, TimeUnit.SECONDS );
+
+                // ask ClientActor and wait (up to timeout) for response
+
+                Future<Object> fut = Patterns.ask( actorSystemManager.getClientActor(), message, t );
+                final QakkaMessage response = (QakkaMessage)Await.result( fut, t.duration() );
+
+                if ( response != null && response instanceof QueueAckResponse) {
+                    QueueAckResponse qprm = (QueueAckResponse)response;
+                    return qprm.getStatus();
+
+                } else if ( response != null  ) {
+                    logger.debug("ERROR RESPONSE sending message, retrying {}", retries );
+
+                } else {
+                    logger.debug("TIMEOUT sending message, retrying {}", retries );
+                }
+
+            } catch ( Exception e ) {
+                logger.debug("ERROR sending message, retrying " + retries, e );
+            }
+        }
+
+        throw new QakkaRuntimeException(
+                "Error sending message " + message + "after " + retries );
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/QueueActorRouterProducer.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/QueueActorRouterProducer.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/QueueActorRouterProducer.java
new file mode 100644
index 0000000..8c6adda
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/QueueActorRouterProducer.java
@@ -0,0 +1,141 @@
+/*
+ * 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.qakka.distributed.impl;
+
+import akka.actor.ActorSystem;
+import akka.actor.PoisonPill;
+import akka.actor.Props;
+import akka.cluster.singleton.ClusterSingletonManager;
+import akka.cluster.singleton.ClusterSingletonManagerSettings;
+import akka.cluster.singleton.ClusterSingletonProxy;
+import akka.cluster.singleton.ClusterSingletonProxySettings;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemManager;
+import org.apache.usergrid.persistence.actorsystem.GuiceActorProducer;
+import org.apache.usergrid.persistence.actorsystem.RouterProducer;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.distributed.actors.QueueActorRouter;
+import org.apache.usergrid.persistence.qakka.distributed.messages.*;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class QueueActorRouterProducer implements RouterProducer {
+
+    static Injector injector;
+    ActorSystemManager actorSystemManager;
+    QakkaFig qakkaFig;
+
+
+    @Inject
+    public QueueActorRouterProducer(
+            Injector injector,
+            ActorSystemManager actorSystemManager,
+            QakkaFig qakkaFig) {
+
+        this.injector = injector;
+        this.actorSystemManager = actorSystemManager;
+        this.qakkaFig = qakkaFig;
+    }
+
+
+    @Override
+    public String getRouterPath() {
+        return "/user/queueActorRouterProxy";
+    }
+
+
+    @Override
+    public void produceRouter(ActorSystem system, String role) {
+
+        ClusterSingletonManagerSettings settings =
+                ClusterSingletonManagerSettings.create( system ).withRole( "io" );
+
+        system.actorOf( ClusterSingletonManager.props(
+                Props.create( GuiceActorProducer.class, injector, QueueActorRouter.class ),
+                PoisonPill.getInstance(), settings ), "queueActorRouter" );
+
+        ClusterSingletonProxySettings proxySettings =
+                ClusterSingletonProxySettings.create( system ).withRole( role );
+
+        system.actorOf(
+                ClusterSingletonProxy.props( "/user/queueActorRouter", proxySettings ), "queueActorRouterProxy" );
+    }
+
+
+    @Override
+    public void addConfiguration(Map<String, Object> configMap) {
+
+        int numInstancesPerNode = qakkaFig.getNumQueueActors();
+
+        Map<String, Object> akka = (Map<String, Object>) configMap.get( "akka" );
+        final Map<String, Object> deploymentMap;
+
+        if ( akka.get( "actor" ) == null ) {
+            deploymentMap = new HashMap<>();
+            akka.put( "actor", new HashMap<String, Object>() {{
+                put( "deployment", deploymentMap );
+            }} );
+
+        } else if (((Map) akka.get( "actor" )).get( "deployment" ) == null) {
+            deploymentMap = new HashMap<>();
+            ((Map) akka.get( "actor" )).put( "deployment", deploymentMap );
+
+        } else {
+            deploymentMap = (Map<String, Object>) ((Map) akka.get( "actor" )).get( "deployment" );
+        }
+
+        deploymentMap.put( "/queueActorRouter/singleton/router", new HashMap<String, Object>() {{
+            put( "router", "consistent-hashing-pool" );
+            put( "cluster", new HashMap<String, Object>() {{
+                put( "enabled", "on" );
+                put( "allow-local-routees", "on" );
+                put( "use-role", "io" );
+                put( "max-nr-of-instances-per-node", numInstancesPerNode );
+                put( "failure-detector", new HashMap<String, Object>() {{
+                    put( "threshold", "10" );
+                    put( "acceptable-heartbeat-pause", "3 s" );
+                    put( "heartbeat-interval", "1 s" );
+                    put( "heartbeat-request", new HashMap<String, Object>() {{
+                        put( "expected-response-after", "3 s" );
+                    }} );
+                }} );
+            }} );
+        }} );
+
+    }
+
+
+    @Override
+    public Collection<Class> getMessageTypes() {
+        return new ArrayList() {{
+            add( QueueGetRequest.class );
+            add( QueueAckRequest.class );
+            add( QueueInitRequest.class );
+            add( QueueRefreshRequest.class );
+            add( QueueTimeoutRequest.class );
+            add( ShardCheckRequest.class );
+        }};
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/QueueSenderRouterProducer.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/QueueSenderRouterProducer.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/QueueSenderRouterProducer.java
new file mode 100644
index 0000000..885a559
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/QueueSenderRouterProducer.java
@@ -0,0 +1,134 @@
+/*
+ * 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.qakka.distributed.impl;
+
+import akka.actor.ActorSystem;
+import akka.actor.PoisonPill;
+import akka.actor.Props;
+import akka.cluster.singleton.ClusterSingletonManager;
+import akka.cluster.singleton.ClusterSingletonManagerSettings;
+import akka.cluster.singleton.ClusterSingletonProxy;
+import akka.cluster.singleton.ClusterSingletonProxySettings;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemManager;
+import org.apache.usergrid.persistence.actorsystem.GuiceActorProducer;
+import org.apache.usergrid.persistence.actorsystem.RouterProducer;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.distributed.actors.QueueSenderRouter;
+import org.apache.usergrid.persistence.qakka.distributed.messages.QueueSendRequest;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class QueueSenderRouterProducer implements RouterProducer {
+
+    static Injector injector;
+    ActorSystemManager actorSystemManager;
+    QakkaFig qakkaFig;
+
+
+    @Inject
+    public QueueSenderRouterProducer(
+            Injector injector,
+            ActorSystemManager actorSystemManager,
+            QakkaFig qakkaFig) {
+
+        this.injector = injector;
+        this.actorSystemManager = actorSystemManager;
+        this.qakkaFig = qakkaFig;
+    }
+
+
+    @Override
+    public String getRouterPath() {
+        return "/user/queueSenderRouterProxy";
+    }
+
+
+    @Override
+    public void produceRouter(ActorSystem system, String role) {
+
+        ClusterSingletonManagerSettings settings =
+                ClusterSingletonManagerSettings.create( system ).withRole( "io" );
+
+        system.actorOf( ClusterSingletonManager.props(
+                Props.create( GuiceActorProducer.class, injector, QueueSenderRouter.class ),
+                PoisonPill.getInstance(), settings ), "queueSenderRouter" );
+
+        ClusterSingletonProxySettings proxySettings =
+                ClusterSingletonProxySettings.create( system ).withRole( role );
+
+        system.actorOf(
+                ClusterSingletonProxy.props( "/user/queueSenderRouter", proxySettings ), "queueSenderRouterProxy" );
+    }
+
+
+    @Override
+    public void addConfiguration(Map<String, Object> configMap) {
+
+        int numInstancesPerNode = qakkaFig.getNumQueueSenderActors();
+
+        Map<String, Object> akka = (Map<String, Object>) configMap.get( "akka" );
+        final Map<String, Object> deploymentMap;
+
+        if ( akka.get( "actor" ) == null ) {
+            deploymentMap = new HashMap<>();
+            akka.put( "actor", new HashMap<String, Object>() {{
+                put( "deployment", deploymentMap );
+            }} );
+
+        } else if (((Map) akka.get( "actor" )).get( "deployment" ) == null) {
+            deploymentMap = new HashMap<>();
+            ((Map) akka.get( "actor" )).put( "deployment", deploymentMap );
+
+        } else {
+            deploymentMap = (Map<String, Object>) ((Map) akka.get( "actor" )).get( "deployment" );
+        }
+
+        deploymentMap.put( "/queueSenderRouter/singleton/router", new HashMap<String, Object>() {{
+            put( "router", "round-robin-pool" );
+            put( "cluster", new HashMap<String, Object>() {{
+                put( "enabled", "on" );
+                put( "allow-local-routees", "on" );
+                put( "use-role", "io" );
+                put( "max-nr-of-instances-per-node", numInstancesPerNode );
+                put( "failure-detector", new HashMap<String, Object>() {{
+                    put( "threshold", "10" );
+                    put( "acceptable-heartbeat-pause", "3 s" );
+                    put( "heartbeat-interval", "1 s" );
+                    put( "heartbeat-request", new HashMap<String, Object>() {{
+                        put( "expected-response-after", "3 s" );
+                    }} );
+                }} );
+            }} );
+        }} );
+
+    }
+
+    @Override
+    public Collection<Class> getMessageTypes() {
+        return Collections.singletonList( QueueSendRequest.class );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/QueueWriterRouterProducer.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/QueueWriterRouterProducer.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/QueueWriterRouterProducer.java
new file mode 100644
index 0000000..c8b5567
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/QueueWriterRouterProducer.java
@@ -0,0 +1,134 @@
+/*
+ * 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.qakka.distributed.impl;
+
+import akka.actor.ActorSystem;
+import akka.actor.PoisonPill;
+import akka.actor.Props;
+import akka.cluster.singleton.ClusterSingletonManager;
+import akka.cluster.singleton.ClusterSingletonManagerSettings;
+import akka.cluster.singleton.ClusterSingletonProxy;
+import akka.cluster.singleton.ClusterSingletonProxySettings;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemManager;
+import org.apache.usergrid.persistence.actorsystem.GuiceActorProducer;
+import org.apache.usergrid.persistence.actorsystem.RouterProducer;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.distributed.actors.QueueWriterRouter;
+import org.apache.usergrid.persistence.qakka.distributed.messages.QueueWriteRequest;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class QueueWriterRouterProducer implements RouterProducer {
+
+    static Injector injector;
+    ActorSystemManager actorSystemManager;
+    QakkaFig qakkaFig;
+
+
+    @Inject
+    public QueueWriterRouterProducer(
+            Injector injector,
+            ActorSystemManager actorSystemManager,
+            QakkaFig qakkaFig) {
+
+        this.injector = injector;
+        this.actorSystemManager = actorSystemManager;
+        this.qakkaFig = qakkaFig;
+    }
+
+
+    @Override
+    public String getRouterPath() {
+        return "/user/queueWriterRouterProxy";
+    }
+
+
+    @Override
+    public void produceRouter(ActorSystem system, String role) {
+
+        ClusterSingletonManagerSettings settings =
+                ClusterSingletonManagerSettings.create( system ).withRole( "io" );
+
+        system.actorOf( ClusterSingletonManager.props(
+                Props.create( GuiceActorProducer.class, injector, QueueWriterRouter.class ),
+                PoisonPill.getInstance(), settings ), "queueWriterRouter" );
+
+        ClusterSingletonProxySettings proxySettings =
+                ClusterSingletonProxySettings.create( system ).withRole( role );
+
+        system.actorOf(
+                ClusterSingletonProxy.props( "/user/queueWriterRouter", proxySettings ), "queueWriterRouterProxy" );
+    }
+
+
+    @Override
+    public void addConfiguration(Map<String, Object> configMap) {
+
+        int numInstancesPerNode = qakkaFig.getNumQueueWriterActors();
+
+        Map<String, Object> akka = (Map<String, Object>) configMap.get( "akka" );
+        final Map<String, Object> deploymentMap;
+
+        if ( akka.get( "actor" ) == null ) {
+            deploymentMap = new HashMap<>();
+            akka.put( "actor", new HashMap<String, Object>() {{
+                put( "deployment", deploymentMap );
+            }} );
+
+        } else if (((Map) akka.get( "actor" )).get( "deployment" ) == null) {
+            deploymentMap = new HashMap<>();
+            ((Map) akka.get( "actor" )).put( "deployment", deploymentMap );
+
+        } else {
+            deploymentMap = (Map<String, Object>) ((Map) akka.get( "actor" )).get( "deployment" );
+        }
+
+        deploymentMap.put( "/queueWriterRouter/singleton/router", new HashMap<String, Object>() {{
+            put( "router", "round-robin-pool" );
+            put( "cluster", new HashMap<String, Object>() {{
+                put( "enabled", "on" );
+                put( "allow-local-routees", "on" );
+                put( "use-role", "io" );
+                put( "max-nr-of-instances-per-node", numInstancesPerNode );
+                put( "failure-detector", new HashMap<String, Object>() {{
+                    put( "threshold", "10" );
+                    put( "acceptable-heartbeat-pause", "3 s" );
+                    put( "heartbeat-interval", "1 s" );
+                    put( "heartbeat-request", new HashMap<String, Object>() {{
+                        put( "expected-response-after", "3 s" );
+                    }} );
+                }} );
+            }} );
+        }} );
+
+    }
+
+    @Override
+    public Collection<Class> getMessageTypes() {
+        return Collections.singletonList( QueueWriteRequest.class );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QakkaMessage.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QakkaMessage.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QakkaMessage.java
new file mode 100644
index 0000000..a1bbf14
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QakkaMessage.java
@@ -0,0 +1,28 @@
+/*
+ * 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.qakka.distributed.messages;
+
+import java.io.Serializable;
+
+/**
+ * Marker interface
+ */
+public interface QakkaMessage extends Serializable {
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueAckRequest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueAckRequest.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueAckRequest.java
new file mode 100644
index 0000000..4beb46b
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueAckRequest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.qakka.distributed.messages;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.util.UUID;
+
+
+public class QueueAckRequest implements QakkaMessage {
+    private final String queueName;
+    private final UUID queueMessageId;
+
+
+    public QueueAckRequest( String queueName, UUID queueMessageId ) {
+        this.queueName = queueName;
+        this.queueMessageId = queueMessageId;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public UUID getQueueMessageId() {
+        return queueMessageId;
+    }
+
+    public String toString() {
+        return new ToStringBuilder( this )
+                .append( "queueName", queueName )
+                .append( "queueMessageId", queueMessageId )
+                .toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueAckResponse.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueAckResponse.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueAckResponse.java
new file mode 100644
index 0000000..68e6213
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueAckResponse.java
@@ -0,0 +1,59 @@
+/*
+ * 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.qakka.distributed.messages;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+
+import java.util.UUID;
+
+
+public class QueueAckResponse implements QakkaMessage {
+    private final String queueName;
+    private final UUID messageId;
+    private final DistributedQueueService.Status status;
+
+    public QueueAckResponse( String queueName, UUID messageId, DistributedQueueService.Status status ) {
+        this.queueName = queueName;
+        this.messageId = messageId;
+        this.status = status;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public UUID getMessageId() {
+        return messageId;
+    }
+
+    public DistributedQueueService.Status getStatus() {
+        return status;
+    }
+
+    public String toString() {
+        return new ToStringBuilder( this )
+                .append( "queueName", queueName )
+                .append( "messageId", messageId )
+                .append( "status", status )
+                .toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueGetRequest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueGetRequest.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueGetRequest.java
new file mode 100644
index 0000000..c23dcf6
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueGetRequest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.qakka.distributed.messages;
+
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+public class QueueGetRequest implements QakkaMessage {
+    private final String queueName;
+    private final int numRequested;
+
+    public QueueGetRequest(String queueName, int numRequested ) {
+        this.queueName = queueName;
+        this.numRequested = numRequested;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public int getNumRequested() {
+        return numRequested;
+    }
+
+    public String toString() {
+        return new ToStringBuilder( this )
+                .append( "queueName", queueName )
+                .append( "numRequested", numRequested )
+                .toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueGetResponse.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueGetResponse.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueGetResponse.java
new file mode 100644
index 0000000..c8004fb
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueGetResponse.java
@@ -0,0 +1,63 @@
+/*
+ * 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.qakka.distributed.messages;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+
+import java.util.Collection;
+import java.util.Collections;
+
+
+public class QueueGetResponse implements QakkaMessage {
+    private final Collection<DatabaseQueueMessage> queueMessages;
+    private final DistributedQueueService.Status status;
+
+
+    public QueueGetResponse(DistributedQueueService.Status status ) {
+        this.status = status;
+        this.queueMessages = Collections.emptyList();
+    }
+
+    public QueueGetResponse(DistributedQueueService.Status status, Collection<DatabaseQueueMessage> queueMessages) {
+        this.status = status;
+        this.queueMessages = queueMessages;
+    }
+
+    public DistributedQueueService.Status getStatus() {
+        return status;
+    }
+
+    public boolean isSuccess() {
+        return status.equals( DistributedQueueService.Status.SUCCESS);
+    }
+
+    public Collection<DatabaseQueueMessage> getQueueMessages() {
+        return queueMessages;
+    }
+
+    public String toString() {
+        return new ToStringBuilder( this )
+                .append( "messageCount", queueMessages.size() )
+                .append( "status", status )
+                .toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueInitRequest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueInitRequest.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueInitRequest.java
new file mode 100644
index 0000000..10180cd
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueInitRequest.java
@@ -0,0 +1,43 @@
+/*
+ * 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.qakka.distributed.messages;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+
+public class QueueInitRequest implements QakkaMessage {
+    private final String queueName;
+
+
+    public QueueInitRequest(String queueName ) {
+        this.queueName = queueName;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public String toString() {
+        return new ToStringBuilder( this )
+                .append( "queueName", queueName )
+                .toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueRefreshRequest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueRefreshRequest.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueRefreshRequest.java
new file mode 100644
index 0000000..a81a6fd
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueRefreshRequest.java
@@ -0,0 +1,43 @@
+/*
+ * 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.qakka.distributed.messages;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+
+public class QueueRefreshRequest implements QakkaMessage {
+    private final String queueName;
+
+
+    public QueueRefreshRequest(String queueName ) {
+        this.queueName = queueName;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public String toString() {
+        return new ToStringBuilder( this )
+                .append( "queueName", queueName )
+                .toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueSendRequest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueSendRequest.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueSendRequest.java
new file mode 100644
index 0000000..8a655f4
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueSendRequest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.qakka.distributed.messages;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.util.UUID;
+
+
+public class QueueSendRequest implements QakkaMessage {
+
+    private final String queueName;
+    private final String sourceRegion;
+    private final String destRegion;
+    private final UUID messageId;
+    private Long deliveryTime;
+    private Long expirationTime;
+
+
+    public QueueSendRequest(
+            String queueName, String sourceRegion, String destRegion, UUID messageId,
+            Long deliveryTime, Long expirationTime) {
+
+        this.queueName = queueName;
+        this.sourceRegion = sourceRegion;
+        this.destRegion = destRegion;
+        this.messageId = messageId;
+        this.deliveryTime = deliveryTime;
+        this.expirationTime = expirationTime;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public String getSourceRegion() {
+        return sourceRegion;
+    }
+
+    public String getDestRegion() {
+        return destRegion;
+    }
+
+    public UUID getMessageId() {
+        return messageId;
+    }
+
+    public Long getExpirationTime() {
+        return expirationTime;
+    }
+
+    public Long getDeliveryTime() {
+        return deliveryTime;
+    }
+
+    public String toString() {
+        return new ToStringBuilder( this )
+                .append( "queueName", queueName )
+                .append( "sourceRegion", sourceRegion )
+                .append( "destRegion", destRegion )
+                .append( "messageId", messageId )
+                .append( "expirationTime", expirationTime )
+                .append( "deliveryTime", deliveryTime )
+                .toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueSendResponse.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueSendResponse.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueSendResponse.java
new file mode 100644
index 0000000..0c295a0
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueSendResponse.java
@@ -0,0 +1,43 @@
+/*
+ * 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.qakka.distributed.messages;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+
+
+public class QueueSendResponse implements QakkaMessage {
+    private final DistributedQueueService.Status status;
+
+    public QueueSendResponse(DistributedQueueService.Status status) {
+        this.status = status;
+    }
+
+    public DistributedQueueService.Status getSendStatus() {
+        return status;
+    }
+
+    public String toString() {
+        return new ToStringBuilder( this )
+                .append( "status", status )
+                .toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueTimeoutRequest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueTimeoutRequest.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueTimeoutRequest.java
new file mode 100644
index 0000000..5358459
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueTimeoutRequest.java
@@ -0,0 +1,43 @@
+/*
+ * 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.qakka.distributed.messages;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+
+public class QueueTimeoutRequest implements QakkaMessage {
+    private final String queueName;
+
+
+    public QueueTimeoutRequest(String queueName ) {
+        this.queueName = queueName;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public String toString() {
+        return new ToStringBuilder( this )
+                .append( "queueName", queueName )
+                .toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueWriteRequest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueWriteRequest.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueWriteRequest.java
new file mode 100644
index 0000000..c7411de
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueWriteRequest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.qakka.distributed.messages;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.util.UUID;
+
+
+public class QueueWriteRequest implements QakkaMessage {
+
+    private final String queueName;
+    private final String sourceRegion;
+    private final String destRegion;
+    private final UUID messageId;
+    private Long deliveryTime;
+    private Long expirationTime;
+
+
+    public QueueWriteRequest(
+            String queueName, String sourceRegion, String destRegion, UUID messageId,
+            Long deliveryTime, Long expirationTime) {
+
+        this.queueName = queueName;
+        this.sourceRegion = sourceRegion;
+        this.destRegion = destRegion;
+        this.messageId = messageId;
+        this.deliveryTime = deliveryTime;
+        this.expirationTime = expirationTime;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public String getSourceRegion() {
+        return sourceRegion;
+    }
+
+    public String getDestRegion() {
+        return destRegion;
+    }
+
+    public UUID getMessageId() {
+        return messageId;
+    }
+
+    public Long getExpirationTime() {
+        return expirationTime;
+    }
+
+    public Long getDeliveryTime() {
+        return deliveryTime;
+    }
+
+    public String toString() {
+        return new ToStringBuilder( this )
+                .append( "queueName", queueName )
+                .append( "sourceRegion", sourceRegion )
+                .append( "destRegion", destRegion )
+                .append( "messageId", messageId )
+                .append( "expirationTime", expirationTime )
+                .append( "deliveryTime", deliveryTime )
+                .toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueWriteResponse.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueWriteResponse.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueWriteResponse.java
new file mode 100644
index 0000000..1eb513c
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/QueueWriteResponse.java
@@ -0,0 +1,43 @@
+/*
+ * 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.qakka.distributed.messages;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.usergrid.persistence.qakka.distributed.actors.QueueWriter;
+
+
+public class QueueWriteResponse implements QakkaMessage {
+    private final QueueWriter.WriteStatus status;
+
+    public QueueWriteResponse(QueueWriter.WriteStatus status) {
+        this.status = status;
+    }
+
+    public QueueWriter.WriteStatus getSendStatus() {
+        return status;
+    }
+
+    public String toString() {
+        return new ToStringBuilder( this )
+                .append( "status", status )
+                .toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/ShardCheckRequest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/ShardCheckRequest.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/ShardCheckRequest.java
new file mode 100644
index 0000000..78dbe13
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/messages/ShardCheckRequest.java
@@ -0,0 +1,43 @@
+/*
+ * 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.qakka.distributed.messages;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+
+public class ShardCheckRequest implements QakkaMessage {
+    private final String queueName;
+
+
+    public ShardCheckRequest(String queueName ) {
+        this.queueName = queueName;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public String toString() {
+        return new ToStringBuilder( this )
+                .append( "queueName", queueName )
+                .toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/BadRequestException.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/BadRequestException.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/BadRequestException.java
new file mode 100644
index 0000000..500fb6a
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/BadRequestException.java
@@ -0,0 +1,32 @@
+/*
+ * 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.qakka.exceptions;
+
+
+public class BadRequestException extends QakkaRuntimeException {
+
+    public BadRequestException(String message) {
+        super( message );
+    }
+
+    public BadRequestException(String message, Throwable cause) {
+        super( message, cause );
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/NotFoundException.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/NotFoundException.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/NotFoundException.java
new file mode 100644
index 0000000..5f76163
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/NotFoundException.java
@@ -0,0 +1,32 @@
+/*
+ * 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.qakka.exceptions;
+
+
+public class NotFoundException extends QakkaRuntimeException {
+
+    public NotFoundException(String message) {
+        super( message );
+    }
+
+    public NotFoundException(String message, Throwable cause) {
+        super( message, cause );
+    }
+}


[12/25] usergrid git commit: Initial integration of Qakka into Usergrid Queue module, and implementation of Qakka-based LegacyQueueManager implementation.

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QakkaUtils.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QakkaUtils.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QakkaUtils.java
new file mode 100644
index 0000000..9fe5c6e
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QakkaUtils.java
@@ -0,0 +1,44 @@
+/*
+ * 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.qakka.core;
+
+import com.datastax.driver.core.utils.UUIDs;
+
+import java.util.UUID;
+
+public class QakkaUtils {
+
+    public static UUID getTimeUuid() {
+        return UUIDs.timeBased();
+    }
+
+    public static Boolean isTimeUuid(UUID uuid) {
+        return uuid.version() == 1;
+    }
+
+    public static Boolean isNullOrEmpty(String s) {
+        return (s == null || s.equals(""));
+    }
+
+    public static UUID getTimeUUID(long when) {
+        return UUIDs.startOf( when );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/Queue.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/Queue.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/Queue.java
new file mode 100644
index 0000000..e3d2790
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/Queue.java
@@ -0,0 +1,147 @@
+/*
+ * 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.qakka.core;
+
+import org.apache.usergrid.persistence.qakka.serialization.queues.DatabaseQueue;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class Queue {
+
+    // will eventually control these via properties file
+    private static final Integer defaultRetryCount = 3;
+    private static final Integer defaultHandlingTimeoutSec = 30;
+    private static final String defaultDeadLetterQueueExtension = "_DLQ";
+
+    private String name;
+    private String queueType;
+    private String regions;
+    private String defaultDestinations;
+    private Long defaultDelayMs;
+    private Integer retryCount;
+    private Integer handlingTimeoutSec;
+    private String deadLetterQueue;
+
+    public Queue() {} // Jackson needs no-arg ctor
+
+    public Queue(String name, String queueType, String regions, String defaultDestinations, Long defaultDelayMs,
+                 Integer retryCount, Integer handlingTimeoutSec, String deadLetterQueue) {
+        this.name = name;
+        this.queueType = queueType;
+        this.regions = regions;
+        this.defaultDestinations = defaultDestinations;
+        this.defaultDelayMs = defaultDelayMs;
+        this.retryCount = retryCount;
+        this.handlingTimeoutSec = handlingTimeoutSec;
+        this.deadLetterQueue = deadLetterQueue;
+    }
+
+    public Queue(String name, String queueType, String regions, String defaultDestinations, Long defaultDelayMs) {
+        this(name, queueType, regions, defaultDestinations, defaultDelayMs, defaultRetryCount,
+                defaultHandlingTimeoutSec, name + defaultDeadLetterQueueExtension);
+    }
+
+    public Queue(String name, String queueType, String regions, String defaultDestinations) {
+        this(name, queueType, regions, defaultDestinations, 0L, defaultRetryCount,
+                defaultHandlingTimeoutSec, name + defaultDeadLetterQueueExtension);
+    }
+
+    public Queue(String name) {
+        this(name, QueueType.MULTIREGION, Regions.LOCAL, Regions.LOCAL, 0L, defaultRetryCount,
+                defaultHandlingTimeoutSec, name + defaultDeadLetterQueueExtension);
+    }
+
+    public Queue(DatabaseQueue databaseQueue) {
+        this(   databaseQueue.getName(),
+                QueueType.MULTIREGION,
+                databaseQueue.getRegions(),
+                databaseQueue.getDefaultDestinations(),
+                databaseQueue.getDefaultDelayMs(),
+                databaseQueue.getRetryCount(),
+                databaseQueue.getHandlingTimeoutSec(),
+                databaseQueue.getDeadLetterQueue());
+    }
+
+    public String getName() {
+        return name;
+    }
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getQueueType() {
+        return queueType;
+    }
+
+    public String getRegions() {
+        return regions;
+    }
+    public void setRegions(String regions) {
+        this.regions = regions;
+    }
+
+    public String getDefaultDestinations() {
+        return defaultDestinations;
+    }
+    public void setDefaultDestinations(String defaultDestinations) {
+        this.defaultDestinations = defaultDestinations;
+    }
+
+    public Long getDefaultDelayMs() {
+        return defaultDelayMs;
+    }
+    public void setDefaultDelayMs(Long defaultDelayMs) {
+        this.defaultDelayMs = defaultDelayMs;
+    }
+
+    public Integer getRetryCount() {
+        return retryCount;
+    }
+    public void setRetryCount(Integer retryCount) {
+        this.retryCount = retryCount;
+    }
+
+    public Integer getHandlingTimeoutSec() {
+        return handlingTimeoutSec;
+    }
+    public void setHandlingTimeoutSec(Integer handlingTimeoutSec) {
+        this.handlingTimeoutSec = handlingTimeoutSec;
+    }
+
+    public String getDeadLetterQueue() {
+        return deadLetterQueue;
+    }
+    public void setDeadLetterQueue(String deadLetterQueue) {
+        this.deadLetterQueue = deadLetterQueue;
+    }
+
+    public DatabaseQueue toDatabaseQueue() {
+        return new DatabaseQueue(
+                name,
+                regions,
+                defaultDestinations,
+                defaultDelayMs,
+                retryCount,
+                handlingTimeoutSec,
+                deadLetterQueue);
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueManager.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueManager.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueManager.java
new file mode 100644
index 0000000..478fa12
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueManager.java
@@ -0,0 +1,35 @@
+/*
+ * 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.qakka.core;
+
+import java.util.List;
+
+public interface QueueManager {
+
+    void createQueue(Queue queue);
+
+    void updateQueueConfig(Queue queue);
+
+    void deleteQueue(String queueName);
+
+    Queue getQueueConfig(String queueName);
+
+    List<String> getListOfQueues();
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueMessage.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueMessage.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueMessage.java
new file mode 100644
index 0000000..e79a241
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueMessage.java
@@ -0,0 +1,186 @@
+/*
+ * 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.qakka.core;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import java.io.Serializable;
+import java.util.UUID;
+
+@XmlRootElement
+public class QueueMessage implements Serializable {
+
+    private UUID queueMessageId;
+    private UUID messageId;
+
+    private String queueName;
+    private String sendingRegion;
+    private String receivingRegion;
+
+    private Long delayUntilDate;
+    private Long expirationDate;
+    private Long createDate;
+    private Long retries;
+
+    private Boolean dataReceived;
+
+    /** MIME content type of data */
+    private String contentType;
+
+    /** If contentType is application/json then data will be the JSON payload for this queue message */
+    private String data;
+
+    /** If contentType is not then href will be the URL where the payload may be fetched */
+    private String href;
+
+
+    public QueueMessage() {} // for Jackson
+
+    public QueueMessage(
+            UUID queueMessageId, String queueName, String sendingRegion, String receivingRegion, UUID messageId,
+            Long delayUntilDate, Long expirationDate, Long createDate, Long retries, Boolean dataReceived) {
+
+        if (queueMessageId == null) {
+            this.queueMessageId = QakkaUtils.getTimeUuid();
+        } else {
+            this.queueMessageId = queueMessageId;
+        }
+        this.queueName        = queueName;
+        this.sendingRegion    = sendingRegion;
+        this.receivingRegion  = receivingRegion;
+        this.messageId        = messageId;
+        this.delayUntilDate   = delayUntilDate;
+        this.expirationDate   = expirationDate;
+        this.createDate       = createDate;
+        this.retries          = retries;
+        this.dataReceived     = dataReceived;
+    }
+
+    public UUID getQueueMessageId() {
+        return queueMessageId;
+    }
+
+    public void setQueueMessageId(UUID queueMessageId) {
+        this.queueMessageId = queueMessageId;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public String getSendingRegion() {
+        return sendingRegion;
+    }
+
+    public String getReceivingRegion() {
+        return receivingRegion;
+    }
+
+    public UUID getMessageId() {
+        return messageId;
+    }
+
+    public Long getDelayUntilDate() {
+        return delayUntilDate;
+    }
+
+    public Long getDelayUntilMs() {
+        if ( delayUntilDate == null ) {
+            return null;
+        }
+        return delayUntilDate - System.currentTimeMillis();
+    }
+
+    public void setDelayUntilDate(Long delayUntilDate) {
+        this.delayUntilDate = delayUntilDate;
+    }
+
+    public void setDelayUntilMs(Long delayMs) {
+        this.delayUntilDate = System.currentTimeMillis() + delayMs;
+    }
+
+    public Long getExpirationDate() {
+        return expirationDate;
+    }
+
+    public Long getExpirationMs() {
+        if ( expirationDate == null ) {
+            return null;
+        }
+        return expirationDate - System.currentTimeMillis();
+    }
+
+    public void setExpirationDate(Long expirationDate) {
+        this.expirationDate = expirationDate;
+    }
+
+    public void setExpirationMs(Long expirationMs) {
+        this.expirationDate = System.currentTimeMillis() + expirationMs;
+    }
+
+    public Long getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(Long createDate) {
+        this.createDate = createDate;
+    }
+
+    public Long getRetries() {
+        return retries;
+    }
+
+    public void setRetries(Long retries) {
+        this.retries = retries;
+    }
+
+    public Boolean getDataReceived() {
+        return dataReceived;
+    }
+
+    public void setDataReceived(Boolean dataReceived) {
+        this.dataReceived = dataReceived;
+    }
+
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    public String getContentType() {
+        return contentType;
+    }
+
+    public void setContentType(String contentType) {
+        this.contentType = contentType;
+    }
+
+    public String getHref() {
+        return href;
+    }
+
+    public void setHref(String href) {
+        this.href = href;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManager.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManager.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManager.java
new file mode 100644
index 0000000..15203d8
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManager.java
@@ -0,0 +1,83 @@
+/*
+ * 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.qakka.core;
+
+import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.UUID;
+
+
+public interface QueueMessageManager {
+
+    /**
+     * Send Queue Message to one or more destination regions.
+     *  @param queueName Name of queue
+     * @param destinationRegions List of destination regions
+     * @param delayMs Delay before sending queue message
+     * @param expirationSecs Time before message expires
+     * @param contentType Content type of message data
+     * @param messageData Message content
+     */
+    void sendMessages(String queueName, List<String> destinationRegions,
+                      Long delayMs, Long expirationSecs, String contentType, ByteBuffer messageData);
+
+    /**
+     * Get next available messages from the specified queue.
+     *
+     * @param queueName Name of queue
+     * @param count Number of messages to get
+     * @return List of next messages, empty if non-available
+     */
+    List<QueueMessage> getNextMessages(String queueName, int count);
+
+    /**
+     * Acknowledge that message has been received and is no longer inflight.
+     *
+     * @param queueName Name of queue
+     * @param queueMessageId ID of queue message
+     */
+    void ackMessage(String queueName, UUID queueMessageId);
+
+    /**
+     * Put message back in the queue.
+     *
+     * @param queueName Name of the queue
+     * @param messageId ID of the queue message
+     * @param delayMs Delay before re-queueing message
+     */
+    void requeueMessage(String queueName, UUID messageId, Long delayMs);
+
+    /**
+     * Clear all messages from queue
+     *
+     * @param queueName Name of queue
+     */
+    void clearMessages(String queueName);
+
+    /**
+     * Get message payload data.
+     */
+    ByteBuffer getMessageData(UUID messageId);
+
+    /**
+     * Get message from messages available or messages inflight storage.
+     */
+    QueueMessage getMessage(String queueName, UUID queueMessageId);
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueType.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueType.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueType.java
new file mode 100644
index 0000000..f0f59e5
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/QueueType.java
@@ -0,0 +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.qakka.core;
+
+
+public class QueueType {
+    public static final String LOCAL = "_LOCAL";
+    public static final String MULTIREGION = "_MULTIREGION";
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/Regions.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/Regions.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/Regions.java
new file mode 100644
index 0000000..3097e92
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/Regions.java
@@ -0,0 +1,84 @@
+/*
+ * 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.qakka.core;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+
+@Singleton
+public class Regions {
+    public static final String LOCAL = "LOCAL";
+    public static final String ALL = "ALL";
+    public static final String REMOTE = "REMOTE";
+
+    // load regions from properties
+    String localRegion;
+    List<String> regionList;
+
+
+    @Inject
+    public Regions( ActorSystemFig actorSystemFig ) {
+        localRegion = actorSystemFig.getRegionLocal();
+        regionList = Arrays.asList( actorSystemFig.getRegionsList().split(","));
+    }
+
+
+    public List<String> getRegions(String region) {
+        List<String> ret = null;
+
+        switch (region) {
+            case ALL:
+                ret = new ArrayList<>(regionList);
+                break;
+            case LOCAL:
+                ret = Collections.singletonList(localRegion);
+                break;
+            case REMOTE:
+                ret = new ArrayList<>(regionList);
+                ret.remove(localRegion);
+                break;
+            default:
+                // parse regions into list -- assume a single region now, but can do region1,region2
+
+                // validate regions
+
+                ret = Collections.singletonList(region);
+                break;
+        }
+
+        return ret;
+    }
+
+    public String getLocalRegion() {
+        return localRegion;
+    }
+
+    public Boolean isValidRegion(String region) {
+        return regionList.contains(region);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/impl/InMemoryQueue.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/impl/InMemoryQueue.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/impl/InMemoryQueue.java
new file mode 100644
index 0000000..474ef5c
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/impl/InMemoryQueue.java
@@ -0,0 +1,84 @@
+/*
+ * 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.qakka.core.impl;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.distributed.actors.QueueRefresher;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Queue;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+
+@Singleton
+public class InMemoryQueue {
+    private static final Logger logger = LoggerFactory.getLogger( QueueRefresher.class );
+
+    private final Map<String, Queue<DatabaseQueueMessage>> queuesByName;
+    private final Map<String, UUID> newestByQueueName;
+
+
+    @Inject
+    InMemoryQueue(QakkaFig qakkaFig) {
+        queuesByName = new HashMap<>( qakkaFig.getQueueInMemorySize() );
+        newestByQueueName = new HashMap<>( qakkaFig.getQueueInMemorySize() );
+    }
+
+    private Queue<DatabaseQueueMessage> getQueue( String queueName ) {
+        synchronized ( queuesByName ) {
+            if ( !queuesByName.containsKey( queueName )) {
+                queuesByName.put( queueName, new ConcurrentLinkedQueue<>() );
+            }
+            return queuesByName.get( queueName );
+        }
+    }
+
+    public void add( String queueName, DatabaseQueueMessage databaseQueueMessage ) {
+        UUID newest = newestByQueueName.get( queueName );
+        if ( newest == null ) {
+            newest = databaseQueueMessage.getQueueMessageId();
+        } else {
+            if ( databaseQueueMessage.getQueueMessageId().compareTo( newest ) > 0 ) {
+                newest = databaseQueueMessage.getQueueMessageId();
+            }
+        }
+        newestByQueueName.put( queueName, newest );
+        getQueue( queueName ).add( databaseQueueMessage );
+    }
+
+    public UUID getNewest( String queueName ) {
+        return newestByQueueName.get( queueName );
+    }
+
+    public DatabaseQueueMessage poll( String queueName ) {
+        return getQueue( queueName ).poll();
+    }
+
+    public int size( String queueName ) {
+        return getQueue( queueName ).size();
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/impl/QueueManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/impl/QueueManagerImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/impl/QueueManagerImpl.java
new file mode 100644
index 0000000..bbb46a8
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/impl/QueueManagerImpl.java
@@ -0,0 +1,125 @@
+/*
+ * 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.qakka.core.impl;
+
+import com.google.inject.Inject;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.qakka.core.QakkaUtils;
+import org.apache.usergrid.persistence.qakka.core.Queue;
+import org.apache.usergrid.persistence.qakka.core.QueueManager;
+import org.apache.usergrid.persistence.qakka.core.Regions;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.apache.usergrid.persistence.qakka.serialization.queues.DatabaseQueue;
+import org.apache.usergrid.persistence.qakka.serialization.queues.QueueSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardSerialization;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class QueueManagerImpl implements QueueManager {
+    private final ActorSystemFig          actorSystemFig;
+    private final QueueSerialization queueSerialization;
+    private final DistributedQueueService distributedQueueService;
+    private final ShardSerialization      shardSerialization;
+
+
+    @Inject
+    public QueueManagerImpl(
+            ActorSystemFig          actorSystemFig,
+            QueueSerialization      queueSerialization,
+            DistributedQueueService distributedQueueService,
+            ShardSerialization      shardSerialization ) {
+
+        this.actorSystemFig          = actorSystemFig;
+        this.queueSerialization      = queueSerialization;
+        this.distributedQueueService = distributedQueueService;
+        this.shardSerialization      = shardSerialization;
+    }
+
+    @Override
+    public void createQueue(Queue queue) {
+
+        queueSerialization.writeQueue(queue.toDatabaseQueue());
+
+        List<String> regions = new ArrayList<>();
+
+        if ( Regions.LOCAL.equals( queue.getRegions() ) || StringUtils.isEmpty( queue.getRegions() ) ) {
+            regions.add( actorSystemFig.getRegionLocal() );
+
+        } else if ( Regions.ALL.equals( queue.getRegions() )) {
+            for ( String region : actorSystemFig.getRegionsList().split(",")) {
+                regions.add( region );
+            }
+
+        } else {
+            for (String region : queue.getRegions().split( "," )) {
+                regions.add( region );
+            }
+        }
+
+        for ( String region : regions ) {
+
+            Shard available = new Shard( queue.getName(), region, Shard.Type.DEFAULT, 1L, QakkaUtils.getTimeUuid());
+            shardSerialization.createShard( available );
+
+            Shard inflight = new Shard( queue.getName(), region, Shard.Type.INFLIGHT, 1L, QakkaUtils.getTimeUuid());
+            shardSerialization.createShard( inflight );
+        }
+
+        distributedQueueService.initQueue( queue.getName() );
+        distributedQueueService.refreshQueue( queue.getName() );
+    }
+
+    @Override
+    public void updateQueueConfig(Queue queue) {
+
+        queueSerialization.writeQueue(queue.toDatabaseQueue());
+
+        distributedQueueService.initQueue( queue.getName() );
+        distributedQueueService.refreshQueue( queue.getName() );
+    }
+
+    @Override
+    public void deleteQueue(String queueName) {
+
+        queueSerialization.deleteQueue(queueName);
+
+        // TODO: implement delete queue for Akka, stop schedulers, etc.
+        //qas.deleteQueue(queueName);
+    }
+
+    @Override
+    public Queue getQueueConfig(String queueName) {
+
+        DatabaseQueue databaseQueue = queueSerialization.getQueue(queueName);
+        if ( databaseQueue != null ) {
+            return new Queue( databaseQueue );
+        }
+        return null;
+    }
+
+    @Override
+    public List<String> getListOfQueues() {
+        return queueSerialization.getListOfQueues();
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/impl/QueueMessageManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/impl/QueueMessageManagerImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/impl/QueueMessageManagerImpl.java
new file mode 100644
index 0000000..bcd0f58
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/impl/QueueMessageManagerImpl.java
@@ -0,0 +1,299 @@
+/*
+ * 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.qakka.core.impl;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.qakka.api.URIStrategy;
+import org.apache.usergrid.persistence.qakka.core.QakkaUtils;
+import org.apache.usergrid.persistence.qakka.core.QueueManager;
+import org.apache.usergrid.persistence.qakka.core.QueueMessage;
+import org.apache.usergrid.persistence.qakka.core.QueueMessageManager;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.apache.usergrid.persistence.qakka.exceptions.BadRequestException;
+import org.apache.usergrid.persistence.qakka.exceptions.NotFoundException;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaRuntimeException;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessageBody;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLogSerialization;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URISyntaxException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.UUID;
+
+
+@Singleton
+public class QueueMessageManagerImpl implements QueueMessageManager {
+
+    private static final Logger logger = LoggerFactory.getLogger( QueueMessageManagerImpl.class );
+
+    private final ActorSystemFig            actorSystemFig;
+    private final QueueManager              queueManager;
+    private final QueueMessageSerialization queueMessageSerialization;
+    private final DistributedQueueService   distributedQueueService;
+    private final TransferLogSerialization  transferLogSerialization;
+    private final URIStrategy uriStrategy;
+
+
+    @Inject
+    public QueueMessageManagerImpl(
+            ActorSystemFig            actorSystemFig,
+            QueueManager              queueManager,
+            QueueMessageSerialization queueMessageSerialization,
+            DistributedQueueService   distributedQueueService,
+            TransferLogSerialization  transferLogSerialization,
+            URIStrategy               uriStrategy
+            ) {
+
+        this.actorSystemFig            = actorSystemFig;
+        this.queueManager              = queueManager;
+        this.queueMessageSerialization = queueMessageSerialization;
+        this.distributedQueueService   = distributedQueueService;
+        this.transferLogSerialization  = transferLogSerialization;
+        this.uriStrategy               = uriStrategy;
+    }
+
+
+    @Override
+    public void sendMessages(String queueName, List<String> destinationRegions,
+            Long delayMs, Long expirationSecs, String contentType, ByteBuffer messageData) {
+
+        // TODO: implement delay and expiration
+
+//        Preconditions.checkArgument(delayMs == null || delayMs > 0L,
+//                "Delay milliseconds must be greater than zero");
+//        Preconditions.checkArgument(expirationSecs == null || expirationSecs > 0L,
+//                "Expiration seconds must be greater than zero");
+
+        if ( queueManager.getQueueConfig( queueName ) == null ) {
+            throw new NotFoundException( "Queue not found: " + queueName );
+        }
+
+        // get current time
+        Long currentTimeMs = System.currentTimeMillis();
+
+        // create message id
+        UUID messageId = QakkaUtils.getTimeUuid();
+
+        Long deliveryTime = delayMs != null ? currentTimeMs + delayMs : null;
+        Long expirationTime = expirationSecs != null ? currentTimeMs + (1000 * expirationSecs) : null;
+
+        // write message data to C*
+        queueMessageSerialization.writeMessageData(
+                messageId, new DatabaseQueueMessageBody(messageData, contentType));
+
+        for (String region : destinationRegions) {
+
+            transferLogSerialization.recordTransferLog(
+                    queueName, actorSystemFig.getRegionLocal(), region, messageId );
+
+            // send message to destination region's queue
+            DistributedQueueService.Status status = null;
+            try {
+                status = distributedQueueService.sendMessageToRegion(
+                        queueName,
+                        actorSystemFig.getRegionLocal(),
+                        region,
+                        messageId,
+                        deliveryTime,
+                        expirationTime );
+
+                //logger.debug("Send message to queueName {} in region {}", queueName, region );
+
+            } catch ( QakkaRuntimeException qae ) {
+                logger.error("Error sending message " + messageId + " to " + region, qae);
+            }
+        }
+    }
+
+
+    @Override
+    public List<QueueMessage> getNextMessages(String queueName, int count) {
+
+        if ( queueManager.getQueueConfig( queueName ) == null ) {
+            throw new NotFoundException( "Queue not found: " + queueName );
+        }
+
+        Collection<DatabaseQueueMessage> dbMessages = distributedQueueService.getNextMessages( queueName, count );
+
+        List<QueueMessage> queueMessages = joinMessages( queueName, dbMessages );
+
+        if ( queueMessages.size() < count && queueMessages.size() < dbMessages.size() ) {
+            logger.debug("Messages failed to join for queue:{}, get more", queueName);
+
+            // some messages failed to join, get more
+            dbMessages = distributedQueueService.getNextMessages( queueName, count - queueMessages.size() );
+            queueMessages.addAll( joinMessages( queueName, dbMessages ) );
+        }
+
+        return queueMessages;
+    }
+
+
+    private List<QueueMessage> joinMessages( String queueName, Collection<DatabaseQueueMessage> dbMessages) {
+
+        List<QueueMessage> queueMessages = new ArrayList<>();
+
+        for (DatabaseQueueMessage dbMessage : dbMessages) {
+
+            DatabaseQueueMessageBody data = queueMessageSerialization.loadMessageData( dbMessage.getMessageId() );
+
+            if ( data != null ) {
+
+                QueueMessage queueMessage = new QueueMessage(
+                        dbMessage.getQueueMessageId(),
+                        queueName,
+                        null,                    // sending region
+                        dbMessage.getRegion(),   // receiving region
+                        dbMessage.getMessageId(),
+                        null,                    // delay until date
+                        null,                    // expiration date
+                        dbMessage.getQueuedAt(),
+                        null,                    // retries
+                        true );
+
+                queueMessage.setContentType( data.getContentType() );
+                if ( "application/json".equals( data.getContentType() )) {
+                    try {
+                        String json = new String( data.getBlob().array(), "UTF-8");
+                        queueMessage.setData( json );
+
+                    } catch (UnsupportedEncodingException e) {
+                        logger.error("Error unencoding data for messageId=" + queueMessage.getMessageId(), e);
+                    }
+                } else {
+                    try {
+                        queueMessage.setHref( uriStrategy.queueMessageDataURI(
+                                queueName, queueMessage.getQueueMessageId()).toString());
+
+                    } catch (URISyntaxException e) {
+                        throw new QakkaRuntimeException( "Error forming URI for message data", e );
+                    }
+                }
+
+                queueMessages.add( queueMessage );
+            }
+        }
+
+        return queueMessages;
+    }
+
+
+    @Override
+    public void ackMessage(String queueName, UUID queueMessageId) {
+
+        if ( queueManager.getQueueConfig( queueName ) == null ) {
+            throw new NotFoundException( "Queue not found: " + queueName );
+        }
+
+        DistributedQueueService.Status status = distributedQueueService.ackMessage( queueName, queueMessageId );
+
+        if ( DistributedQueueService.Status.BAD_REQUEST.equals( status )) {
+            throw new BadRequestException( "Message not inflight" );
+
+        } else if ( DistributedQueueService.Status.ERROR.equals( status )) {
+            throw new QakkaRuntimeException( "Unable to ack message due to error" );
+        }
+    }
+
+
+    @Override
+    public void requeueMessage(String queueName, UUID messageId, Long delayMs) {
+
+        if ( queueManager.getQueueConfig( queueName ) == null ) {
+            throw new NotFoundException( "Queue not found: " + queueName );
+        }
+
+        // TODO: implement requeueMessage
+
+        throw new UnsupportedOperationException( "requeueMessage not yet implemented" );
+    }
+
+
+    @Override
+    public void clearMessages(String queueName) {
+
+        if ( queueManager.getQueueConfig( queueName ) == null ) {
+            throw new NotFoundException( "Queue not found: " + queueName );
+        }
+
+        // TODO: implement clearMessages
+
+        throw new UnsupportedOperationException( "clearMessages not yet implemented" );
+    }
+
+
+    @Override
+    public ByteBuffer getMessageData( UUID messageId ) {
+        DatabaseQueueMessageBody body = queueMessageSerialization.loadMessageData( messageId );
+        return body != null ? body.getBlob() : null;
+    }
+
+
+    /**
+     * Get but do not put inflight specified queue message, first looking in INFLIGHT table then DEFAULT.
+     */
+    @Override
+    public QueueMessage getMessage( String queueName, UUID queueMessageId ) {
+
+        QueueMessage queueMessage = null;
+
+        // first look in INFLIGHT storage
+
+
+        DatabaseQueueMessage dbMessage = queueMessageSerialization.loadMessage(
+                queueName, actorSystemFig.getRegionLocal(), null,
+                DatabaseQueueMessage.Type.INFLIGHT, queueMessageId );
+
+        if ( dbMessage == null ) {
+
+            // not found, so now look in DEFAULT storage
+
+            dbMessage = queueMessageSerialization.loadMessage(
+                queueName, actorSystemFig.getRegionLocal(), null,
+                DatabaseQueueMessage.Type.DEFAULT, queueMessageId );
+        }
+
+        if ( dbMessage != null ) {
+            queueMessage = new QueueMessage(
+                    dbMessage.getQueueMessageId(),
+                    queueName,
+                    null,                    // sending region
+                    dbMessage.getRegion(),   // receiving region
+                    dbMessage.getMessageId(),
+                    null,                    // delay until date
+                    null,                    // expiration date
+                    dbMessage.getQueuedAt(),
+                    null,                    // retries
+                    true );
+        }
+
+        return queueMessage;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/DistributedQueueService.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/DistributedQueueService.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/DistributedQueueService.java
new file mode 100644
index 0000000..c2ca6b1
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/DistributedQueueService.java
@@ -0,0 +1,60 @@
+/*
+ * 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.qakka.distributed;
+
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+
+import java.util.Collection;
+import java.util.UUID;
+
+
+/**
+ * Interface to distributed part of Qakka queue implementation.
+ */
+public interface DistributedQueueService {
+
+    enum Status { SUCCESS, ERROR, BAD_REQUEST };
+
+    void init();
+
+    void initQueue(String queueName);
+
+    void refresh();
+
+    void refreshQueue(String queueName);
+
+    void processTimeouts();
+
+    Status sendMessageToRegion(
+        String queueName,
+        String sourceRegion,
+        String destRegion,
+        UUID messageId,
+        Long deliveryTime,
+        Long expirationTime);
+
+    Collection<DatabaseQueueMessage> getNextMessages(String queueName, int numMessages);
+
+    Status ackMessage(String queueName, UUID messageId);
+
+    Status requeueMessage(String queueName, UUID messageId);
+
+    Status clearMessages(String queueName);
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActor.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActor.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActor.java
new file mode 100644
index 0000000..6ecffba
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActor.java
@@ -0,0 +1,207 @@
+/*
+ * 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.qakka.distributed.actors;
+
+import akka.actor.ActorRef;
+import akka.actor.Cancellable;
+import akka.actor.Props;
+import akka.actor.UntypedActor;
+import com.codahale.metrics.Timer;
+import com.google.inject.Injector;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.MetricsService;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.core.impl.InMemoryQueue;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.apache.usergrid.persistence.qakka.distributed.messages.*;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import scala.concurrent.duration.Duration;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+
+public class QueueActor extends UntypedActor {
+    private static final Logger logger = LoggerFactory.getLogger( QueueActor.class );
+
+    private final QakkaFig qakkaFig;
+    private final InMemoryQueue inMemoryQueue;
+    private final QueueActorHelper queueActorHelper;
+    private final MetricsService   metricsService;
+
+    private final Map<String, Cancellable> refreshSchedulersByQueueName = new HashMap<>();
+    private final Map<String, Cancellable> timeoutSchedulersByQueueName = new HashMap<>();
+    private final Map<String, Cancellable> shardAllocationSchedulersByQueueName = new HashMap<>();
+
+    private final Map<String, ActorRef> queueReadersByQueueName    = new HashMap<>();
+    private final Map<String, ActorRef> queueTimeoutersByQueueName = new HashMap<>();
+    private final Map<String, ActorRef> shardAllocatorsByQueueName = new HashMap<>();
+
+
+    public QueueActor() {
+
+        Injector injector = App.INJECTOR;
+
+        qakkaFig         = injector.getInstance( QakkaFig.class );
+        inMemoryQueue    = injector.getInstance( InMemoryQueue.class );
+        queueActorHelper = injector.getInstance( QueueActorHelper.class );
+        metricsService   = injector.getInstance( MetricsService.class );
+    }
+
+    @Override
+    public void onReceive(Object message) {
+
+        if ( message instanceof QueueInitRequest) {
+            QueueInitRequest request = (QueueInitRequest)message;
+
+            if ( refreshSchedulersByQueueName.get( request.getQueueName() ) == null ) {
+                Cancellable scheduler = getContext().system().scheduler().schedule(
+                    Duration.create( 0, TimeUnit.MILLISECONDS),
+                    Duration.create( qakkaFig.getQueueRefreshMilliseconds(), TimeUnit.MILLISECONDS),
+                    self(),
+                    new QueueRefreshRequest( request.getQueueName() ),
+                    getContext().dispatcher(),
+                    getSelf());
+                refreshSchedulersByQueueName.put( request.getQueueName(), scheduler );
+            }
+
+            if ( timeoutSchedulersByQueueName.get( request.getQueueName() ) == null ) {
+                Cancellable scheduler = getContext().system().scheduler().schedule(
+                        Duration.create( 0, TimeUnit.MILLISECONDS),
+                        Duration.create( qakkaFig.getQueueTimeoutSeconds()/2, TimeUnit.SECONDS),
+                        self(),
+                        new QueueTimeoutRequest( request.getQueueName() ),
+                        getContext().dispatcher(),
+                        getSelf());
+                timeoutSchedulersByQueueName.put( request.getQueueName(), scheduler );
+            }
+
+            if ( shardAllocationSchedulersByQueueName.get( request.getQueueName() ) == null ) {
+                Cancellable scheduler = getContext().system().scheduler().schedule(
+                        Duration.create( 0, TimeUnit.MILLISECONDS),
+                        Duration.create( qakkaFig.getShardAllocationCheckFrequencyMillis(), TimeUnit.MILLISECONDS),
+                        self(),
+                        new ShardCheckRequest( request.getQueueName() ),
+                        getContext().dispatcher(),
+                        getSelf());
+                shardAllocationSchedulersByQueueName.put( request.getQueueName(), scheduler );
+            }
+
+        } else if ( message instanceof QueueRefreshRequest ) {
+            QueueRefreshRequest request = (QueueRefreshRequest)message;
+
+            if ( queueReadersByQueueName.get( request.getQueueName() ) == null ) {
+                ActorRef readerRef = getContext().actorOf( Props.create(
+                    QueueRefresher.class, request.getQueueName()), request.getQueueName() + "_reader");
+                queueReadersByQueueName.put( request.getQueueName(), readerRef );
+            }
+
+            // hand-off to queue's reader
+            queueReadersByQueueName.get( request.getQueueName() ).tell( request, self() );
+
+        } else if ( message instanceof QueueTimeoutRequest ) {
+            QueueTimeoutRequest request = (QueueTimeoutRequest)message;
+
+            if ( queueTimeoutersByQueueName.get( request.getQueueName() ) == null ) {
+                ActorRef readerRef = getContext().actorOf( Props.create(
+                    QueueTimeouter.class, request.getQueueName()), request.getQueueName() + "_timeouter");
+                queueTimeoutersByQueueName.put( request.getQueueName(), readerRef );
+            }
+
+            // hand-off to queue's timeouter
+            queueTimeoutersByQueueName.get( request.getQueueName() ).tell( request, self() );
+
+
+        } else if ( message instanceof ShardCheckRequest ) {
+            ShardCheckRequest request = (ShardCheckRequest)message;
+
+            if ( shardAllocatorsByQueueName.get( request.getQueueName() ) == null ) {
+                ActorRef readerRef = getContext().actorOf( Props.create(
+                        ShardAllocator.class, request.getQueueName()), request.getQueueName() + "_shard_allocator");
+                shardAllocatorsByQueueName.put( request.getQueueName(), readerRef );
+            }
+
+            // hand-off to queue's shard allocator
+            shardAllocatorsByQueueName.get( request.getQueueName() ).tell( request, self() );
+
+
+        } else if ( message instanceof QueueGetRequest) {
+
+            Timer.Context timer = metricsService.getMetricRegistry().timer( MetricsService.GET_TIME_GET ).time();
+            try {
+                QueueGetRequest queueGetRequest = (QueueGetRequest) message;
+
+                Collection<DatabaseQueueMessage> queueMessages = new ArrayList<>();
+
+                while (queueMessages.size() < queueGetRequest.getNumRequested()) {
+
+                    DatabaseQueueMessage queueMessage = inMemoryQueue.poll( queueGetRequest.getQueueName() );
+
+                    if (queueMessage != null) {
+                        if (queueActorHelper.putInflight( queueGetRequest.getQueueName(), queueMessage )) {
+                            queueMessages.add( queueMessage );
+                        }
+                    } else {
+                        logger.debug("in-memory queue for {} is empty, object is: {}",
+                                queueGetRequest.getQueueName(), inMemoryQueue );
+                        break;
+                    }
+                }
+
+                getSender().tell( new QueueGetResponse(
+                        DistributedQueueService.Status.SUCCESS, queueMessages ), getSender() );
+
+            } finally {
+                timer.close();
+            }
+
+
+        } else if ( message instanceof QueueAckRequest) {
+
+            Timer.Context timer = metricsService.getMetricRegistry().timer( MetricsService.ACK_TIME_ACK ).time();
+            try {
+
+                QueueAckRequest queueAckRequest = (QueueAckRequest) message;
+
+                DistributedQueueService.Status status = queueActorHelper.ackQueueMessage(
+                        queueAckRequest.getQueueName(),
+                        queueAckRequest.getQueueMessageId() );
+
+                getSender().tell( new QueueAckResponse(
+                        queueAckRequest.getQueueName(),
+                        queueAckRequest.getQueueMessageId(),
+                        status ), getSender() );
+
+            } finally {
+                timer.close();
+            }
+
+        } else {
+            unhandled( message );
+        }
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelper.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelper.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelper.java
new file mode 100644
index 0000000..26db903
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelper.java
@@ -0,0 +1,167 @@
+/*
+ * 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.qakka.distributed.actors;
+
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLog;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLogSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.UUID;
+
+
+public class QueueActorHelper {
+    private static final Logger logger = LoggerFactory.getLogger( QueueActorHelper.class );
+
+    private final ActorSystemFig            actorSystemFig;
+    private final QueueMessageSerialization messageSerialization;
+    private final AuditLogSerialization     auditLogSerialization;
+
+
+    @Inject
+    public QueueActorHelper(
+            ActorSystemFig actorSystemFig,
+            QueueMessageSerialization messageSerialization,
+            AuditLogSerialization auditLogSerialization
+            ) {
+
+        this.actorSystemFig = actorSystemFig;
+        this.messageSerialization = messageSerialization;
+        this.auditLogSerialization = auditLogSerialization;
+    }
+
+
+    DatabaseQueueMessage loadDatabaseQueueMessage(
+            String queueName, UUID queueMessageId, DatabaseQueueMessage.Type type ) {
+
+        try {
+            return messageSerialization.loadMessage(
+                    queueName,
+                    actorSystemFig.getRegionLocal(),
+                    null,
+                    type,
+                    queueMessageId );
+
+        } catch (Throwable t) {
+            logger.error( "Error reading queueMessage", t );
+        }
+
+        return null;
+    }
+
+
+    DistributedQueueService.Status ackQueueMessage(String queueName, UUID queueMessageId ) {
+
+        DatabaseQueueMessage queueMessage = loadDatabaseQueueMessage(
+                queueName, queueMessageId, DatabaseQueueMessage.Type.INFLIGHT );
+
+        if ( queueMessage == null ) {
+            return DistributedQueueService.Status.BAD_REQUEST;
+        }
+
+        boolean error = false;
+        try {
+            messageSerialization.deleteMessage(
+                    queueName,
+                    actorSystemFig.getRegionLocal(),
+                    null,
+                    DatabaseQueueMessage.Type.INFLIGHT,
+                    queueMessageId );
+
+        } catch (Throwable t) {
+            logger.error( "Error deleting queueMessage for ack", t );
+            error = true;
+        }
+
+        if ( !error ) {
+
+            auditLogSerialization.recordAuditLog(
+                    AuditLog.Action.ACK,
+                    AuditLog.Status.SUCCESS,
+                    queueName,
+                    actorSystemFig.getRegionLocal(),
+                    queueMessage.getMessageId(),
+                    queueMessageId );
+
+            return DistributedQueueService.Status.SUCCESS;
+
+        } else {
+
+            auditLogSerialization.recordAuditLog(
+                    AuditLog.Action.ACK,
+                    AuditLog.Status.ERROR,
+                    queueName,
+                    actorSystemFig.getRegionLocal(),
+                    queueMessage.getMessageId(),
+                    queueMessageId );
+
+            return DistributedQueueService.Status.ERROR;
+        }
+    }
+
+
+    boolean putInflight( String queueName, DatabaseQueueMessage queueMessage ) {
+
+        UUID qmid = queueMessage.getQueueMessageId();
+        try {
+            queueMessage.setType( DatabaseQueueMessage.Type.INFLIGHT );
+            queueMessage.setShardId( null );
+            queueMessage.setInflightAt( System.currentTimeMillis() );
+            messageSerialization.writeMessage( queueMessage );
+
+            messageSerialization.deleteMessage(
+                    queueName,
+                    actorSystemFig.getRegionLocal(),
+                    null,
+                    DatabaseQueueMessage.Type.DEFAULT,
+                    qmid);
+
+            //logger.debug("Put message {} inflight for queue name {}", qmid, queueName);
+
+        } catch ( Throwable t ) {
+            logger.error("Error putting inflight queue message " + qmid + " queue name: " + queueName, t);
+
+            auditLogSerialization.recordAuditLog(
+                    AuditLog.Action.GET,
+                    AuditLog.Status.ERROR,
+                    queueName,
+                    actorSystemFig.getRegionLocal(),
+                    queueMessage.getMessageId(),
+                    qmid);
+
+            return false;
+        }
+
+        auditLogSerialization.recordAuditLog(
+                AuditLog.Action.GET,
+                AuditLog.Status.SUCCESS,
+                queueName,
+                actorSystemFig.getRegionLocal(),
+                queueMessage.getMessageId(),
+                qmid);
+
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorRouter.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorRouter.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorRouter.java
new file mode 100644
index 0000000..97e591c
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorRouter.java
@@ -0,0 +1,95 @@
+/*
+ * 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.qakka.distributed.actors;
+
+import akka.actor.ActorRef;
+import akka.actor.Props;
+import akka.actor.UntypedActor;
+import akka.routing.ConsistentHashingRouter;
+import akka.routing.FromConfig;
+import org.apache.usergrid.persistence.qakka.distributed.messages.*;
+
+
+/**
+ * Use consistent hashing to route messages to QueueActors
+ */
+public class QueueActorRouter extends UntypedActor {
+
+    private final ActorRef routerRef;
+
+
+    public QueueActorRouter() {
+        routerRef = getContext().actorOf(
+                FromConfig.getInstance().props( Props.create(QueueActor.class)), "router");
+    }
+
+    @Override
+    public void onReceive(Object message) {
+
+        // TODO: can we do something smarter than this if-then-else structure
+        // e.g. if message is recognized as one of ours, then we just pass it on?
+
+        if ( message instanceof QueueGetRequest) {
+            QueueGetRequest qgr = (QueueGetRequest) message;
+
+            ConsistentHashingRouter.ConsistentHashableEnvelope envelope =
+                    new ConsistentHashingRouter.ConsistentHashableEnvelope( message, qgr.getQueueName() );
+            routerRef.tell( envelope, getSender() );
+
+        } else if ( message instanceof QueueAckRequest) {
+            QueueAckRequest qar = (QueueAckRequest)message;
+
+            ConsistentHashingRouter.ConsistentHashableEnvelope envelope =
+                    new ConsistentHashingRouter.ConsistentHashableEnvelope( message, qar.getQueueName() );
+            routerRef.tell( envelope, getSender());
+
+        } else if ( message instanceof QueueInitRequest) {
+            QueueInitRequest qar = (QueueInitRequest)message;
+
+            ConsistentHashingRouter.ConsistentHashableEnvelope envelope =
+                    new ConsistentHashingRouter.ConsistentHashableEnvelope( message, qar.getQueueName() );
+            routerRef.tell( envelope, getSender());
+
+        } else if ( message instanceof QueueRefreshRequest) {
+            QueueRefreshRequest qar = (QueueRefreshRequest)message;
+
+            ConsistentHashingRouter.ConsistentHashableEnvelope envelope =
+                    new ConsistentHashingRouter.ConsistentHashableEnvelope( message, qar.getQueueName() );
+            routerRef.tell( envelope, getSender());
+
+        } else if ( message instanceof QueueTimeoutRequest) {
+            QueueTimeoutRequest qar = (QueueTimeoutRequest)message;
+
+            ConsistentHashingRouter.ConsistentHashableEnvelope envelope =
+                    new ConsistentHashingRouter.ConsistentHashableEnvelope( message, qar.getQueueName() );
+            routerRef.tell( envelope, getSender());
+
+        } else if ( message instanceof ShardCheckRequest) {
+            ShardCheckRequest qar = (ShardCheckRequest)message;
+
+            ConsistentHashingRouter.ConsistentHashableEnvelope envelope =
+                    new ConsistentHashingRouter.ConsistentHashableEnvelope( message, qar.getQueueName() );
+            routerRef.tell( envelope, getSender());
+
+        } else {
+            unhandled(message);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueRefresher.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueRefresher.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueRefresher.java
new file mode 100644
index 0000000..03ab1ec
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueRefresher.java
@@ -0,0 +1,124 @@
+/*
+ * 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.qakka.distributed.actors;
+
+import akka.actor.UntypedActor;
+import com.codahale.metrics.Timer;
+import com.google.inject.Injector;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.MetricsService;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.core.impl.InMemoryQueue;
+import org.apache.usergrid.persistence.qakka.distributed.messages.QueueRefreshRequest;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaRuntimeException;
+import org.apache.usergrid.persistence.qakka.serialization.MultiShardMessageIterator;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardIterator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Optional;
+import java.util.UUID;
+
+
+public class QueueRefresher extends UntypedActor {
+    private static final Logger logger = LoggerFactory.getLogger( QueueRefresher.class );
+
+    private final String                    queueName;
+
+    private final QueueMessageSerialization serialization;
+    private final InMemoryQueue             inMemoryQueue;
+    private final QakkaFig qakkaFig;
+    private final ActorSystemFig            actorSystemFig;
+    private final MetricsService            metricsService;
+    private final CassandraClient cassandraClient;
+
+    public QueueRefresher(String queueName ) {
+        this.queueName = queueName;
+
+        Injector injector = App.INJECTOR;
+
+        serialization  = injector.getInstance( QueueMessageSerialization.class );
+        inMemoryQueue  = injector.getInstance( InMemoryQueue.class );
+        qakkaFig       = injector.getInstance( QakkaFig.class );
+        actorSystemFig = injector.getInstance( ActorSystemFig.class );
+        metricsService = injector.getInstance( MetricsService.class );
+        cassandraClient = injector.getInstance( CassandraClientImpl.class );
+    }
+
+
+    @Override
+    public void onReceive(Object message) {
+
+        if ( message instanceof QueueRefreshRequest ) {
+
+            QueueRefreshRequest request = (QueueRefreshRequest) message;
+
+            if (!request.getQueueName().equals( queueName )) {
+                throw new QakkaRuntimeException(
+                        "QueueWriter for " + queueName + ": Incorrect queueName " + request.getQueueName() );
+            }
+
+            Timer.Context timer = metricsService.getMetricRegistry().timer( MetricsService.REFRESH_TIME).time();
+
+            try {
+
+                if (inMemoryQueue.size( queueName ) < qakkaFig.getQueueInMemorySize()) {
+
+                    ShardIterator shardIterator = new ShardIterator(
+                            cassandraClient, queueName, actorSystemFig.getRegionLocal(),
+                            Shard.Type.DEFAULT, Optional.empty() );
+
+                    UUID since = inMemoryQueue.getNewest( queueName );
+
+                    String region = actorSystemFig.getRegionLocal();
+                    MultiShardMessageIterator multiShardIterator = new MultiShardMessageIterator(
+                            cassandraClient, queueName, region, DatabaseQueueMessage.Type.DEFAULT,
+                            shardIterator, since);
+
+                    int need = qakkaFig.getQueueInMemorySize() - inMemoryQueue.size( queueName );
+                    int count = 0;
+
+                    while ( multiShardIterator.hasNext() && count < need ) {
+                        DatabaseQueueMessage queueMessage = multiShardIterator.next();
+                        inMemoryQueue.add( queueName, queueMessage );
+                        count++;
+                    }
+
+                    if ( count > 0 ) {
+                        logger.debug( "Added {} in-memory for queue {}, new size = {}",
+                                count, queueName, inMemoryQueue.size( queueName ) );
+                    }
+                }
+
+            } finally {
+                timer.close();
+            }
+
+        } else {
+            unhandled( message );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueSender.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueSender.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueSender.java
new file mode 100644
index 0000000..8bd733b
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueSender.java
@@ -0,0 +1,220 @@
+/*
+ * 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.qakka.distributed.actors;
+
+import akka.actor.ActorRef;
+import akka.actor.UntypedActor;
+import akka.cluster.client.ClusterClient;
+import akka.pattern.Patterns;
+import akka.util.Timeout;
+import com.codahale.metrics.Timer;
+import com.google.inject.Injector;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemManager;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.MetricsService;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.apache.usergrid.persistence.qakka.distributed.messages.QueueSendRequest;
+import org.apache.usergrid.persistence.qakka.distributed.messages.QueueSendResponse;
+import org.apache.usergrid.persistence.qakka.distributed.messages.QueueWriteRequest;
+import org.apache.usergrid.persistence.qakka.distributed.messages.QueueWriteResponse;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaException;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaRuntimeException;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLog;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLogSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLogSerialization;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import scala.concurrent.Await;
+import scala.concurrent.Future;
+
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+
+public class QueueSender extends UntypedActor {
+    private static final Logger logger = LoggerFactory.getLogger( QueueSender.class );
+
+    private final String name = RandomStringUtils.randomAlphanumeric( 4 );
+
+    private final ActorSystemManager        actorSystemManager;
+    private final TransferLogSerialization  transferLogSerialization;
+    private final AuditLogSerialization     auditLogSerialization;
+    private final ActorSystemFig            actorSystemFig;
+    private final QakkaFig qakkaFig;
+    private final MetricsService            metricsService;
+
+    public QueueSender() {
+
+        Injector injector = App.INJECTOR;
+
+        actorSystemManager       = injector.getInstance( ActorSystemManager.class );
+        transferLogSerialization = injector.getInstance( TransferLogSerialization.class );
+        auditLogSerialization    = injector.getInstance( AuditLogSerialization.class );
+        actorSystemFig           = injector.getInstance( ActorSystemFig.class );
+        qakkaFig                 = injector.getInstance( QakkaFig.class );
+        metricsService           = injector.getInstance( MetricsService.class );
+    }
+
+    @Override
+    public void onReceive(Object message) {
+
+        if ( message instanceof QueueSendRequest) {
+            QueueSendRequest qa =  (QueueSendRequest) message;
+
+            // as far as caller is concerned, we are done.
+            getSender().tell( new QueueSendResponse(
+                    DistributedQueueService.Status.SUCCESS ), getSender() );
+
+            final QueueWriter.WriteStatus writeStatus = sendMessageToRegion(
+                    qa.getQueueName(),
+                    qa.getSourceRegion(),
+                    qa.getDestRegion(),
+                    qa.getMessageId(),
+                    qa.getDeliveryTime(),
+                    qa.getExpirationTime() );
+
+            logResponse( writeStatus, qa.getQueueName(), qa.getDestRegion(), qa.getMessageId() );
+
+        } else {
+            unhandled( message );
+        }
+    }
+
+
+    QueueWriter.WriteStatus sendMessageToRegion(
+
+            String queueName,
+            String sourceRegion,
+            String destRegion,
+            UUID messageId,
+            Long deliveryTime,
+            Long expirationTime ) {
+
+        Timer.Context timer = metricsService.getMetricRegistry().timer( MetricsService.SEND_TIME_SEND ).time();
+        try {
+
+            int maxRetries = qakkaFig.getMaxSendRetries();
+            int retries = 0;
+
+            QueueWriteRequest request = new QueueWriteRequest(
+                    queueName, sourceRegion, destRegion, messageId, deliveryTime, expirationTime );
+
+            while (retries++ < maxRetries) {
+                try {
+                    Timeout t = new Timeout( qakkaFig.getSendTimeoutSeconds(), TimeUnit.SECONDS );
+
+                    Future<Object> fut;
+
+                    if (actorSystemManager.getCurrentRegion().equals( destRegion )) {
+
+                        // send to current region via local clientActor
+                        ActorRef clientActor = actorSystemManager.getClientActor();
+                        fut = Patterns.ask( clientActor, request, t );
+
+                    } else {
+
+                        // send to remote region via cluster client for that region
+                        ActorRef clusterClient = actorSystemManager.getClusterClient( destRegion );
+                        fut = Patterns.ask(
+                                clusterClient, new ClusterClient.Send( "/user/clientActor", request ), t );
+                    }
+
+                    // wait for response...
+                    final Object response = Await.result( fut, t.duration() );
+
+                    if (response != null && response instanceof QueueWriteResponse) {
+                        QueueWriteResponse qarm = (QueueWriteResponse) response;
+                        if (!QueueWriter.WriteStatus.ERROR.equals( qarm.getSendStatus() )) {
+
+                            if (retries > 1) {
+                                logger.debug( "queueAdd TOTAL_SUCCESS after {} retries", retries );
+                            }
+                            return qarm.getSendStatus();
+
+                        } else {
+                            logger.debug( "ERROR STATUS adding to queue, retrying {}", retries );
+                        }
+
+                    } else if (response != null) {
+                        logger.debug( "NULL RESPONSE adding to queue, retrying {}", retries );
+
+                    } else {
+                        logger.debug( "TIMEOUT adding to queue, retrying {}", retries );
+                    }
+
+                } catch (Exception e) {
+                    logger.debug( "ERROR adding to queue, retrying " + retries, e );
+                }
+            }
+
+            throw new QakkaRuntimeException( "Error adding to queue after " + retries );
+
+        } finally {
+            timer.stop();
+        }
+    }
+
+
+    void logResponse( QueueWriter.WriteStatus writeStatus, String queueName, String region, UUID messageId ) {
+
+        if ( writeStatus != null
+                && writeStatus.equals( QueueWriter.WriteStatus.ERROR ) ) {
+
+            logger.debug( "ERROR status sending message: {}, {}, {}, {}",
+                    new Object[]{queueName, actorSystemFig.getRegionLocal(), region, messageId} );
+
+            auditLogSerialization.recordAuditLog(
+                    AuditLog.Action.SEND,
+                    AuditLog.Status.ERROR,
+                    queueName,
+                    region,
+                    messageId,
+                    null);
+
+        } else if ( writeStatus != null
+                && writeStatus.equals( QueueWriter.WriteStatus.SUCCESS_XFERLOG_NOTDELETED ) ) {
+
+            //logger.debug( "Delivery Success, now removing transfer log: {}, {}, {}, {}",
+            //        new Object[]{queueName, actorSystemFig.getRegionLocal(), region, messageId} );
+
+            // queue actor failed to clean up transfer log
+            try {
+                transferLogSerialization.removeTransferLog(
+                        queueName, actorSystemFig.getRegionLocal(), region, messageId );
+
+            } catch (QakkaException se) {
+                logger.error( "Unable to delete remove transfer log for {}, {}, {}, {}",
+                        new Object[]{queueName, actorSystemFig.getRegionLocal(), region, messageId} );
+                logger.debug( "Unable to delete remove transfer log exception is:", se );
+            }
+
+        } else if ( writeStatus != null
+                && writeStatus.equals( QueueWriter.WriteStatus.SUCCESS_XFERLOG_DELETED ) ) {
+
+            //logger.debug( "Delivery Success: {}, {}, {}, {}",
+            //        new Object[]{queueName, actorSystemFig.getRegionLocal(), region, messageId} );
+        }
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueSenderRouter.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueSenderRouter.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueSenderRouter.java
new file mode 100644
index 0000000..20603a5
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueSenderRouter.java
@@ -0,0 +1,53 @@
+/*
+ * 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.qakka.distributed.actors;
+
+import akka.actor.ActorRef;
+import akka.actor.Props;
+import akka.actor.UntypedActor;
+import akka.routing.FromConfig;
+import org.apache.usergrid.persistence.qakka.distributed.messages.QueueSendRequest;
+
+
+/**
+ * Route messages to QueueWriters
+ */
+public class QueueSenderRouter extends UntypedActor {
+
+    private final ActorRef router;
+
+
+    public QueueSenderRouter() {
+
+        router = getContext().actorOf(
+                FromConfig.getInstance().props(Props.create(QueueSender.class )), "router");
+    }
+
+    @Override
+    public void onReceive(Object message) {
+
+        if ( message instanceof QueueSendRequest) {
+            router.tell( message, getSender() );
+
+        } else {
+            unhandled(message);
+        }
+    }
+}


[07/25] usergrid git commit: Initial integration of Qakka into Usergrid Queue module, and implementation of Qakka-based LegacyQueueManager implementation.

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIteratorTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIteratorTest.java
new file mode 100644
index 0000000..572c897
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIteratorTest.java
@@ -0,0 +1,139 @@
+/*
+ * 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.qakka.serialization.sharding;
+
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardSerializationImpl;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.core.QakkaUtils;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+import static org.junit.Assert.assertTrue;
+
+
+/**
+ * Created by russo on 6/9/16.
+ */
+public class ShardIteratorTest extends AbstractTest {
+
+    private static final Logger logger = LoggerFactory.getLogger( ShardIteratorTest.class );
+
+    @Test
+    public void getActiveShards(){
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
+
+        Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
+        Shard shard2 = new Shard("test", "region1", Shard.Type.DEFAULT, 200L, null);
+
+        shardSerialization.createShard(shard1);
+        shardSerialization.createShard(shard2);
+
+        Iterator<Shard> shardIterator = new ShardIterator(
+                cassandraClient, "test", "region1", Shard.Type.DEFAULT, Optional.empty());
+
+        List<Shard> shards = new ArrayList<>(1);
+
+
+        shardIterator.forEachRemaining(shard -> {
+
+            logger.info("Shard ID: {}", shard.getShardId());
+            shards.add(shard);
+
+        });
+
+        assertTrue(shards.size() == 2 && shards.get(0).equals(shard1) && shards.get(1).equals(shard2));
+
+
+    }
+
+    @Test
+    public void seekActiveShards(){
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
+        
+        Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
+        Shard shard2 = new Shard("test", "region1", Shard.Type.DEFAULT, 200L, null);
+        Shard shard3 = new Shard("test", "region1", Shard.Type.DEFAULT, 300L, null);
+
+        shardSerialization.createShard(shard1);
+        shardSerialization.createShard(shard2);
+        shardSerialization.createShard(shard3);
+
+
+        Iterator<Shard> shardIterator = new ShardIterator(
+                cassandraClient, "test", "region1", Shard.Type.DEFAULT, Optional.of(200L));
+
+        List<Shard> shards = new ArrayList<>(1);
+
+        shardIterator.forEachRemaining(shard -> {
+
+            logger.info("Shard ID: {}", shard.getShardId());
+            shards.add(shard);
+
+        });
+
+        assertTrue(shards.size() == 1 && shards.get(0).equals(shard3));
+    }
+
+
+    @Test
+    public void shardIteratorOrdering() throws Exception {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
+
+        int numShards = 10;
+        String region = "default";
+        String queueName = "sit_queue_" + RandomStringUtils.randomAlphanumeric(20);
+        
+        for ( long i=0; i<numShards; i++) {
+            UUID messageId = QakkaUtils.getTimeUuid();
+            Shard shard = new Shard( queueName, region, Shard.Type.DEFAULT, i+1, messageId );
+            shardSerialization.createShard( shard );
+            try { Thread.sleep(10); } catch (Exception intentionallyIgnored) {}
+        }
+        
+        Iterator<Shard> shardIterator = new ShardIterator(
+                cassandraClient, queueName, region, Shard.Type.DEFAULT, Optional.empty()); 
+
+        int count = 0;
+        Long prevTimestamp = null;
+        while ( shardIterator.hasNext() ) {
+            Shard shard = shardIterator.next();
+            if ( prevTimestamp != null ) {
+                Assert.assertTrue( prevTimestamp < shard.getPointer().timestamp() );
+            }
+            prevTimestamp = shard.getPointer().timestamp();
+            count++;
+        }
+        
+        Assert.assertEquals( numShards, count );
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardSerializationTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardSerializationTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardSerializationTest.java
new file mode 100644
index 0000000..e1a541b
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardSerializationTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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.qakka.serialization.sharding;
+
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.core.QakkaUtils;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardSerializationImpl;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.UUID;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+
+/**
+ * Created by russo on 6/8/16.
+ */
+public class ShardSerializationTest extends AbstractTest {
+
+    private static final Logger logger = LoggerFactory.getLogger( ShardSerializationTest.class );
+
+
+    @Test
+    public void writeNewShard(){
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
+
+        Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
+        shardSerialization.createShard(shard1);
+    }
+
+    @Test
+    public void deleteShard(){
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
+
+        Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
+
+        shardSerialization.createShard(shard1);
+        shardSerialization.deleteShard(shard1);
+        assertNull(shardSerialization.loadShard(shard1));
+
+
+
+    }
+
+    @Test
+    public void loadNullShard(){
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
+
+        Shard shard1 = new Shard("junk", "region1", Shard.Type.DEFAULT, 100L, null);
+
+        assertNull(shardSerialization.loadShard(shard1));
+
+
+
+    }
+
+    @Test
+    public void updatePointer(){
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
+        
+        Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
+        shardSerialization.createShard(shard1);
+
+        final UUID pointer = QakkaUtils.getTimeUuid();
+
+        shard1.setPointer(pointer);
+        shardSerialization.updateShardPointer(shard1);
+
+        Shard returnedShard = shardSerialization.loadShard(shard1);
+
+        assertEquals(pointer, returnedShard.getPointer());
+
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardStrategyTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardStrategyTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardStrategyTest.java
new file mode 100644
index 0000000..ea73abc
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardStrategyTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.qakka.serialization.sharding;
+
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.core.QakkaUtils;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.UUID;
+
+
+public class ShardStrategyTest extends AbstractTest {
+
+    private static final Logger logger = LoggerFactory.getLogger( ShardStrategyTest.class );
+
+
+    @Test
+    public void testBasicOperation() {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+
+        ShardSerialization shardSer   = getInjector().getInstance( ShardSerialization.class );
+        ShardStrategy shardStrategy   = getInjector().getInstance( ShardStrategy.class );
+
+        UUID messageIdToLocate = null;
+        long selectedShardId = 4L;
+        
+        int numShards = 10;
+        String region = "default";
+        String queueName = "sst_queue_" + RandomStringUtils.randomAlphanumeric(20);
+
+        for ( long i=0; i<numShards; i++) {
+            shardSer.createShard( new Shard( queueName, region, Shard.Type.DEFAULT, i, QakkaUtils.getTimeUuid()));
+            try { Thread.sleep(10); } catch (Exception intentionallyIgnored) {}
+            if ( i == selectedShardId ) {
+                messageIdToLocate = QakkaUtils.getTimeUuid();
+            }
+            try { Thread.sleep(10); } catch (Exception intentionallyIgnored) {}
+        }
+
+        Shard selectedShard = shardStrategy.selectShard( queueName, region, Shard.Type.DEFAULT, messageIdToLocate );
+
+        Assert.assertEquals( selectedShardId, selectedShard.getShardId() );
+        
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardTest.java
new file mode 100644
index 0000000..fba135a
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.qakka.serialization.sharding;
+
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Created by russo on 6/9/16.
+ */
+public class ShardTest extends AbstractTest {
+
+    
+    @Test
+    public void testEquals(){
+
+        Shard shard1 = new Shard("test", "region", Shard.Type.DEFAULT, 100L, null);
+        Shard shard2 = new Shard("test", "region", Shard.Type.DEFAULT, 100L, null);
+
+        assertEquals(shard1, shard2);
+
+    }
+
+    @Test
+    public void testHashCode(){
+
+        Shard shard1 = new Shard("test", "region", Shard.Type.DEFAULT, 10000000000L, null);
+        Shard shard2 = new Shard("test", "region", Shard.Type.DEFAULT, 10000000000L, null);
+
+        assertEquals(shard1.hashCode(), shard2.hashCode());
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLogSerializationTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLogSerializationTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLogSerializationTest.java
new file mode 100644
index 0000000..20b72b0
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLogSerializationTest.java
@@ -0,0 +1,133 @@
+/*
+ * 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.qakka.serialization.transferlog;
+
+import com.datastax.driver.core.PagingState;
+import org.apache.cassandra.utils.UUIDGen;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaException;
+import org.apache.usergrid.persistence.qakka.serialization.Result;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+
+public class TransferLogSerializationTest extends AbstractTest {
+
+    @Test
+    public void recordTransferLog() throws Exception {
+
+        TransferLogSerialization logSerialization = getInjector().getInstance( TransferLogSerialization.class );
+        
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+        String queueName = "tlst_queue_" + RandomStringUtils.randomAlphanumeric( 15 );
+        String source = RandomStringUtils.randomAlphanumeric( 15 );
+        String dest = RandomStringUtils.randomAlphanumeric( 15 );
+        
+        int numLogs = 100;
+        
+        for ( int i=0; i<numLogs; i++ ) {
+            logSerialization.recordTransferLog( queueName, source, dest, UUIDGen.getTimeUUID());
+        }
+
+        int count = 0;
+        int fetchCount = 0;
+        PagingState pagingState = null;
+        while ( true ) {
+            
+            Result<TransferLog> all = logSerialization.getAllTransferLogs( pagingState, 10 );
+                   
+            // we only want entities for our queue
+            List<TransferLog> logs = all.getEntities().stream()
+                .filter( log -> log.getQueueName().equals( queueName ) ).collect( Collectors.toList() );
+
+            count += logs.size();
+            fetchCount++;
+            if ( all.getPagingState() == null ) {
+                break;
+            } 
+            pagingState = all.getPagingState();
+        }
+
+        Assert.assertEquals( numLogs, count );
+    }
+
+    @Test
+    public void removeTransferLog() throws Exception {
+
+        TransferLogSerialization logSerialization = getInjector().getInstance( TransferLogSerialization.class );
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession(); 
+        
+        String queueName = "tlst_queue_" + RandomStringUtils.randomAlphanumeric( 15 );
+        String source = RandomStringUtils.randomAlphanumeric( 15 );
+        String dest = RandomStringUtils.randomAlphanumeric( 15 );
+
+        UUID messageId = UUIDGen.getTimeUUID();
+        logSerialization.recordTransferLog( queueName, source, dest, messageId );
+
+        List<TransferLog> allLogs = getTransferLogs( logSerialization );
+
+        // we only want entities for our queue
+        List<TransferLog> logs = allLogs.stream()
+                .filter( log -> log.getQueueName().equals( queueName ) ).collect( Collectors.toList() );
+        Assert.assertEquals( 1, logs.size());
+
+        logSerialization.removeTransferLog( queueName, source, dest, messageId );
+        
+        List<TransferLog> all = getTransferLogs( logSerialization );
+        logs = all.stream()
+            .filter( log -> log.getQueueName().equals( queueName ) ).collect( Collectors.toList() );
+        Assert.assertEquals( 0, logs.size());
+        
+        try {
+            logSerialization.removeTransferLog( queueName, source, dest, messageId );
+            Assert.fail("Removing non-existent log should throw exception");
+            
+        } catch ( QakkaException expected ) {
+            // success!
+        }
+    }
+
+    private List<TransferLog> getTransferLogs(TransferLogSerialization logSerialization) {
+        PagingState pagingState = null;
+        List<TransferLog> allLogs = new ArrayList<>();
+        while ( true ) {
+            Result<TransferLog> result = logSerialization.getAllTransferLogs( pagingState, 100 );
+            allLogs.addAll( result.getEntities() );
+            if ( result.getPagingState() == null ) {
+                break;
+            }
+            pagingState = result.getPagingState();
+        }
+        return allLogs;
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
index 69655e5..4b6e9d3 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
@@ -20,72 +20,67 @@
 package org.apache.usergrid.persistence.queue;
 
 
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.QakkaModule;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.queue.guice.QueueModule;
+import org.apache.usergrid.persistence.queue.impl.LegacyQueueScopeImpl;
+import org.junit.Ignore;
+import org.junit.Test;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import org.apache.usergrid.persistence.core.aws.NoAWSCredsRule;
-import org.apache.usergrid.persistence.core.test.ITRunner;
-import org.apache.usergrid.persistence.core.test.UseModules;
-import org.apache.usergrid.persistence.queue.guice.TestQueueModule;
-import org.apache.usergrid.persistence.queue.impl.LegacyQueueScopeImpl;
-
-import com.google.inject.Inject;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
-
 
-@RunWith( ITRunner.class )
-@UseModules( { TestQueueModule.class } )
-public class LegacyQueueManagerTest {
 
-    @Inject
-    protected LegacyQueueFig queueFig;
-    @Inject
-    protected LegacyQueueManagerFactory qmf;
+public class LegacyQueueManagerTest extends AbstractTest {
 
-    /**
-     * Mark tests as ignored if no AWS creds are present
-     */
-    @Rule
-    public NoAWSCredsRule awsCredsRule = new NoAWSCredsRule();
+    public static long queueSeed = System.currentTimeMillis();
 
+    // give each test its own injector
+    @Override
+    protected Injector getInjector() {
+        return Guice.createInjector( new QueueModule() );
+    }
 
-    protected LegacyQueueScope scope;
-    private LegacyQueueManager qm;
 
-    public static long queueSeed = System.currentTimeMillis();
+    @Test
+    public void send() throws Exception{
 
+        Injector myInjector = getInjector();
 
-    @Before
-    public void mockApp() {
+        CassandraClient cassandraClient = myInjector.getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
 
-        this.scope = new LegacyQueueScopeImpl( "testQueue"+queueSeed++, LegacyQueueScope.RegionImplementation.LOCAL);
-        qm = qmf.getQueueManager(scope);
-    }
+        ActorSystemFig actorSystemFig = myInjector.getInstance( ActorSystemFig.class );
+        String region = actorSystemFig.getRegionLocal();
 
-    @org.junit.After
-    public void cleanup(){
-        qm.deleteQueue();
-    }
+        App app = myInjector.getInstance( App.class );
+        app.start( "localhost", getNextAkkaPort(), region );
 
+        final LegacyQueueScopeImpl scope =
+            new LegacyQueueScopeImpl( "testQueue" + queueSeed++, LegacyQueueScope.RegionImplementation.LOCAL );
+        LegacyQueueManagerFactory qmf = myInjector.getInstance( LegacyQueueManagerFactory.class );
+        LegacyQueueManager qm = qmf.getQueueManager(scope);
 
-    @Test
-    public void send() throws Exception{
         String value = "bodytest";
         qm.sendMessage(value);
+
+        Thread.sleep(5000);
+
         List<LegacyQueueMessage> messageList = qm.getMessages(1, String.class);
         assertTrue(messageList.size() >= 1);
         for(LegacyQueueMessage message : messageList){
-            assertTrue(message.getBody().equals(value));
+            assertEquals( value, message.getBody() );
             qm.commitMessage(message);
         }
 
@@ -96,12 +91,32 @@ public class LegacyQueueManagerTest {
 
     @Test
     public void sendMore() throws Exception{
+
+        Injector myInjector = getInjector();
+
+        CassandraClient cassandraClient = myInjector.getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+        ActorSystemFig actorSystemFig = myInjector.getInstance( ActorSystemFig.class );
+        String region = actorSystemFig.getRegionLocal();
+
+        App app = myInjector.getInstance( App.class );
+        app.start( "localhost", getNextAkkaPort(), region );
+
+        final LegacyQueueScopeImpl scope =
+            new LegacyQueueScopeImpl( "testQueue" + queueSeed++, LegacyQueueScope.RegionImplementation.LOCAL );
+        LegacyQueueManagerFactory qmf = myInjector.getInstance( LegacyQueueManagerFactory.class );
+        LegacyQueueManager qm = qmf.getQueueManager(scope);
+
         HashMap<String,String> values = new HashMap<>();
         values.put("test","Test");
 
         List<Map<String,String>> bodies = new ArrayList<>();
         bodies.add(values);
         qm.sendMessages(bodies);
+
+        Thread.sleep(5000);
+
         List<LegacyQueueMessage> messageList = qm.getMessages(1, values.getClass());
         assertTrue(messageList.size() >= 1);
         for(LegacyQueueMessage message : messageList){
@@ -115,7 +130,25 @@ public class LegacyQueueManagerTest {
     }
 
     @Test
+    @Ignore("Not implemented yet")
     public void queueSize() throws Exception{
+
+        Injector myInjector = getInjector();
+
+        CassandraClient cassandraClient = myInjector.getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+        ActorSystemFig actorSystemFig = myInjector.getInstance( ActorSystemFig.class );
+        String region = actorSystemFig.getRegionLocal();
+
+        App app = myInjector.getInstance( App.class );
+        app.start( "localhost", getNextAkkaPort(), region );
+
+        final LegacyQueueScopeImpl scope =
+            new LegacyQueueScopeImpl( "testQueue" + queueSeed++, LegacyQueueScope.RegionImplementation.LOCAL );
+        LegacyQueueManagerFactory qmf = myInjector.getInstance( LegacyQueueManagerFactory.class );
+        LegacyQueueManager qm = qmf.getQueueManager(scope);
+
         HashMap<String,String> values = new HashMap<>();
         values.put("test", "Test");
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/guice/TestQueueModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/guice/TestQueueModule.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/guice/TestQueueModule.java
index 8390672..70e3543 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/guice/TestQueueModule.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/guice/TestQueueModule.java
@@ -18,7 +18,6 @@
 package org.apache.usergrid.persistence.queue.guice;
 
 
-import org.apache.usergrid.persistence.core.guice.CommonModule;
 import org.apache.usergrid.persistence.core.guice.TestModule;
 
 
@@ -26,7 +25,6 @@ public class TestQueueModule extends TestModule {
 
     @Override
     protected void configure() {
-        install( new CommonModule());
         install( new QueueModule() );
     }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/resources/cassandra.yaml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/resources/cassandra.yaml b/stack/corepersistence/queue/src/test/resources/cassandra.yaml
new file mode 100644
index 0000000..e97bf00
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/resources/cassandra.yaml
@@ -0,0 +1,53 @@
+
+cluster_name: 'Embedded Test Cluster'
+
+# ports
+storage_port: 7075
+listen_address: localhost
+rpc_address: localhost
+rpc_port: 9160
+native_transport_port: 9042
+
+# data files
+data_file_directories:
+    - target/embeddedCassandra/data
+commitlog_directory: target/embeddedCassandra/commitlog
+saved_caches_directory: target/embeddedCassandra/saved_caches
+
+# native transport!
+start_native_transport: true
+
+# other stuff
+start_rpc: true
+initial_token:
+auto_bootstrap: false
+hinted_handoff_enabled: true
+authenticator: org.apache.cassandra.auth.AllowAllAuthenticator
+partitioner: org.apache.cassandra.dht.RandomPartitioner
+seed_provider:
+    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
+      parameters:
+          - seeds: "127.0.0.1"
+commitlog_sync: periodic
+commitlog_sync_period_in_ms: 10000
+disk_access_mode: auto
+concurrent_reads: 2
+concurrent_writes: 4
+rpc_keepalive: true
+thrift_framed_transport_size_in_mb: 15
+thrift_max_message_length_in_mb: 16
+snapshot_before_compaction: false
+column_index_size_in_kb: 64
+endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch
+dynamic_snitch: true
+dynamic_snitch_update_interval_in_ms: 100 
+dynamic_snitch_reset_interval_in_ms: 600000
+dynamic_snitch_badness_threshold: 0.0
+request_scheduler: org.apache.cassandra.scheduler.NoScheduler
+server_encryption_options:
+    internode_encryption: none
+    keystore: conf/.keystore
+    keystore_password: cassandra
+    truststore: conf/.truststore
+    truststore_password: cassandra
+index_interval: 128

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/resources/log4j.properties b/stack/corepersistence/queue/src/test/resources/log4j.properties
new file mode 100644
index 0000000..3c679f5
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/resources/log4j.properties
@@ -0,0 +1,29 @@
+# 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.
+
+log4j.rootLogger=ERROR,stdout
+
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d %p (%t) %c{1} - %m%n
+
+log4j.logger.org.apache.usergrid.persistence.actorsystem=DEBUG
+log4j.logger.org.apache.usergrid.persistence.actorsystem=DEBUG
+log4j.logger.org.apache.usergrid.persistence.qakka=DEBUG
+
+log4j.logger.org.apache.cassandra=WARN
+log4j.logger.org.glassfish=WARN

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/resources/qakka-duck.jpg
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/resources/qakka-duck.jpg b/stack/corepersistence/queue/src/test/resources/qakka-duck.jpg
new file mode 100644
index 0000000..8a0e0a2
Binary files /dev/null and b/stack/corepersistence/queue/src/test/resources/qakka-duck.jpg differ

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/resources/qakka.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/resources/qakka.properties b/stack/corepersistence/queue/src/test/resources/qakka.properties
new file mode 100644
index 0000000..c3b613c
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/resources/qakka.properties
@@ -0,0 +1,50 @@
+# 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.
+
+
+# Properties for JUnit tests
+
+usergrid.cluster_name=Test Cluster
+
+usergrid.cluster.hostname=localhost
+
+# Comma-separated list of regions to be considered
+usergrid.cluster.region.list=us-east
+
+# The regions of this local instance of Usergrid
+usergrid.cluster.region.local=us-east
+
+# Comma-separated lists of cluster seeds each with format {region}:{hostname}
+usergrid.cluster.seeds=us-east:localhost
+
+# Port used for cluster communications.
+usergrid.cluster.port=2551
+
+queue.writer.num.actors=100
+
+# set shard size and times low for testing purposes
+queue.shard.max.size=500
+queue.shard.allocation.check.frequency.millis=100
+queue.shard.allocation.advance.time.millis=200
+
+queue.max.inmemory.shard.counter = 100
+
+cassandra.hosts=localhost
+
+cassandra.keyspace.application=qakka_test
+
+cassandra.keyspace-drop-and-create=true

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/pom.xml
----------------------------------------------------------------------
diff --git a/stack/pom.xml b/stack/pom.xml
index 5186a13..d739bb4 100644
--- a/stack/pom.xml
+++ b/stack/pom.xml
@@ -100,9 +100,9 @@
         <amber-version>0.22-incubating</amber-version>
         <astyanax.version>3.9.0</astyanax.version>
         <aws.version>1.10.20</aws.version>
-        <cassandra-version>1.2.18</cassandra-version>
+        <cassandra-version>2.1.14</cassandra-version>
         <guava.version>18.0</guava.version>
-        <guice.version>4.0-beta5</guice.version>
+        <guice.version>4.0</guice.version>
         <hector-om-version>3.0-03</hector-om-version>
         <hector-version>1.1-4</hector-version>
         <hector-test-version>1.1-4</hector-test-version>
@@ -110,7 +110,7 @@
         <jackson-version>1.9.9</jackson-version>
         <jackson-2-version>2.3.3</jackson-2-version>
         <jclouds.version>1.9.0</jclouds.version>
-        <jersey-version>2.21</jersey-version>
+        <jersey-version>2.23.1</jersey-version>
         <junit-version>4.12</junit-version>
         <log4j-version>1.2.16</log4j-version>
         <org.springframework.version>3.2.13.RELEASE</org.springframework.version>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/APNsAdapter.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/APNsAdapter.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/APNsAdapter.java
index 3d4911d..8356f16 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/APNsAdapter.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/APNsAdapter.java
@@ -16,24 +16,26 @@
  */
 package org.apache.usergrid.services.notifications.apns;
 
-import com.relayrides.pushy.apns.*;
-import com.relayrides.pushy.apns.util.*;
-
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.relayrides.pushy.apns.PushManager;
+import com.relayrides.pushy.apns.PushManagerConfiguration;
+import com.relayrides.pushy.apns.util.SimpleApnsPushNotification;
+import org.apache.usergrid.persistence.EntityManager;
 import org.apache.usergrid.persistence.entities.Notification;
 import org.apache.usergrid.persistence.entities.Notifier;
-import org.mortbay.util.ajax.JSON;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.*;
-import java.util.concurrent.*;
-
-import org.apache.usergrid.persistence.EntityManager;
 import org.apache.usergrid.persistence.exceptions.RequiredPropertyNotFoundException;
 import org.apache.usergrid.services.ServicePayload;
 import org.apache.usergrid.services.notifications.ConnectionException;
 import org.apache.usergrid.services.notifications.ProviderAdapter;
 import org.apache.usergrid.services.notifications.TaskTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.*;
 
 /**
  * Adapter for Apple push notifications
@@ -47,6 +49,8 @@ public class APNsAdapter implements ProviderAdapter {
     private static final String TEST_TOKEN = "ff026b5a4d2761ef13843e8bcab9fc83b47f1dfbd1d977d225ab296153ce06d6";
     private static final String TEST_PAYLOAD = "{}";
 
+    private static ObjectMapper objectMapper = new ObjectMapper();
+
     static {
         validEnvironments.add("development");
         validEnvironments.add("production");
@@ -155,7 +159,7 @@ public class APNsAdapter implements ProviderAdapter {
                 payload = "{\"aps\":{\"alert\":\"" + payload + "\"}}";
             }
         } else {
-            payload = JSON.toString(objPayload);
+            payload = objectMapper.writeValueAsString( objPayload );
         }
         if (payload.length() > 2048) {
             throw new IllegalArgumentException(

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/services/src/main/java/org/apache/usergrid/services/notifications/gcm/GCMAdapter.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/gcm/GCMAdapter.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/gcm/GCMAdapter.java
index 7929ad4..6b619b7 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/gcm/GCMAdapter.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/gcm/GCMAdapter.java
@@ -16,11 +16,12 @@
  */
 package org.apache.usergrid.services.notifications.gcm;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.android.gcm.server.*;
 import org.apache.usergrid.persistence.entities.Notification;
 import org.apache.usergrid.persistence.entities.Notifier;
 import org.apache.usergrid.services.notifications.InactiveDeviceManager;
-import org.mortbay.util.ajax.JSON;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,6 +45,8 @@ public class GCMAdapter implements ProviderAdapter {
     private final Notifier notifier;
     private EntityManager entityManager;
 
+    private static ObjectMapper objectMapper = new ObjectMapper();
+
     private ConcurrentHashMap<Long,Batch> batches;
 
     private static final String ttlKey = "time_to_live";
@@ -147,9 +150,9 @@ public class GCMAdapter implements ProviderAdapter {
             throw new IllegalArgumentException(
                     "GCM Payload must be either a Map or a String");
         }
-        if (JSON.toString(mapPayload).length() > 4096) {
-            throw new IllegalArgumentException(
-                    "GCM payloads must be 4096 characters or less");
+        String payloadString = objectMapper.writeValueAsString( mapPayload );
+        if ( payloadString.length() > 4096) {
+            throw new IllegalArgumentException( "GCM payloads must be 4096 characters or less");
         }
         return mapPayload;
     }


[21/25] usergrid git commit: Fixes to get all tests passing again.

Posted by sn...@apache.org.
Fixes to get all tests passing again.


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

Branch: refs/heads/usergrid-1318-queue
Commit: 99dbfc2d17e330583560d386b6ecb5cce93fa3e5
Parents: 447b60d
Author: Dave Johnson <sn...@apache.org>
Authored: Fri Sep 16 09:39:51 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Fri Sep 16 09:39:51 2016 -0400

----------------------------------------------------------------------
 .../usergrid/persistence/core/CassandraFig.java | 12 ++++++++++
 .../core/datastax/impl/DataStaxClusterImpl.java |  2 +-
 .../persistence/qakka/AbstractTest.java         |  2 +-
 .../qakka/core/QueueMessageManagerTest.java     |  2 --
 .../distributed/QueueActorServiceTest.java      |  1 +
 .../distributed/actors/QueueTimeouterTest.java  |  1 -
 .../distributed/actors/ShardAllocatorTest.java  |  1 -
 ...tiShardDatabaseQueueMessageIteratorTest.java | 23 +++++++++++---------
 .../sharding/ShardIteratorTest.java             | 18 +++++++++------
 .../queue/src/test/resources/log4j.properties   |  3 +++
 .../queue/src/test/resources/qakka.properties   | 12 +++-------
 11 files changed, 45 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/99dbfc2d/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
index 90f4ae8..b599a20 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
@@ -35,9 +35,13 @@ public interface CassandraFig extends GuicyFig {
     String READ_CL = "cassandra.readcl";
     String READ_CL_CONSISTENT = "cassandra.readcl.consistent";
     String WRITE_CL = "cassandra.writecl";
+
     String STRATEGY = "cassandra.strategy";
     String STRATEGY_OPTIONS = "cassandra.strategy.options";
 
+    String STRATEGY_LOCAL = "cassandra.strategy.local";
+    String STRATEGY_OPTIONS_LOCAL = "cassandra.strategy.options.local";
+
     // main application cassandra properties
     String ASTYANAX_READ_CONSISTENT_CL = "usergrid.consistent.read.cl";
     String ASTYANAX_READ_CL = "usergrid.read.cl";
@@ -157,6 +161,14 @@ public interface CassandraFig extends GuicyFig {
     @Key( STRATEGY_OPTIONS )
     String getStrategyOptions();
 
+    @Default("SimpleStrategy")
+    @Key( STRATEGY_LOCAL )
+    String getStrategyLocal();
+
+    @Default("replication_factor:1")
+    @Key( STRATEGY_OPTIONS_LOCAL )
+    String getStrategyOptionsLocal();
+
     /**
      * Return the history of all shard values which are immutable.  For instance, if shard values
      * are initially set to 20 (the default) then increased to 40, the property should contain the string of

http://git-wip-us.apache.org/repos/asf/usergrid/blob/99dbfc2d/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
index fe9803d..c8ddf3e 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
@@ -148,7 +148,7 @@ public class DataStaxClusterImpl implements DataStaxCluster {
         final String createQueueMessageKeyspace = String.format(
             "CREATE KEYSPACE IF NOT EXISTS %s WITH replication = %s",
             CQLUtils.quote(cassandraFig.getApplicationLocalKeyspace()),
-            CQLUtils.getFormattedReplication(cassandraFig.getStrategy(), cassandraFig.getStrategyOptions())
+            CQLUtils.getFormattedReplication(cassandraFig.getStrategyLocal(), cassandraFig.getStrategyOptionsLocal())
 
         );
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/99dbfc2d/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
index 6f1c744..c90db2e 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
@@ -40,7 +40,7 @@ public class AbstractTest {
 
     protected static Injector sharedInjector;
 
-    AtomicBoolean migrated = new AtomicBoolean( false );
+    static AtomicBoolean migrated = new AtomicBoolean( false );
 
     static { new KeyspaceDropper(); }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/99dbfc2d/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
index 630c953..124cb86 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
@@ -134,7 +134,6 @@ public class QueueMessageManagerTest extends AbstractTest {
 
 
     @Test
-    @Ignore
     public void testQueueMessageTimeouts() throws Exception {
 
         Injector injector = getInjector();
@@ -223,7 +222,6 @@ public class QueueMessageManagerTest extends AbstractTest {
 
 
     @Test
-    @Ignore
     public void testGetWithMissingData() throws InterruptedException {
 
         Injector injector = getInjector();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/99dbfc2d/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
index a46c186..0883650 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
@@ -156,6 +156,7 @@ public class QueueActorServiceTest extends AbstractTest {
         int count = 0;
         while ( retries++ < maxRetries ) {
             Thread.sleep( 1000 );
+            distributedQueueService.refresh();
             if (inMemoryQueue.size( queueName ) == 100) {
                 count = 100;
                 break;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/99dbfc2d/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouterTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouterTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouterTest.java
index 54f9d42..e3541a4 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouterTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouterTest.java
@@ -54,7 +54,6 @@ public class QueueTimeouterTest extends AbstractTest {
 
 
     @Test
-    @Ignore
     public void testBasicOperation() throws Exception {
 
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );

http://git-wip-us.apache.org/repos/asf/usergrid/blob/99dbfc2d/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
index ae62c89..7fd664f 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
@@ -163,7 +163,6 @@ public class ShardAllocatorTest extends AbstractTest {
 
 
     @Test
-    @Ignore
     public void testBasicOperationWithMessages() throws InterruptedException {
 
         Injector injector = getInjector();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/99dbfc2d/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardDatabaseQueueMessageIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardDatabaseQueueMessageIteratorTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardDatabaseQueueMessageIteratorTest.java
index 2d8da6d..5fa3434 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardDatabaseQueueMessageIteratorTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardDatabaseQueueMessageIteratorTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.usergrid.persistence.qakka.serialization;
 
+import org.apache.commons.lang.RandomStringUtils;
 import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
 import org.apache.usergrid.persistence.qakka.AbstractTest;
@@ -56,10 +57,12 @@ public class MultiShardDatabaseQueueMessageIteratorTest extends AbstractTest {
         QueueMessageSerialization queueMessageSerialization =
                 getInjector().getInstance( QueueMessageSerialization.class );
 
-        Shard shard1 = new Shard("test", "region", Shard.Type.DEFAULT, 1L, null);
-        Shard shard2 = new Shard("test", "region", Shard.Type.DEFAULT, 2L, null);
-        Shard shard3 = new Shard("test", "region", Shard.Type.DEFAULT, 3L, null);
-        Shard shard4 = new Shard("test", "region", Shard.Type.DEFAULT, 4L, null);
+        String queueName = "queue_msit_" + RandomStringUtils.randomAlphanumeric( 10 );
+
+        Shard shard1 = new Shard(queueName, "region", Shard.Type.DEFAULT, 1L, null);
+        Shard shard2 = new Shard(queueName, "region", Shard.Type.DEFAULT, 2L, null);
+        Shard shard3 = new Shard(queueName, "region", Shard.Type.DEFAULT, 3L, null);
+        Shard shard4 = new Shard(queueName, "region", Shard.Type.DEFAULT, 4L, null);
 
         shardSerialization.createShard(shard1);
         shardSerialization.createShard(shard2);
@@ -72,7 +75,7 @@ public class MultiShardDatabaseQueueMessageIteratorTest extends AbstractTest {
         for(int i=0; i < numMessagesPerShard; i++){
 
             queueMessageSerialization.writeMessage( new DatabaseQueueMessage(QakkaUtils.getTimeUuid(),
-                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard1.getShardId(),
+                    DatabaseQueueMessage.Type.DEFAULT, queueName, "region", shard1.getShardId(),
                     System.currentTimeMillis(), null, null));
             Thread.sleep(3);
         }
@@ -80,7 +83,7 @@ public class MultiShardDatabaseQueueMessageIteratorTest extends AbstractTest {
         for(int i=0; i < numMessagesPerShard; i++){
 
             queueMessageSerialization.writeMessage( new DatabaseQueueMessage(QakkaUtils.getTimeUuid(),
-                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard2.getShardId(),
+                    DatabaseQueueMessage.Type.DEFAULT, queueName, "region", shard2.getShardId(),
                     System.currentTimeMillis(), null, null));
             Thread.sleep(3);
         }
@@ -88,7 +91,7 @@ public class MultiShardDatabaseQueueMessageIteratorTest extends AbstractTest {
         for(int i=0; i < numMessagesPerShard; i++){
 
             queueMessageSerialization.writeMessage( new DatabaseQueueMessage(QakkaUtils.getTimeUuid(),
-                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard3.getShardId(),
+                    DatabaseQueueMessage.Type.DEFAULT, queueName, "region", shard3.getShardId(),
                     System.currentTimeMillis(), null, null));
             Thread.sleep(3);
         }
@@ -96,16 +99,16 @@ public class MultiShardDatabaseQueueMessageIteratorTest extends AbstractTest {
         for(int i=0; i < numMessagesPerShard; i++){
 
             queueMessageSerialization.writeMessage( new DatabaseQueueMessage(QakkaUtils.getTimeUuid(),
-                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard4.getShardId(),
+                    DatabaseQueueMessage.Type.DEFAULT, queueName, "region", shard4.getShardId(),
                     System.currentTimeMillis(), null, null));
             Thread.sleep(3);
         }
 
 
         ShardIterator shardIterator = new ShardIterator(
-                cassandraClient, "test", "region", Shard.Type.DEFAULT, Optional.empty());
+                cassandraClient, queueName, "region", Shard.Type.DEFAULT, Optional.empty());
         MultiShardMessageIterator iterator = new MultiShardMessageIterator(
-                cassandraClient, "test", "region", DatabaseQueueMessage.Type.DEFAULT, shardIterator, null);
+                cassandraClient, queueName, "region", DatabaseQueueMessage.Type.DEFAULT, shardIterator, null);
 
         final AtomicInteger[] counts = {
                 new AtomicInteger(0), new AtomicInteger(0), new AtomicInteger(0), new AtomicInteger(0) };

http://git-wip-us.apache.org/repos/asf/usergrid/blob/99dbfc2d/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIteratorTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIteratorTest.java
index fb0a46e..0d593aa 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIteratorTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIteratorTest.java
@@ -50,14 +50,16 @@ public class ShardIteratorTest extends AbstractTest {
         CassandraFig cassandraFig = getInjector().getInstance( CassandraFig.class );
         ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraFig, cassandraClient );
 
-        Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
-        Shard shard2 = new Shard("test", "region1", Shard.Type.DEFAULT, 200L, null);
+        String queueName = "queue_sit_" + RandomStringUtils.randomAlphanumeric( 10 );
+
+        Shard shard1 = new Shard(queueName, "region1", Shard.Type.DEFAULT, 100L, null);
+        Shard shard2 = new Shard(queueName, "region1", Shard.Type.DEFAULT, 200L, null);
 
         shardSerialization.createShard(shard1);
         shardSerialization.createShard(shard2);
 
         Iterator<Shard> shardIterator = new ShardIterator(
-                cassandraClient, "test", "region1", Shard.Type.DEFAULT, Optional.empty());
+                cassandraClient, queueName, "region1", Shard.Type.DEFAULT, Optional.empty());
 
         List<Shard> shards = new ArrayList<>(1);
 
@@ -81,9 +83,11 @@ public class ShardIteratorTest extends AbstractTest {
         CassandraFig cassandraFig = getInjector().getInstance( CassandraFig.class );
         ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraFig, cassandraClient );
 
-        Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
-        Shard shard2 = new Shard("test", "region1", Shard.Type.DEFAULT, 200L, null);
-        Shard shard3 = new Shard("test", "region1", Shard.Type.DEFAULT, 300L, null);
+        String queueName = "queue_sit_" + RandomStringUtils.randomAlphanumeric( 10 );
+
+        Shard shard1 = new Shard(queueName, "region1", Shard.Type.DEFAULT, 100L, null);
+        Shard shard2 = new Shard(queueName, "region1", Shard.Type.DEFAULT, 200L, null);
+        Shard shard3 = new Shard(queueName, "region1", Shard.Type.DEFAULT, 300L, null);
 
         shardSerialization.createShard(shard1);
         shardSerialization.createShard(shard2);
@@ -91,7 +95,7 @@ public class ShardIteratorTest extends AbstractTest {
 
 
         Iterator<Shard> shardIterator = new ShardIterator(
-                cassandraClient, "test", "region1", Shard.Type.DEFAULT, Optional.of(200L));
+                cassandraClient, queueName, "region1", Shard.Type.DEFAULT, Optional.of(200L));
 
         List<Shard> shards = new ArrayList<>(1);
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/99dbfc2d/stack/corepersistence/queue/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/resources/log4j.properties b/stack/corepersistence/queue/src/test/resources/log4j.properties
index 3c679f5..9e14f29 100644
--- a/stack/corepersistence/queue/src/test/resources/log4j.properties
+++ b/stack/corepersistence/queue/src/test/resources/log4j.properties
@@ -27,3 +27,6 @@ log4j.logger.org.apache.usergrid.persistence.qakka=DEBUG
 
 log4j.logger.org.apache.cassandra=WARN
 log4j.logger.org.glassfish=WARN
+
+log4j.logger.org.apache.usergrid.persistence.qakka=DEBUG
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/99dbfc2d/stack/corepersistence/queue/src/test/resources/qakka.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/resources/qakka.properties b/stack/corepersistence/queue/src/test/resources/qakka.properties
index 9140637..dc7ef48 100644
--- a/stack/corepersistence/queue/src/test/resources/qakka.properties
+++ b/stack/corepersistence/queue/src/test/resources/qakka.properties
@@ -34,21 +34,15 @@ usergrid.cluster.seeds=us-east:localhost
 # Port used for cluster communications.
 usergrid.cluster.port=2551
 
-queue.sender.num.actors=20
-queue.writer.num.actors=20
-queue.num.actors=20
+queue.writer.num.actors=100
 
 # set shard size and times low for testing purposes
 queue.shard.max.size=500
-queue.shard.allocation.check.frequency.millis=1000
-queue.shard.allocation.advance.time.millis=2000
-queue.refresh.millis=1000
+queue.shard.allocation.check.frequency.millis=100
+queue.shard.allocation.advance.time.millis=200
 
 queue.max.inmemory.shard.counter = 100
 
-cassandra.connections=10
-#cassandra.timeout=20000
-
 cassandra.hosts=localhost
 
 cassandra.keyspace.application=qakka_test_application


[09/25] usergrid git commit: Initial integration of Qakka into Usergrid Queue module, and implementation of Qakka-based LegacyQueueManager implementation.

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardCounterSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardCounterSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardCounterSerializationImpl.java
new file mode 100644
index 0000000..9158412
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardCounterSerializationImpl.java
@@ -0,0 +1,198 @@
+/*
+ * 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.qakka.serialization.sharding.impl;
+
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Statement;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
+import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.exceptions.NotFoundException;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaRuntimeException;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardCounterSerialization;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.text.MessageFormat;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+
+
+@Singleton
+public class ShardCounterSerializationImpl implements ShardCounterSerialization {
+    private static final Logger logger = LoggerFactory.getLogger( ShardCounterSerializationImpl.class );
+
+    private final CassandraClient cassandraClient;
+
+    final static String TABLE_COUNTERS       = "shard_counters";
+    final static String COLUMN_QUEUE_NAME    = "queue_name";
+    final static String COLUMN_SHARD_ID      = "shard_id";
+    final static String COLUMN_COUNTER_VALUE = "counter_value";
+    final static String COLUMN_SHARD_TYPE    = "shard_type";
+
+    static final String CQL =
+        "CREATE TABLE IF NOT EXISTS shard_counters ( " +
+            "counter_value counter, " +
+            "queue_name    varchar, " +
+            "shard_type    varchar, " +
+            "shard_id      bigint, " +
+            "PRIMARY KEY (queue_name, shard_type, shard_id) " +
+    ");  ";
+
+    final long maxInMemoryIncrement;
+
+    class InMemoryCount {
+        long baseCount;
+        final AtomicLong increment = new AtomicLong( 0L );
+        InMemoryCount( long baseCount ) {
+            this.baseCount = baseCount;
+        }
+        public long value() {
+            return baseCount + increment.get();
+        }
+        public AtomicLong getIncrement() {
+            return increment;
+        }
+        void setBaseCount( long baseCount ) {
+            this.baseCount = baseCount;
+        }
+    }
+
+    private Map<String, InMemoryCount> inMemoryCounters = new ConcurrentHashMap<>(200);
+
+
+    @Inject
+    public ShardCounterSerializationImpl(QakkaFig qakkaFig, CassandraClient cassandraClient ) {
+        this.maxInMemoryIncrement = qakkaFig.getMaxInMemoryShardCounter();
+        this.cassandraClient = cassandraClient;
+    }
+
+
+    @Override
+    public void incrementCounter(String queueName, Shard.Type type, long shardId, long increment ) {
+
+        String key = queueName + type + shardId;
+        synchronized ( inMemoryCounters ) {
+
+            if ( inMemoryCounters.get( key ) == null ) {
+
+                Long value = retrieveCounterFromStorage( queueName, type, shardId );
+
+                if ( value == null ) {
+                    incrementCounterInStorage( queueName, type, shardId, 0L );
+                    inMemoryCounters.put( key, new InMemoryCount( 0L ));
+                } else {
+                    inMemoryCounters.put( key, new InMemoryCount( value ));
+                }
+                inMemoryCounters.get( key ).getIncrement().addAndGet( increment );
+                return;
+            }
+        }
+
+        InMemoryCount inMemoryCount = inMemoryCounters.get( key );
+
+        synchronized ( inMemoryCount ) {
+            long totalIncrement = inMemoryCount.getIncrement().addAndGet( increment );
+
+            if (totalIncrement > maxInMemoryIncrement) {
+                incrementCounterInStorage( queueName, type, shardId, totalIncrement );
+                inMemoryCount.setBaseCount( retrieveCounterFromStorage( queueName, type, shardId ) );
+                inMemoryCount.getIncrement().set( 0L );
+            }
+        }
+
+    }
+
+
+    @Override
+    public long getCounterValue( String queueName, Shard.Type type, long shardId ) {
+
+        String key = queueName + type + shardId;
+
+        synchronized ( inMemoryCounters ) {
+
+            if ( inMemoryCounters.get( key ) == null ) {
+
+                Long value = retrieveCounterFromStorage( queueName, type, shardId );
+
+                if ( value == null ) {
+                    throw new NotFoundException(
+                            MessageFormat.format( "No counter found for queue {0} type {1} shardId {2}",
+                                    queueName, type, shardId ));
+                } else {
+                    inMemoryCounters.put( key, new InMemoryCount( value ));
+                }
+            }
+        }
+
+        return inMemoryCounters.get( key ).value();
+    }
+
+    void incrementCounterInStorage( String queueName, Shard.Type type, long shardId, long increment ) {
+
+        Statement update = QueryBuilder.update( TABLE_COUNTERS )
+                .where( QueryBuilder.eq(   COLUMN_QUEUE_NAME, queueName ) )
+                .and(   QueryBuilder.eq(   COLUMN_SHARD_TYPE, type.toString() ) )
+                .and(   QueryBuilder.eq(   COLUMN_SHARD_ID, shardId ) )
+                .with(  QueryBuilder.incr( COLUMN_COUNTER_VALUE, increment ) );
+        cassandraClient.getSession().execute( update );
+    }
+
+
+    Long retrieveCounterFromStorage( String queueName, Shard.Type type, long shardId ) {
+
+        Statement query = QueryBuilder.select().from( TABLE_COUNTERS )
+                .where( QueryBuilder.eq( COLUMN_QUEUE_NAME, queueName ) )
+                .and( QueryBuilder.eq( COLUMN_SHARD_TYPE, type.toString()) )
+                .and( QueryBuilder.eq( COLUMN_SHARD_ID, shardId ) );
+
+        ResultSet resultSet = cassandraClient.getSession().execute( query );
+        List<Row> all = resultSet.all();
+
+        if ( all.size() > 1 ) {
+            throw new QakkaRuntimeException(
+                    "Multiple rows for counter " + queueName + " type " + type + " shardId " + shardId );
+        }
+        if ( all.isEmpty() ) {
+            return null;
+        }
+        return all.get(0).getLong( COLUMN_COUNTER_VALUE );
+    }
+
+    @Override
+    public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
+        return Collections.EMPTY_LIST;
+    }
+
+    @Override
+    public Collection<TableDefinition> getTables() {
+        return Collections.singletonList( new TableDefinitionStringImpl( "shard_counters", CQL ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardSerializationImpl.java
new file mode 100644
index 0000000..7b9fd8e
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardSerializationImpl.java
@@ -0,0 +1,200 @@
+/*
+ * 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.qakka.serialization.sharding.impl;
+
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Statement;
+import com.datastax.driver.core.querybuilder.Assignment;
+import com.datastax.driver.core.querybuilder.Clause;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
+import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardSerialization;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.UUID;
+
+
+public class ShardSerializationImpl implements ShardSerialization {
+
+    private static final Logger logger = LoggerFactory.getLogger( ShardSerializationImpl.class );
+
+    private final CassandraClient cassandraClient;
+
+    public final static String COLUMN_QUEUE_NAME = "queue_name";
+    public final static String COLUMN_REGION = "region";
+    public final static String COLUMN_SHARD_ID = "shard_id";
+    public final static String COLUMN_ACTIVE = "active";
+    public final static String COLUMN_POINTER = "pointer";
+
+
+    public final static String TABLE_SHARDS_MESSAGES_AVAILABLE = "shards_messages_available";
+
+    public final static String TABLE_SHARDS_MESSAGES_INFLIGHT = "shards_messages_inflight";
+
+
+    static final String SHARDS_MESSAGES_AVAILABLE =
+            "CREATE TABLE IF NOT EXISTS shards_messages_available ( " +
+                    "queue_name text, " +
+                    "region     text, " +
+                    "shard_id   bigint, " +
+                    "active     int, " +
+                    "pointer    timeuuid, " +
+                    "PRIMARY KEY ((queue_name, region), active, shard_id) " +
+                    ") WITH CLUSTERING ORDER BY (active DESC, shard_id ASC); ";
+
+    static final String SHARDS_MESSAGES_AVAILABLE_INFLIGHT =
+            "CREATE TABLE IF NOT EXISTS shards_messages_inflight ( " +
+                    "queue_name text, " +
+                    "region     text, " +
+                    "shard_id   bigint, " +
+                    "active     int, " +
+                    "pointer    timeuuid, " +
+                    "PRIMARY KEY ((queue_name, region), active, shard_id) " +
+                    ") WITH CLUSTERING ORDER BY (active DESC, shard_id ASC); ";
+
+
+    @Inject
+    public ShardSerializationImpl( CassandraClient cassandraClient ) {
+        this.cassandraClient = cassandraClient;
+    }
+
+    public void createShard(final Shard shard){
+
+        Statement insert = QueryBuilder.insertInto(getTableName(shard.getType()))
+                .value(COLUMN_QUEUE_NAME, shard.getQueueName())
+                .value(COLUMN_REGION, shard.getRegion())
+                .value(COLUMN_SHARD_ID, shard.getShardId())
+                .value(COLUMN_ACTIVE, 1)
+                .value(COLUMN_POINTER, shard.getPointer());
+
+        cassandraClient.getSession().execute(insert);
+
+    }
+
+    public Shard loadShard(final Shard shard){
+
+        Clause queueNameClause = QueryBuilder.eq(COLUMN_QUEUE_NAME, shard.getQueueName());
+        Clause regionClause = QueryBuilder.eq(COLUMN_REGION, shard.getRegion());
+        Clause activeClause = QueryBuilder.eq(COLUMN_ACTIVE, 1);
+        Clause shardIdClause = QueryBuilder.eq(COLUMN_SHARD_ID, shard.getShardId());
+
+
+
+        Statement select = QueryBuilder.select().from(getTableName(shard.getType()))
+                .where(queueNameClause)
+                .and(regionClause)
+                .and(activeClause)
+                .and(shardIdClause);
+
+        Row row = cassandraClient.getSession().execute(select).one();
+
+        if (row == null){
+            return null;
+        }
+
+        final String queueName = row.getString(COLUMN_QUEUE_NAME);
+        final String region = row.getString(COLUMN_REGION);
+        final long shardId = row.getLong(COLUMN_SHARD_ID);
+        final UUID pointer = row.getUUID(COLUMN_POINTER);
+
+        return new Shard(queueName, region, shard.getType(), shardId, pointer);
+
+
+
+    }
+
+
+    public void deleteShard(final Shard shard){
+
+        Clause queueNameClause = QueryBuilder.eq(COLUMN_QUEUE_NAME, shard.getQueueName());
+        Clause regionClause = QueryBuilder.eq(COLUMN_REGION, shard.getRegion());
+        Clause activeClause = QueryBuilder.eq(COLUMN_ACTIVE, 1);
+        Clause shardIdClause = QueryBuilder.eq(COLUMN_SHARD_ID, shard.getShardId());
+
+
+
+        Statement delete = QueryBuilder.delete().from(getTableName(shard.getType()))
+                .where(queueNameClause)
+                .and(regionClause)
+                .and(activeClause)
+                .and(shardIdClause);
+
+        cassandraClient.getSession().execute(delete);
+
+    }
+
+    public void updateShardPointer(final Shard shard){
+
+        Assignment assignment = QueryBuilder.set(COLUMN_POINTER, shard.getPointer());
+
+        Clause queueNameClause = QueryBuilder.eq(COLUMN_QUEUE_NAME, shard.getQueueName());
+        Clause regionClause = QueryBuilder.eq(COLUMN_REGION, shard.getRegion());
+        Clause activeClause = QueryBuilder.eq(COLUMN_ACTIVE, 1);
+        Clause shardIdClause = QueryBuilder.eq(COLUMN_SHARD_ID, shard.getShardId());
+
+        Statement update = QueryBuilder.update(getTableName(shard.getType()))
+                .with(assignment)
+                .where(queueNameClause)
+                .and(regionClause)
+                .and(activeClause)
+                .and(shardIdClause);
+
+        cassandraClient.getSession().execute(update);
+
+    }
+
+    public static String getTableName(Shard.Type shardType){
+
+        String table;
+        if( shardType.equals(Shard.Type.DEFAULT)) {
+            table = TABLE_SHARDS_MESSAGES_AVAILABLE;
+        }else if (shardType.equals(Shard.Type.INFLIGHT)) {
+            table = TABLE_SHARDS_MESSAGES_INFLIGHT;
+        }else{
+            throw new IllegalArgumentException("Unknown ShardType");
+        }
+
+        return table;
+
+    }
+
+    @Override
+    public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
+        return Collections.EMPTY_LIST;
+    }
+
+    @Override
+    public Collection<TableDefinition> getTables() {
+        return Lists.newArrayList(
+                new TableDefinitionStringImpl( TABLE_SHARDS_MESSAGES_AVAILABLE, SHARDS_MESSAGES_AVAILABLE ),
+                new TableDefinitionStringImpl( TABLE_SHARDS_MESSAGES_INFLIGHT, SHARDS_MESSAGES_AVAILABLE_INFLIGHT )
+        );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardStrategyImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardStrategyImpl.java
new file mode 100644
index 0000000..cfd9a60
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardStrategyImpl.java
@@ -0,0 +1,71 @@
+/*
+ * 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.qakka.serialization.sharding.impl;
+
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.exceptions.NotFoundException;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardIterator;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardStrategy;
+
+import java.text.MessageFormat;
+import java.util.Optional;
+import java.util.UUID;
+
+
+public class ShardStrategyImpl implements ShardStrategy {
+
+    final CassandraClient cassandraClient;
+
+    @Inject
+    public ShardStrategyImpl(CassandraClient cassandraClient) {
+        this.cassandraClient = cassandraClient;
+    }
+
+    @Override
+    public Shard selectShard(String queueName, String region, Shard.Type shardType, UUID pointer) {
+
+        // use shard iterator to walk through shards until shard can be found
+
+        ShardIterator shardIterator = new ShardIterator(
+                cassandraClient, queueName, region, shardType, Optional.empty() );
+
+        if ( !shardIterator.hasNext() ) {
+            String msg = MessageFormat.format(
+                    "No shards found for queue {0} region {1} type {2}", queueName, region, shardType );
+            throw new NotFoundException( msg );
+        }
+
+        // walk through shards from oldest to newest
+
+        Shard prev = shardIterator.next();
+        while ( shardIterator.hasNext() ) {
+            Shard next = shardIterator.next();
+
+            // if item is older than the next shard, the use prev shard
+            if ( pointer.timestamp() < next.getPointer().timestamp() ) {
+                return prev;
+            }
+            prev = next;
+        }
+        return prev;
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLog.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLog.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLog.java
new file mode 100644
index 0000000..048096d
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLog.java
@@ -0,0 +1,84 @@
+/*
+ * 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.qakka.serialization.transferlog;
+
+import java.util.UUID;
+
+
+public class TransferLog {
+    String queueName;
+    String sourceRegion;
+    String destRegion;
+    UUID messageId;
+    long transfer_time;
+
+    public TransferLog(
+            String queueName,
+            String sourceRegion,
+            String destRegion,
+            UUID messageId,
+            long transfer_time) {
+        this.queueName = queueName;
+        this.sourceRegion = sourceRegion;
+        this.destRegion = destRegion;
+        this.messageId = messageId;
+        this.transfer_time = transfer_time;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public void setQueueName(String queueName) {
+        this.queueName = queueName;
+    }
+
+    public String getSourceRegion() {
+        return sourceRegion;
+    }
+
+    public void setSourceRegion(String sourceRegion) {
+        this.sourceRegion = sourceRegion;
+    }
+
+    public String getDestRegion() {
+        return destRegion;
+    }
+
+    public void setDestRegion(String destRegion) {
+        this.destRegion = destRegion;
+    }
+
+    public UUID getMessageId() {
+        return messageId;
+    }
+
+    public void setMessageId(UUID messageId) {
+        this.messageId = messageId;
+    }
+
+    public long getTransfer_time() {
+        return transfer_time;
+    }
+
+    public void setTransfer_time(long transfer_time) {
+        this.transfer_time = transfer_time;
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLogSerialization.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLogSerialization.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLogSerialization.java
new file mode 100644
index 0000000..ea155d7
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/TransferLogSerialization.java
@@ -0,0 +1,62 @@
+/*
+ * 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.qakka.serialization.transferlog;
+
+import com.datastax.driver.core.PagingState;
+import org.apache.usergrid.persistence.core.migration.schema.Migration;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaException;
+import org.apache.usergrid.persistence.qakka.serialization.Result;
+
+import java.util.UUID;
+
+
+public interface TransferLogSerialization extends Migration {
+
+    /**
+     * Record transfer log record.
+     *
+     * @param queueName Name of queue.
+     * @param source Source region.
+     * @param dest Destination region.
+     * @param messageId UUID of message in message_data table.
+     */
+    void recordTransferLog(
+        String queueName, String source, String dest, UUID messageId);
+
+    /**
+     * Remove transfer log record.
+     *
+     * @param queueName Name of queue.
+     * @param source Source region.
+     * @param dest Destination region.
+     * @param messageId UUID of message in message_data table.
+     * @throws QakkaException If transfer log message was not found or could not be removed.
+     */
+    void removeTransferLog(
+        String queueName, String source, String dest, UUID messageId) throws QakkaException;
+
+    /**
+     * Get all transfer logs (for testing purposes)
+     *
+     * @param pagingState Paging state (or null if none)
+     * @param fetchSize Number of rows to be fetched per page (or -1 for default)
+     */
+    Result<TransferLog> getAllTransferLogs(PagingState pagingState, int fetchSize);
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/impl/TransferLogSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/impl/TransferLogSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/impl/TransferLogSerializationImpl.java
new file mode 100644
index 0000000..f9fb0dc
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/impl/TransferLogSerializationImpl.java
@@ -0,0 +1,165 @@
+/*
+ * 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.qakka.serialization.transferlog.impl;
+
+import com.datastax.driver.core.PagingState;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Statement;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
+import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaException;
+import org.apache.usergrid.persistence.qakka.serialization.Result;
+import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLog;
+import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLogSerialization;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+
+public class TransferLogSerializationImpl implements TransferLogSerialization {
+
+    private static final Logger logger = LoggerFactory.getLogger( TransferLogSerializationImpl.class );
+
+    private final CassandraClient cassandraClient;
+
+    public final static String TABLE_TRANSFER_LOG   = "transfer_log";
+
+    public final static String COLUMN_QUEUE_NAME    = "queue_name";
+    public final static String COLUMN_SOURCE_REGION = "source_region";
+    public final static String COLUMN_DEST_REGION   = "dest_region";
+    public final static String COLUMN_MESSAGE_ID    = "message_id";
+    public final static String COLUMN_TRANSFER_TIME = "transfer_time";
+
+    static final String CQL =
+        "CREATE TABLE IF NOT EXISTS transfer_log ( " +
+            "queue_name    text, " +
+            "source_region text, " +
+            "dest_region   text, " +
+            "message_id    timeuuid, " +
+            "transfer_time bigint, " +
+            "PRIMARY KEY ((queue_name, dest_region, message_id)) " +
+            ");  ";
+
+
+    @Inject
+    public TransferLogSerializationImpl( CassandraClient cassandraClient ) {
+        this.cassandraClient = cassandraClient;
+    }
+
+
+    @Override
+    public void recordTransferLog(
+            String queueName, String source, String dest, UUID messageId) {
+
+        Statement insert = QueryBuilder.insertInto(TABLE_TRANSFER_LOG)
+                .value(COLUMN_QUEUE_NAME, queueName )
+                .value(COLUMN_SOURCE_REGION, source )
+                .value(COLUMN_DEST_REGION, dest )
+                .value(COLUMN_MESSAGE_ID, messageId )
+                .value(COLUMN_TRANSFER_TIME, System.currentTimeMillis() );
+        cassandraClient.getSession().execute(insert);
+    }
+
+
+    @Override
+    public void removeTransferLog(
+            String queueName, String source, String dest, UUID messageId ) throws QakkaException {
+
+        Statement query = QueryBuilder.select().all().from(TABLE_TRANSFER_LOG)
+            .where(   QueryBuilder.eq( COLUMN_QUEUE_NAME, queueName ))
+                .and( QueryBuilder.eq( COLUMN_DEST_REGION, dest ))
+                .and( QueryBuilder.eq( COLUMN_MESSAGE_ID, messageId ));
+        ResultSet rs = cassandraClient.getSession().execute( query );
+
+        if ( rs.getAvailableWithoutFetching() == 0 ) {
+            StringBuilder sb = new StringBuilder();
+            sb.append( "Transfer log entry not found for queueName=" ).append( queueName );
+            sb.append( " source=" ).append( source );
+            sb.append( " dest=" ).append( dest );
+            sb.append( " messageId=" ).append( messageId );
+            throw new QakkaException( sb.toString() );
+        }
+
+        Statement deleteQuery = QueryBuilder.delete().from(TABLE_TRANSFER_LOG)
+                .where(   QueryBuilder.eq( COLUMN_QUEUE_NAME, queueName ))
+                    .and( QueryBuilder.eq( COLUMN_DEST_REGION, dest ))
+                .and( QueryBuilder.eq( COLUMN_MESSAGE_ID, messageId ));
+        cassandraClient.getSession().execute( deleteQuery );
+    }
+
+
+    @Override
+    public Result<TransferLog> getAllTransferLogs(PagingState pagingState, int fetchSize ) {
+
+        Statement query = QueryBuilder.select().all().from(TABLE_TRANSFER_LOG);
+
+        query.setFetchSize( fetchSize );
+        if ( pagingState != null ) {
+            query.setPagingState( pagingState );
+        }
+
+        ResultSet rs = cassandraClient.getSession().execute( query );
+        final PagingState newPagingState = rs.getExecutionInfo().getPagingState();
+
+        final List<TransferLog> transferLogs = new ArrayList<>();
+        int numReturned = rs.getAvailableWithoutFetching();
+        for ( int i=0; i<numReturned; i++ ) {
+            Row row = rs.one();
+            TransferLog tlog = new TransferLog(
+                    row.getString( COLUMN_QUEUE_NAME ),
+                    row.getString( COLUMN_SOURCE_REGION ),
+                    row.getString( COLUMN_DEST_REGION ),
+                    row.getUUID( COLUMN_MESSAGE_ID ),
+                    row.getLong( COLUMN_TRANSFER_TIME ));
+            transferLogs.add( tlog );
+        }
+
+        return new Result<TransferLog>() {
+
+            @Override
+            public PagingState getPagingState() {
+                return newPagingState;
+            }
+
+            @Override
+            public List<TransferLog> getEntities() {
+                return transferLogs;
+            }
+        };
+    }
+
+    @Override
+    public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
+        return Collections.EMPTY_LIST;
+    }
+
+    @Override
+    public Collection<TableDefinition> getTables() {
+        return Collections.singletonList( new TableDefinitionStringImpl( TABLE_TRANSFER_LOG, CQL ) );
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
index 6d62da0..7bd0fa7 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
@@ -18,18 +18,18 @@
 package org.apache.usergrid.persistence.queue.guice;
 
 
+import com.google.inject.AbstractModule;
+import com.google.inject.assistedinject.FactoryModuleBuilder;
+import org.apache.usergrid.persistence.qakka.QakkaModule;
+import org.apache.usergrid.persistence.queue.LegacyQueueFig;
+import org.apache.usergrid.persistence.queue.LegacyQueueManager;
+import org.apache.usergrid.persistence.queue.LegacyQueueManagerFactory;
 import org.apache.usergrid.persistence.queue.LegacyQueueManagerInternalFactory;
+import org.apache.usergrid.persistence.queue.impl.QakkaQueueManager;
 import org.apache.usergrid.persistence.queue.impl.QueueManagerFactoryImpl;
 import org.apache.usergrid.persistence.queue.impl.SNSQueueManagerImpl;
 import org.safehaus.guicyfig.GuicyFigModule;
 
-import org.apache.usergrid.persistence.queue.LegacyQueueFig;
-import org.apache.usergrid.persistence.queue.LegacyQueueManager;
-import org.apache.usergrid.persistence.queue.LegacyQueueManagerFactory;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.assistedinject.FactoryModuleBuilder;
-
 
 /**
  * Simple module for wiring our collection api
@@ -44,11 +44,11 @@ public class QueueModule extends AbstractModule {
 
         install(new GuicyFigModule(LegacyQueueFig.class));
 
+        install( new QakkaModule() );
+
         bind(LegacyQueueManagerFactory.class).to(QueueManagerFactoryImpl.class);
-        install(new FactoryModuleBuilder().implement(LegacyQueueManager.class, SNSQueueManagerImpl.class)
+        install( new FactoryModuleBuilder().implement(LegacyQueueManager.class, QakkaQueueManager.class)
             .build(LegacyQueueManagerInternalFactory.class));
 
     }
-
-
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QakkaQueueManager.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QakkaQueueManager.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QakkaQueueManager.java
new file mode 100644
index 0000000..c407a78
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QakkaQueueManager.java
@@ -0,0 +1,178 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+package org.apache.usergrid.persistence.queue.impl;
+
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.ProtocolVersion;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.core.*;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaRuntimeException;
+import org.apache.usergrid.persistence.queue.LegacyQueueFig;
+import org.apache.usergrid.persistence.queue.LegacyQueueManager;
+import org.apache.usergrid.persistence.queue.LegacyQueueMessage;
+import org.apache.usergrid.persistence.queue.LegacyQueueScope;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+
+public class QakkaQueueManager implements LegacyQueueManager {
+    private static final Logger logger = LoggerFactory.getLogger( QakkaQueueManager.class );
+
+    private final LegacyQueueScope    scope;
+    private final LegacyQueueFig      fig;
+    private final QueueManager        queueManager;
+    private final QueueMessageManager queueMessageManager;
+    private final QakkaFig            qakkaFig;
+    private final Regions             regions;
+
+
+    @Inject
+    public QakkaQueueManager(
+        @Assisted LegacyQueueScope scope,
+        LegacyQueueFig      fig,
+        QueueManager        queueManager,
+        QueueMessageManager queueMessageManager,
+        QakkaFig            qakkaFig,
+        Regions             regions
+    ) {
+
+        this.scope = scope;
+        this.fig = fig;
+        this.queueManager = queueManager;
+        this.qakkaFig = qakkaFig;
+        this.queueMessageManager = queueMessageManager;
+        this.regions = regions;
+
+        if ( queueManager.getQueueConfig(scope.getName()) == null ) {
+
+            // TODO: read defaults from config
+            //queueManager.createQueue( new Queue( queueName, "test-type", region, region, 0L, 5, 10, null ));
+
+            Queue queue = new Queue( scope.getName() );
+            queueManager.createQueue( queue );
+        }
+    }
+
+
+    @Override
+    public <T extends Serializable> void sendMessage(T body) throws IOException {
+
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(bos);
+        oos.writeObject(body);
+        oos.flush();
+        oos.close();
+        ByteBuffer byteBuffer = ByteBuffer.wrap( bos.toByteArray() );
+
+        queueMessageManager.sendMessages(
+            scope.getName(),
+            regions.getRegions( scope.getRegionImplementation().name() ),
+            null, // delay millis
+            null, // expiration seconds
+            "application/octet-stream",
+            DataType.serializeValue( byteBuffer, ProtocolVersion.NEWEST_SUPPORTED ));
+    }
+
+
+    @Override
+    public <T extends Serializable> void sendMessageToTopic(T body) throws IOException {
+        sendMessage( body );
+    }
+
+
+    @Override
+    public List<LegacyQueueMessage> getMessages(int limit, Class klass) {
+
+        List<LegacyQueueMessage> messages = new ArrayList<>();
+        List<QueueMessage> qakkaMessages = queueMessageManager.getNextMessages( scope.getName(), limit );
+
+        for ( QueueMessage qakkaMessage : qakkaMessages ) {
+
+            Object body;
+            try {
+                ByteBuffer messageData = queueMessageManager.getMessageData( qakkaMessage.getMessageId() );
+                ByteBuffer bb = (ByteBuffer)DataType.blob().deserialize(
+                    messageData, ProtocolVersion.NEWEST_SUPPORTED );
+
+                ByteArrayInputStream bais = new ByteArrayInputStream( bb.array() );
+                ObjectInputStream ios = new ObjectInputStream( bais );
+                body = ios.readObject();
+
+            } catch (Throwable t) {
+                throw new QakkaRuntimeException( "Error de-serializing object", t );
+            }
+
+            LegacyQueueMessage legacyQueueMessage = new LegacyQueueMessage(
+                qakkaMessage.getQueueMessageId().toString(),
+                null,   // handle
+                body,
+                null);  // type
+
+            messages.add( legacyQueueMessage );
+        }
+
+        return messages;
+    }
+
+
+    @Override
+    public long getQueueDepth() {
+        return 0;
+    }
+
+
+    @Override
+    public void commitMessage(LegacyQueueMessage queueMessage) {
+
+        UUID queueMessageId  = UUID.fromString( queueMessage.getMessageId() );
+        queueMessageManager.ackMessage( scope.getName(), queueMessageId );
+    }
+
+
+    @Override
+    public void commitMessages(List<LegacyQueueMessage> queueMessages) {
+
+        for ( LegacyQueueMessage message : queueMessages ) {
+            commitMessage( message );
+        }
+    }
+
+
+    @Override
+    public void sendMessages( List bodies ) throws IOException {
+
+        for ( Object body : bodies ) {
+            sendMessage( (Serializable)body );
+        }
+
+    }
+
+
+    @Override
+    public void deleteQueue() {
+        queueManager.deleteQueue( scope.getName() );
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QueueManagerFactoryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QueueManagerFactoryImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QueueManagerFactoryImpl.java
index 2d51903..c1bdc72 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QueueManagerFactoryImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QueueManagerFactoryImpl.java
@@ -67,7 +67,9 @@ public class QueueManagerFactoryImpl implements LegacyQueueManagerFactory {
             });
 
     @Inject
-    public QueueManagerFactoryImpl(final LegacyQueueFig queueFig, final LegacyQueueManagerInternalFactory queuemanagerInternalFactory){
+    public QueueManagerFactoryImpl(
+        final LegacyQueueFig queueFig, final LegacyQueueManagerInternalFactory queuemanagerInternalFactory) {
+
         this.queueFig = queueFig;
         this.queuemanagerInternalFactory = queuemanagerInternalFactory;
         this.defaultManager = new HashMap<>(10);

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/webapp/WEB-INF/web.xml b/stack/corepersistence/queue/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..cc94f07
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<web-app xmlns="http://java.sun.com/xml/ns/javaee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+         version="3.0">
+
+    <display-name>qakka</display-name>
+
+    <listener>
+        <listener-class>org.apache.usergrid.persistence.qakka.api.impl.StartupListener</listener-class>
+    </listener>
+ 
+    <filter>
+        <filter-name>qakka</filter-name>
+        <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
+
+        <init-param>
+            <param-name>javax.ws.rs.Application</param-name>
+            <param-value>org.apache.usergrid.persistence.qakka.api.impl.JerseyResourceConfig</param-value>
+        </init-param>
+
+        <init-param>
+            <param-name>jersey.config.server.tracing.type</param-name>
+            <!-- allowed values are OFF, ON_DEMAND, ALL -->
+            <param-value>OFF</param-value>
+        </init-param>
+
+    </filter>
+
+    <filter-mapping>
+        <filter-name>qakka</filter-name>
+        <url-pattern>/api/*</url-pattern>
+    </filter-mapping>
+    
+</web-app>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
new file mode 100644
index 0000000..8f5284c
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
@@ -0,0 +1,79 @@
+/*
+ * 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.qakka;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.apache.usergrid.persistence.core.migration.schema.MigrationException;
+import org.apache.usergrid.persistence.core.migration.schema.MigrationManager;
+import org.apache.usergrid.persistence.queue.guice.QueueModule;
+import org.junit.BeforeClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+
+public class AbstractTest {
+    private static final Logger logger = LoggerFactory.getLogger( AbstractTest.class );
+
+    static AtomicInteger nextPort = new AtomicInteger(3551);
+
+    protected static Injector sharedInjector;
+
+    static { new KeyspaceDropper(); }
+
+
+    public AbstractTest() {
+        if ( getInjector() == null ) {
+            setInjector( Guice.createInjector( new QueueModule() ) );
+            MigrationManager migrationManager = getInjector().getInstance( MigrationManager.class );
+            try {
+                migrationManager.migrate();
+            } catch (MigrationException e) {
+                logger.error("Error in migration", e);
+            }
+        }
+    }
+
+    protected Injector getInjector() {
+        return sharedInjector;
+    }
+
+    protected static void setInjector(Injector injector) {
+        AbstractTest.sharedInjector = injector;
+    }
+
+
+    protected int getNextAkkaPort() {
+        int ret = nextPort.getAndIncrement();
+        logger.info("Returning port {} for this {}", ret, this.hashCode());
+        return ret;
+    }
+
+
+    @BeforeClass
+    public static void startCassandra() throws Exception {
+        //EmbeddedCassandraServerHelper.startEmbeddedCassandra("/cassandra.yaml");
+    }
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/KeyspaceDropper.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/KeyspaceDropper.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/KeyspaceDropper.java
new file mode 100644
index 0000000..aa4dfd1
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/KeyspaceDropper.java
@@ -0,0 +1,70 @@
+/*
+ * 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.qakka;
+
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.ConsistencyLevel;
+import com.datastax.driver.core.QueryOptions;
+import com.datastax.driver.core.Session;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.Properties;
+
+
+/**
+ * Created by Dave Johnson (snoopdave@apache.org) on 9/9/16.
+ */
+public class KeyspaceDropper {
+    
+    private static final Logger logger = LoggerFactory.getLogger( AbstractTest.class );
+    
+    static { dropTestKeyspace(); }
+
+    
+    public static void dropTestKeyspace() {
+
+        String propsFileName = "qakka.properties";
+
+        Properties props = new Properties();
+        try {
+            props.load( App.class.getResourceAsStream( "/" + propsFileName ) );
+        } catch (IOException e) {
+            throw new RuntimeException( "Unable to load " + propsFileName + " file!" );
+        }
+
+        String keyspace =     (String)props.get("cassandra.keyspace.application");
+        String hosts[] =              props.getProperty( "cassandra.hosts", "127.0.0.1" ).split(",");
+        int port = Integer.parseInt(  props.getProperty( "cassandra.port", "9042" ));
+
+        Cluster.Builder builder = Cluster.builder();
+        for ( String host : hosts ) {
+            builder = builder.addContactPoint( host ).withPort( port );
+        }
+
+        final QueryOptions queryOptions = new QueryOptions().setConsistencyLevel( ConsistencyLevel.LOCAL_QUORUM );
+        builder.withQueryOptions( queryOptions );
+        Cluster cluster = builder.build();
+
+        Session session = cluster.connect();
+        logger.info("Dropping test keyspace: {}", keyspace);
+        session.execute( "DROP KEYSPACE IF EXISTS " + keyspace );
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/api/AbstractRestTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/api/AbstractRestTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/api/AbstractRestTest.java
new file mode 100644
index 0000000..a7d6215
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/api/AbstractRestTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.qakka.api;
+
+
+import org.apache.usergrid.persistence.qakka.KeyspaceDropper;
+import org.apache.usergrid.persistence.qakka.api.impl.StartupListener;
+import org.apache.usergrid.persistence.qakka.api.impl.JerseyResourceConfig;
+import org.glassfish.jersey.test.DeploymentContext;
+import org.glassfish.jersey.test.JerseyTest;
+import org.glassfish.jersey.test.ServletDeploymentContext;
+import org.junit.BeforeClass;
+
+import javax.ws.rs.core.Application;
+
+
+abstract public class AbstractRestTest extends JerseyTest {
+
+    static Application app;
+
+    static DeploymentContext context = null;
+
+    static { new KeyspaceDropper(); }
+    
+
+    @BeforeClass
+    public static void startCassandra() throws Exception {
+        //EmbeddedCassandraServerHelper.startEmbeddedCassandra("/cassandra.yaml");
+    }
+    
+    @Override
+    protected Application configure() {
+        if ( app == null ) {
+            app = new JerseyResourceConfig();
+        }
+        return app;
+    }
+
+    @Override
+    protected DeploymentContext configureDeployment() {
+        if ( context == null ) {
+            context = ServletDeploymentContext.builder( configure() ) .addListener( StartupListener.class ).build();
+        }
+        return context;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/api/PerformanceTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/api/PerformanceTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/api/PerformanceTest.java
new file mode 100644
index 0000000..b99be69
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/api/PerformanceTest.java
@@ -0,0 +1,148 @@
+/*
+ * 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.qakka.api;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.persistence.qakka.core.QueueMessage;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.net.URISyntaxException;
+import java.util.*;
+
+
+public class PerformanceTest {
+    private static final Logger logger = LoggerFactory.getLogger( PerformanceTest.class );
+
+    
+    @Test
+    @Ignore("needs exernal Tomcat an Cassandra")
+    public void testSendAndGetMessagePerformance() throws URISyntaxException, JsonProcessingException {
+
+        Client client = ClientBuilder.newClient();
+        
+        WebTarget target = client.target("http://macsnoopdave2013:8080/api/");
+        
+        // create a queue
+
+        String queueName = "pt_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
+        Map<String, Object> queueMap = new HashMap<String, Object>() {{ put("name", queueName); }};
+        target.path("queues").request().post( Entity.entity( queueMap, MediaType.APPLICATION_JSON_TYPE));
+
+        // send some messages
+        int numMessages = 20000;
+
+        {
+            ObjectMapper mapper = new ObjectMapper();
+            List<Long> times = new ArrayList<>( numMessages );
+            int errorCount = 0;
+            int counter = 0;
+            
+            for (int i = 0; i < numMessages; i++) {
+
+                final int number = i;
+                Map<String, Object> messageMap = new HashMap<String, Object>() {{
+                    put( "message", "this is message #" + number );
+                    put( "valid", true );
+                }};
+                String body = mapper.writeValueAsString( messageMap );
+
+                long startTime = System.currentTimeMillis();
+                Response post = target.path( "queues" ).path( queueName ).path( "messages" )
+                        .request().post( Entity.entity( body, MediaType.APPLICATION_OCTET_STREAM_TYPE ) );
+                long stopTime = System.currentTimeMillis();
+                times.add( stopTime - startTime );
+
+                if ( post.getStatus() != 200 ) {
+                    errorCount++;
+                }
+
+                if ( ++counter % 500 == 0 ) {
+                    logger.debug("Sent {} messages with error count {}", counter, errorCount);
+                }
+
+                try { Thread.sleep(5); } catch ( Exception intentionallyIgnored ) {};
+            }
+
+            Long total = times.stream().mapToLong( time -> time ).sum();
+            Long max = times.stream().max( Comparator.comparing( time -> time ) ).get();
+            Long min = times.stream().min( Comparator.comparing( time -> time ) ).get();
+            Double average = times.stream().mapToLong( time -> time ).average().getAsDouble();
+
+            logger.debug( "\n>>>>>>> Total send time {}ms, min {}ms, max {}ms, average {}ms errors {}\n\n", 
+                    total, min, max, average, errorCount );
+        }
+
+        // get all messages, checking for dups
+
+        {
+            Set<UUID> messageIds = new HashSet<>();
+            List<Long> times = new ArrayList<>( numMessages );
+            int errorCount = 0;
+            int counter = 0;
+            
+            for (int j = 0; j < numMessages; j++) {
+
+                long startTime = System.currentTimeMillis();
+                Response response = target.path( "queues" ).path( queueName ).path( "messages" ).request().get();
+                long stopTime = System.currentTimeMillis();
+                times.add( stopTime - startTime );
+
+                if ( ++counter % 500 == 0 ) {
+                    logger.debug("Got {} messages with error count {}", counter, errorCount);
+                }
+                
+                if ( response .getStatus() != 200 ) {
+                    errorCount++;
+                    continue;
+                }
+
+                ApiResponse apiResponse = response.readEntity( ApiResponse.class );
+                QueueMessage queueMessage = apiResponse.getQueueMessages().iterator().next();
+
+                if (messageIds.contains( queueMessage.getQueueMessageId() )) {
+                    Assert.fail( "Message fetched twice: " + queueMessage.getQueueMessageId() );
+                } else {
+                    messageIds.add( queueMessage.getQueueMessageId() );
+                }
+            }
+            Assert.assertEquals( numMessages, messageIds.size() );
+
+            Long total = times.stream().mapToLong( time -> time ).sum();
+            Long max = times.stream().max( Comparator.comparing( time -> time ) ).get();
+            Long min = times.stream().min( Comparator.comparing( time -> time ) ).get();
+            Double average = times.stream().mapToLong( time -> time ).average().getAsDouble();
+
+            logger.debug( "\n>>>>>>> Total get time {}ms, min {}ms, max {}ms, average {}ms errors {}\n\n", 
+                    total, min, max, average, errorCount );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/api/QueueResourceTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/api/QueueResourceTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/api/QueueResourceTest.java
new file mode 100644
index 0000000..fcb4212
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/api/QueueResourceTest.java
@@ -0,0 +1,418 @@
+/*
+ * 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.qakka.api;
+
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.io.ByteStreams;
+import com.google.inject.Injector;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.api.impl.StartupListener;
+import org.apache.usergrid.persistence.qakka.core.QueueMessage;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URISyntaxException;
+import java.util.*;
+
+import static org.junit.Assert.fail;
+
+
+public class QueueResourceTest extends AbstractRestTest {
+    private static final Logger logger = LoggerFactory.getLogger( QueueResourceTest.class );
+
+    static private final TypeReference<Map<String,Object>> jsonMapTypeRef
+            = new TypeReference<Map<String,Object>>() {};
+
+    @Test
+    public void testCreateQueue() throws URISyntaxException {
+
+        // create a queue
+
+        String queueName = "qrt_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
+        Map<String, Object> queueMap = new HashMap<String, Object>() {{
+            put("name", queueName);
+        }};
+        Response response = target("queues").request()
+                .post( Entity.entity( queueMap, MediaType.APPLICATION_JSON_TYPE));
+
+        Assert.assertEquals( 201, response.getStatus() );
+        URIStrategy uriStrategy = StartupListener.INJECTOR.getInstance( URIStrategy.class );
+        Assert.assertEquals( uriStrategy.queueURI( queueName ).toString(), response.getHeaderString( "location" ) );
+
+        // get queue by name
+
+        response = target("queues").path( queueName ).path( "config" ).request().get();
+        Assert.assertEquals( 200, response.getStatus() );
+        ApiResponse apiResponse = response.readEntity( ApiResponse.class );
+        Assert.assertNotNull( apiResponse.getQueues() );
+        Assert.assertFalse( apiResponse.getQueues().isEmpty() );
+        Assert.assertEquals( 1, apiResponse.getQueues().size() );
+        Assert.assertEquals( queueName, apiResponse.getQueues().iterator().next().getName() );
+    }
+
+
+    @Test
+    public void testDeleteQueue() throws URISyntaxException {
+
+        // create a queue
+
+        String queueName = "qrt_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
+        Map<String, Object> queueMap = new HashMap<String, Object>() {{ put("name", queueName); }};
+        Response response = target("queues").request()
+                .post( Entity.entity( queueMap, MediaType.APPLICATION_JSON_TYPE));
+
+        Assert.assertEquals( 201, response.getStatus() );
+        URIStrategy uriStrategy = StartupListener.INJECTOR.getInstance( URIStrategy.class );
+        Assert.assertEquals( uriStrategy.queueURI( queueName ).toString(), response.getHeaderString( "location" ) );
+
+        // delete queue without confirm = true, should fail with bad request
+
+        response = target("queues").path( queueName ).request().delete();
+        Assert.assertEquals( 400, response.getStatus() );
+
+        // delete queue with confirm = true
+
+        response = target("queues").path( queueName ).queryParam( "confirm", true ).request().delete();
+        Assert.assertEquals( 200, response.getStatus() );
+
+        // cannot get queue by name
+
+        response = target("queues").path( queueName ).path( "config" ).request().get();
+        Assert.assertEquals( 404, response.getStatus() );
+    }
+
+
+    @Test
+    public void testSendMessageToBadQueue() throws URISyntaxException, JsonProcessingException, InterruptedException {
+
+        String queueName = "bogus_queue_is_bogus";
+        Map<String, Object> messageMap = new HashMap<String, Object>() {{ put("dummy_prop", "dummy_value"); }};
+        ObjectMapper mapper = new ObjectMapper();
+        String body = mapper.writeValueAsString( messageMap );
+
+        Response response = target("queues").path( queueName ).path( "messages" )
+                .request().post( Entity.entity( body, MediaType.APPLICATION_OCTET_STREAM_TYPE ));
+
+        Assert.assertEquals( 404, response.getStatus() );
+    }
+
+
+    @Test
+    public void testSendJsonMessagesAsJson() throws URISyntaxException, IOException, InterruptedException {
+        sendJsonMessages( true );
+    }
+
+
+    @Test
+    public void testSendMessagesJsonAsOctetStream() throws URISyntaxException, IOException, InterruptedException {
+        sendJsonMessages( false );
+    }
+
+
+    /**
+     * Send 100 JSON payload messages to queue.
+     * @param asJson True to send with content-type header 'application/json'
+     *               False to send with content-type header 'application/octet stream'
+     */
+    private void sendJsonMessages( boolean asJson ) throws URISyntaxException, IOException, InterruptedException {
+
+        // create a queue
+
+        String queueName = "qrt_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
+        Map<String, Object> queueMap = new HashMap<String, Object>() {{
+            put( "name", queueName );
+        }};
+        target( "queues" ).request().post( Entity.entity( queueMap, MediaType.APPLICATION_JSON_TYPE ) );
+
+        // send some messages
+
+        ObjectMapper mapper = new ObjectMapper();
+
+        int numMessages = 100;
+        for (int i = 0; i < numMessages; i++) {
+
+            final int number = i;
+            Map<String, Object> messageMap = new HashMap<String, Object>() {{
+                put( "message", "this is message #" + number );
+                put( "valid", true );
+            }};
+            String body = mapper.writeValueAsString( messageMap );
+
+            Response response;
+            if ( asJson ) {
+                response = target( "queues" ).path( queueName ).path( "messages" )
+                        .request().post( Entity.entity( body, MediaType.APPLICATION_JSON ) );
+            } else {
+                response = target( "queues" ).path( queueName ).path( "messages" )
+                        .queryParam( "contentType", MediaType.APPLICATION_JSON )
+                        .request().post( Entity.entity( body, MediaType.APPLICATION_OCTET_STREAM ) );
+            }
+
+            Assert.assertEquals( 200, response.getStatus() );
+        }
+
+        // get all messages, checking for dups
+
+        checkJsonMessages( queueName, numMessages );
+    }
+
+
+    private Set<UUID> checkJsonMessages( String queueName, int numMessages ) throws IOException {
+
+        ObjectMapper mapper = new ObjectMapper();
+
+        Set<UUID> messageIds = new HashSet<>();
+        for ( int j=0; j<numMessages; j++ ) {
+
+            int retries = 0;
+            int maxRetries = 10;
+            ApiResponse apiResponse = null;
+            while ( retries++ < maxRetries ) {
+                Response response = target( "queues" ).path( queueName ).path( "messages" ).request().get();
+                apiResponse = response.readEntity( ApiResponse.class );
+                if ( !apiResponse.getQueueMessages().isEmpty() ) {
+                    break;
+                }
+                try { Thread.sleep(500); } catch (Exception ignored) {}
+            }
+
+            Assert.assertNotNull(   apiResponse );
+            Assert.assertNotNull(   apiResponse.getQueueMessages() );
+            Assert.assertEquals( 1, apiResponse.getQueueMessages().size() );
+
+            QueueMessage queueMessage = apiResponse.getQueueMessages().iterator().next();
+            Map<String, Object> payload = mapper.readValue( queueMessage.getData(), jsonMapTypeRef );
+
+            Assert.assertEquals( queueName, queueMessage.getQueueName() );
+            Assert.assertNull( queueMessage.getHref() );
+            Assert.assertEquals( true, payload.get("valid") );
+
+            if (messageIds.contains( queueMessage.getQueueMessageId() )) {
+                Assert.fail("Message fetched twice: " + queueMessage.getQueueMessageId() );
+            } else {
+                messageIds.add( queueMessage.getQueueMessageId() );
+            }
+        }
+        Assert.assertEquals( numMessages, messageIds.size() );
+
+        return messageIds;
+    }
+
+
+    @Test
+    public void testSendBinaryMessages() throws URISyntaxException, IOException, InterruptedException {
+
+        // create a queue
+
+        String queueName = "qrt_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
+        Map<String, Object> queueMap = new HashMap<String, Object>() {{
+            put( "name", queueName );
+        }};
+        target( "queues" ).request().post( Entity.entity( queueMap, MediaType.APPLICATION_JSON_TYPE ) );
+
+        // send messages each with image/jpg payload
+
+        InputStream is = getClass().getResourceAsStream("/qakka-duck.jpg");
+        byte[] bytes = ByteStreams.toByteArray( is );
+
+        int numMessages = 100;
+        for (int i = 0; i < numMessages; i++) {
+
+            Response response = target( "queues" ).path( queueName ).path( "messages" )
+                    .queryParam( "contentType", "image/jpg" )
+                    .request()
+                    .post( Entity.entity( bytes, MediaType.APPLICATION_OCTET_STREAM ));
+
+            Assert.assertEquals( 200, response.getStatus() );
+        }
+
+        // get all messages, checking for dups
+
+        checkBinaryMessages( queueName, numMessages );
+    }
+
+
+    private Set<UUID> checkBinaryMessages( String queueName, int numMessages ) throws IOException {
+
+        Set<UUID> messageIds = new HashSet<>();
+        for ( int j=0; j<numMessages; j++ ) {
+
+            Response response = target( "queues" ).path( queueName ).path( "messages" ).request().get();
+
+            ApiResponse apiResponse = response.readEntity( ApiResponse.class );
+            Assert.assertNotNull(   apiResponse.getQueueMessages() );
+            Assert.assertFalse(     apiResponse.getQueueMessages().isEmpty() );
+            Assert.assertEquals( 1, apiResponse.getQueueMessages().size() );
+
+            QueueMessage queueMessage = apiResponse.getQueueMessages().iterator().next();
+
+            // no data in a binary message
+            Assert.assertNull( queueMessage.getData() );
+
+            // data can be found at HREF provided
+            Assert.assertNotNull( queueMessage.getHref() );
+
+            Response binaryResponse = target("queues")
+                    .path( queueName ).path("data").path( queueMessage.getQueueMessageId().toString() )
+                    .request().accept( "image/jpg" ).get();
+
+            Assert.assertEquals( 200, binaryResponse.getStatus() );
+            InputStream is = binaryResponse.readEntity( InputStream.class );
+
+            byte[] imageBytes = ByteStreams.toByteArray( is );
+            Assert.assertEquals( 11188, imageBytes.length);
+
+            if (messageIds.contains( queueMessage.getQueueMessageId() )) {
+                fail("Message fetched twice: " + queueMessage.getQueueMessageId() );
+            } else {
+                messageIds.add( queueMessage.getQueueMessageId() );
+            }
+        }
+        Assert.assertEquals( numMessages, messageIds.size() );
+
+        return messageIds;
+    }
+
+
+    @Test
+    public void testSendMessageAckAndTimeout() throws URISyntaxException, IOException, InterruptedException {
+
+        // create a queue
+
+        String queueName = "qrt_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
+        Map<String, Object> queueMap = new HashMap<String, Object>() {{ put("name", queueName); }};
+        target("queues").request().post( Entity.entity( queueMap, MediaType.APPLICATION_JSON_TYPE));
+
+        // send some messages
+
+        ObjectMapper mapper = new ObjectMapper();
+
+        int numMessages = 100;
+        for ( int i=0; i<numMessages; i++ ) {
+
+            final int number = i;
+            Map<String, Object> messageMap = new HashMap<String, Object>() {{
+                put("message", "this is message #" + number);
+                put("valid", true );
+            }};
+            String body = mapper.writeValueAsString( messageMap );
+
+            Response response = target("queues").path( queueName ).path( "messages" )
+                    .request().post( Entity.entity( body, MediaType.APPLICATION_JSON ));
+
+            Assert.assertEquals( 200, response.getStatus() );
+        }
+
+        // get all messages, checking for dups
+
+        Set<UUID> messageIds = checkJsonMessages( queueName, numMessages );
+
+        // there should be no more messages available
+
+        Response response = target( "queues" ).path( queueName ).path( "messages" ).request().get();
+        ApiResponse apiResponse = response.readEntity( ApiResponse.class );
+        Assert.assertNotNull( apiResponse.getQueueMessages() );
+        Assert.assertTrue( apiResponse.getQueueMessages().isEmpty() );
+
+        // ack half of the messages
+
+        int count = 0;
+        Set<UUID> ackedIds = new HashSet<>();
+        for ( UUID queueMessageId : messageIds ) {
+            response = target( "queues" )
+                    .path( queueName ).path( "messages" ).path( queueMessageId.toString() ).request().delete();
+            Assert.assertEquals( 200, response.getStatus() );
+            ackedIds.add( queueMessageId );
+            if ( ++count >= numMessages/2 ) {
+                break;
+            }
+        }
+        messageIds.removeAll( ackedIds );
+
+        // wait for remaining of the messages to timeout
+
+        QakkaFig qakkaFig = StartupListener.INJECTOR.getInstance( QakkaFig.class );
+        Thread.sleep( 2*qakkaFig.getQueueTimeoutSeconds() * 1000 );
+
+        // now, the remaining messages cannot be acked because they timed out
+
+        for ( UUID queueMessageId : messageIds ) {
+            response = target( "queues" )
+                    .path( queueName ).path( "messages" ).path( queueMessageId.toString() ).request().delete();
+            Assert.assertEquals( 400, response.getStatus() );
+        }
+
+        // and, those same messages should be available again in the queue
+
+        checkJsonMessages( queueName, numMessages/2 );
+    }
+
+
+    @Test
+    public void testConvertDelayParameter() {
+
+        Injector injector = StartupListener.INJECTOR;
+        QueueResource queueResource = injector.getInstance( QueueResource.class );
+
+        Assert.assertEquals( 0L, queueResource.convertDelayParameter( "" ).longValue() );
+        Assert.assertEquals( 0L, queueResource.convertDelayParameter( "0" ).longValue() );
+        Assert.assertEquals( 0L, queueResource.convertDelayParameter( "NONE" ).longValue() );
+        Assert.assertEquals( 5L, queueResource.convertDelayParameter( "5" ).longValue() );
+
+        try {
+            queueResource.convertDelayParameter( "bogus value" );
+            fail("Expected exception on bad value");
+        } catch ( IllegalArgumentException expected ) {
+            // pass
+        }
+    }
+
+    @Test
+    public void testConvertExpirationParameter() {
+
+        Injector injector = StartupListener.INJECTOR;
+        QueueResource queueResource = injector.getInstance( QueueResource.class );
+
+        Assert.assertNull( queueResource.convertExpirationParameter( "" ) );
+        Assert.assertNull( queueResource.convertExpirationParameter( "NEVER" ) );
+
+        Assert.assertEquals( 5L, queueResource.convertExpirationParameter( "5" ).longValue() );
+
+        try {
+            queueResource.convertExpirationParameter( "bogus value" );
+            fail("Expected exception on bad value");
+        } catch ( IllegalArgumentException expected ) {
+            // pass
+        }
+    }
+
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/common/CassandraClientTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/common/CassandraClientTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/common/CassandraClientTest.java
new file mode 100644
index 0000000..42423fa
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/common/CassandraClientTest.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.qakka.common;
+
+import com.datastax.driver.core.Session;
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.junit.Test;
+
+
+/**
+ * Created by russo on 6/8/16.
+ */
+public class CassandraClientTest extends AbstractTest {
+    
+    @Test
+    public void getClient(){
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+
+        Session session = cassandraClient.getSession();
+
+        session.getLoggedKeyspace();
+
+    }
+
+
+}


[17/25] usergrid git commit: Still some intermittent failures in the queue module, but now able to get through ALL Usergrid tests w/Qakka

Posted by sn...@apache.org.
Still some intermittent failures in the queue module, but now able to get through ALL Usergrid tests w/Qakka


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

Branch: refs/heads/usergrid-1318-queue
Commit: ee0dda4cca0ff5cd56b9574f998222f439fa948c
Parents: ffeadb2
Author: Dave Johnson <sn...@apache.org>
Authored: Wed Sep 14 16:08:30 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Wed Sep 14 16:08:30 2016 -0400

----------------------------------------------------------------------
 .../index/guice/TestIndexModule.java            |  2 +
 stack/corepersistence/queue/pom.xml             |  2 +-
 .../usergrid/persistence/qakka/QakkaModule.java |  6 +-
 .../qakka/api/impl/GuiceWebModule.java          | 41 ++++++++++
 .../qakka/api/impl/StartupListener.java         |  3 +-
 .../persistence/queue/guice/QueueModule.java    | 84 +-------------------
 .../persistence/qakka/AbstractTest.java         |  3 +-
 .../qakka/core/QueueMessageManagerTest.java     |  3 +-
 .../distributed/QueueActorServiceTest.java      |  3 +-
 .../actors/QueueActorHelperTest.java            |  3 +-
 .../distributed/actors/ShardAllocatorTest.java  |  3 +-
 .../queue/LegacyQueueManagerTest.java           |  2 +-
 .../usergrid/persistence/queue/TestModule.java  | 42 ++++++++++
 stack/pom.xml                                   |  2 +-
 14 files changed, 101 insertions(+), 98 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee0dda4c/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/guice/TestIndexModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/guice/TestIndexModule.java b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/guice/TestIndexModule.java
index 410f0e3..3bc6193 100644
--- a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/guice/TestIndexModule.java
+++ b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/guice/TestIndexModule.java
@@ -19,6 +19,7 @@
 package org.apache.usergrid.persistence.index.guice;
 
 
+import org.apache.usergrid.persistence.actorsystem.ActorSystemModule;
 import org.safehaus.guicyfig.GuicyFigModule;
 
 import org.apache.usergrid.persistence.core.guice.CommonModule;
@@ -37,6 +38,7 @@ public class TestIndexModule extends TestModule {
     @Override
     protected void configure() {
 
+        install( new ActorSystemModule());
         install( new CommonModule());
 
         // configure collections and our core astyanax framework

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee0dda4c/stack/corepersistence/queue/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/pom.xml b/stack/corepersistence/queue/pom.xml
index 48417d5..488d9f2 100644
--- a/stack/corepersistence/queue/pom.xml
+++ b/stack/corepersistence/queue/pom.xml
@@ -37,7 +37,7 @@
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>
         <servlet.version>3.0.1</servlet.version>
-        <jersey.version>2.23.1</jersey.version>
+        <jersey.version>2.21</jersey.version>
         <guice-bridge.version>2.4.0</guice-bridge.version>
     </properties>
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee0dda4c/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
index 6a60c97..0c37e82 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
@@ -23,8 +23,6 @@ import com.google.inject.AbstractModule;
 import com.google.inject.Key;
 import com.google.inject.multibindings.Multibinder;
 import com.netflix.config.ConfigurationManager;
-import org.apache.usergrid.persistence.actorsystem.ActorSystemModule;
-import org.apache.usergrid.persistence.core.guice.CommonModule;
 import org.apache.usergrid.persistence.core.migration.schema.Migration;
 import org.apache.usergrid.persistence.qakka.api.URIStrategy;
 import org.apache.usergrid.persistence.qakka.api.impl.URIStrategyLocalhost;
@@ -67,15 +65,13 @@ public class QakkaModule extends AbstractModule {
             // load properties from one properties file using Netflix Archaius so that GuicyFig will see them
             ConfigurationManager.loadCascadedPropertiesFromResources( "qakka" );
         } catch (IOException e) {
-            throw new RuntimeException( "Cannot qakka.properties file", e );
+            logger.warn("Unable to load qakka.properties");
         }
     }
 
     @Override
     protected void configure() {
 
-        install( new CommonModule() );
-        install( new ActorSystemModule() );
         install( new GuicyFigModule( QakkaFig.class ) );
 
         bind( App.class );

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee0dda4c/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/GuiceWebModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/GuiceWebModule.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/GuiceWebModule.java
new file mode 100644
index 0000000..619fbc1
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/GuiceWebModule.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
+package org.apache.usergrid.persistence.qakka.api.impl;
+
+import com.google.inject.AbstractModule;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemModule;
+import org.apache.usergrid.persistence.core.guice.CommonModule;
+import org.apache.usergrid.persistence.qakka.QakkaModule;
+import org.apache.usergrid.persistence.queue.guice.QueueModule;
+
+
+/**
+ * Created by Dave Johnson (snoopdave@apache.org) on 9/14/16.
+ */
+public class GuiceWebModule extends AbstractModule {
+
+
+    @Override
+    protected void configure() {
+        install( new CommonModule() );
+        install( new ActorSystemModule() );
+        install( new QakkaModule() );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee0dda4c/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/StartupListener.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/StartupListener.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/StartupListener.java
index d97363a..5e308d5 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/StartupListener.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/StartupListener.java
@@ -24,7 +24,6 @@ import com.google.inject.Injector;
 import com.google.inject.servlet.GuiceServletContextListener;
 import com.google.inject.servlet.ServletModule;
 import org.apache.usergrid.persistence.qakka.App;
-import org.apache.usergrid.persistence.qakka.QakkaModule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.bridge.SLF4JBridgeHandler;
@@ -48,7 +47,7 @@ public class StartupListener extends GuiceServletContextListener {
             INJECTOR = Guice.createInjector( new ServletModule() {
                 @Override
                 protected void configureServlets() {
-                    install( new QakkaModule() );
+                    install( new GuiceWebModule() );
                 }
             } );
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee0dda4c/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
index d2247c1..fff187e 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
@@ -19,55 +19,19 @@ package org.apache.usergrid.persistence.queue.guice;
 
 
 import com.google.inject.AbstractModule;
-import com.google.inject.Key;
 import com.google.inject.assistedinject.FactoryModuleBuilder;
-import com.google.inject.multibindings.Multibinder;
-import org.apache.usergrid.persistence.actorsystem.ActorSystemModule;
-import org.apache.usergrid.persistence.core.guice.CommonModule;
-import org.apache.usergrid.persistence.core.migration.schema.Migration;
-import org.apache.usergrid.persistence.qakka.App;
-import org.apache.usergrid.persistence.qakka.MetricsService;
-import org.apache.usergrid.persistence.qakka.QakkaFig;
 import org.apache.usergrid.persistence.qakka.QakkaModule;
-import org.apache.usergrid.persistence.qakka.api.URIStrategy;
-import org.apache.usergrid.persistence.qakka.api.impl.URIStrategyLocalhost;
-import org.apache.usergrid.persistence.qakka.core.*;
-import org.apache.usergrid.persistence.qakka.core.impl.QueueManagerImpl;
-import org.apache.usergrid.persistence.qakka.core.impl.QueueMessageManagerImpl;
-import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
-import org.apache.usergrid.persistence.qakka.distributed.actors.QueueActorHelper;
-import org.apache.usergrid.persistence.qakka.distributed.impl.DistributedQueueServiceImpl;
-import org.apache.usergrid.persistence.qakka.distributed.impl.QueueActorRouterProducer;
-import org.apache.usergrid.persistence.qakka.distributed.impl.QueueSenderRouterProducer;
-import org.apache.usergrid.persistence.qakka.distributed.impl.QueueWriterRouterProducer;
-import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLogSerialization;
-import org.apache.usergrid.persistence.qakka.serialization.auditlog.impl.AuditLogSerializationImpl;
-import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
-import org.apache.usergrid.persistence.qakka.serialization.queuemessages.impl.QueueMessageSerializationImpl;
-import org.apache.usergrid.persistence.qakka.serialization.queues.QueueSerialization;
-import org.apache.usergrid.persistence.qakka.serialization.queues.impl.QueueSerializationImpl;
-import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardCounterSerialization;
-import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardSerialization;
-import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardStrategy;
-import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardCounterSerializationImpl;
-import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardSerializationImpl;
-import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardStrategyImpl;
-import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLogSerialization;
-import org.apache.usergrid.persistence.qakka.serialization.transferlog.impl.TransferLogSerializationImpl;
 import org.apache.usergrid.persistence.queue.LegacyQueueFig;
 import org.apache.usergrid.persistence.queue.LegacyQueueManager;
 import org.apache.usergrid.persistence.queue.LegacyQueueManagerFactory;
 import org.apache.usergrid.persistence.queue.LegacyQueueManagerInternalFactory;
 import org.apache.usergrid.persistence.queue.impl.QakkaQueueManager;
 import org.apache.usergrid.persistence.queue.impl.QueueManagerFactoryImpl;
-import org.apache.usergrid.persistence.queue.impl.SNSQueueManagerImpl;
 import org.safehaus.guicyfig.GuicyFigModule;
 
 
 /**
  * Simple module for wiring our collection api
- *
- * @author tnine
  */
 public class QueueModule extends AbstractModule {
 
@@ -77,56 +41,10 @@ public class QueueModule extends AbstractModule {
 
         install(new GuicyFigModule(LegacyQueueFig.class));
 
-        bindQakka();
-
         bind(LegacyQueueManagerFactory.class).to(QueueManagerFactoryImpl.class);
         install( new FactoryModuleBuilder().implement(LegacyQueueManager.class, QakkaQueueManager.class)
             .build(LegacyQueueManagerInternalFactory.class));
 
-    }
-
-    private void bindQakka() {
-
-        install( new CommonModule() );
-        install( new ActorSystemModule() );
-        install( new GuicyFigModule( QakkaFig.class ) );
-
-        bind( App.class );
-
-        bind( CassandraClient.class ).to(           CassandraClientImpl.class );
-        bind( MetricsService.class ).to(            App.class );
-
-        bind( QueueManager.class ).to(              QueueManagerImpl.class );
-        bind( QueueSerialization.class ).to(        QueueSerializationImpl.class );
-
-        bind( QueueMessageManager.class ).to(       QueueMessageManagerImpl.class );
-        bind( QueueMessageSerialization.class ).to( QueueMessageSerializationImpl.class );
-
-        bind( ShardSerialization.class ).to(        ShardSerializationImpl.class );
-        bind( ShardStrategy.class ).to(             ShardStrategyImpl.class );
-
-        bind( ShardCounterSerialization.class ).to( ShardCounterSerializationImpl.class );
-
-        bind( TransferLogSerialization.class ).to(  TransferLogSerializationImpl.class );
-        bind( AuditLogSerialization.class ).to(     AuditLogSerializationImpl.class );
-        bind( DistributedQueueService.class ).to(   DistributedQueueServiceImpl.class );
-
-        bind( QueueActorRouterProducer.class );
-        bind( QueueWriterRouterProducer.class );
-        bind( QueueSenderRouterProducer.class );
-        bind( QueueActorHelper.class );
-
-        bind( Regions.class );
-        bind( URIStrategy.class ).to( URIStrategyLocalhost.class );
-
-        Multibinder<Migration> migrationBinder = Multibinder.newSetBinder( binder(), Migration.class );
-
-        migrationBinder.addBinding().to( Key.get( AuditLogSerialization.class ) );
-        //migrationBinder.addBinding().to( Key.get( MessageCounterSerialization.class ) );
-        migrationBinder.addBinding().to( Key.get( QueueMessageSerialization.class ) );
-        migrationBinder.addBinding().to( Key.get( QueueSerialization.class ) );
-        migrationBinder.addBinding().to( Key.get( ShardCounterSerialization.class ) );
-        migrationBinder.addBinding().to( Key.get( ShardSerialization.class ) );
-        migrationBinder.addBinding().to( Key.get( TransferLogSerialization.class ) );
+        install( new QakkaModule() );
     }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee0dda4c/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
index 887d9ee..4c3e480 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
@@ -23,6 +23,7 @@ import com.google.inject.Guice;
 import com.google.inject.Injector;
 import org.apache.usergrid.persistence.core.migration.schema.MigrationException;
 import org.apache.usergrid.persistence.core.migration.schema.MigrationManager;
+import org.apache.usergrid.persistence.queue.TestModule;
 import org.apache.usergrid.persistence.queue.guice.QueueModule;
 import org.junit.BeforeClass;
 import org.slf4j.Logger;
@@ -43,7 +44,7 @@ public class AbstractTest {
 
     public AbstractTest() {
         if ( getInjector() == null ) {
-            setInjector( Guice.createInjector( new QakkaModule() ) );
+            setInjector( Guice.createInjector( new TestModule() ) );
             MigrationManager migrationManager = getInjector().getInstance( MigrationManager.class );
             try {
                 migrationManager.migrate();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee0dda4c/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
index d03e702..5a0feba 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
@@ -41,6 +41,7 @@ import org.apache.usergrid.persistence.qakka.serialization.queuemessages.Databas
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
 import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLog;
 import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLogSerialization;
+import org.apache.usergrid.persistence.queue.TestModule;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Test;
@@ -63,7 +64,7 @@ public class QueueMessageManagerTest extends AbstractTest {
 
     @Override
     protected Injector getInjector() {
-        return Guice.createInjector( new QakkaModule() );
+        return Guice.createInjector( new TestModule() );
     }
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee0dda4c/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
index 4b01ffa..182d5d6 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
@@ -38,6 +38,7 @@ import org.apache.usergrid.persistence.qakka.serialization.queuemessages.Databas
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessageBody;
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
 import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLogSerialization;
+import org.apache.usergrid.persistence.queue.TestModule;
 import org.junit.Assert;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -55,7 +56,7 @@ public class QueueActorServiceTest extends AbstractTest {
 
     @Override
     protected Injector getInjector() {
-        return Guice.createInjector( new QakkaModule() );
+        return Guice.createInjector( new TestModule() );
     }
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee0dda4c/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
index 99ca4ea..77c11e4 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
@@ -33,6 +33,7 @@ import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLogSeri
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
 import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.apache.usergrid.persistence.queue.TestModule;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Test;
@@ -45,7 +46,7 @@ public class QueueActorHelperTest extends AbstractTest {
 
     @Override
     protected Injector getInjector() {
-        return Guice.createInjector( new QakkaModule() );
+        return Guice.createInjector( new TestModule() );
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee0dda4c/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
index dc6d891..d486c80 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
@@ -39,6 +39,7 @@ import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardCounter
 import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardIterator;
 import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardSerialization;
 import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.apache.usergrid.persistence.queue.TestModule;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Test;
@@ -55,7 +56,7 @@ public class ShardAllocatorTest extends AbstractTest {
 
     @Override
     protected Injector getInjector() {
-        return Guice.createInjector( new QakkaModule() );
+        return Guice.createInjector( new TestModule() );
     }
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee0dda4c/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
index 0fe183c..bc01b23 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
@@ -50,7 +50,7 @@ public class LegacyQueueManagerTest extends AbstractTest {
     // give each test its own injector
     @Override
     protected Injector getInjector() {
-        return Guice.createInjector( new QueueModule() );
+        return Guice.createInjector( new TestModule() );
     }
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee0dda4c/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/TestModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/TestModule.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/TestModule.java
new file mode 100644
index 0000000..9d2ed24
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/TestModule.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
+package org.apache.usergrid.persistence.queue;
+
+import com.google.inject.AbstractModule;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemModule;
+import org.apache.usergrid.persistence.core.guice.CommonModule;
+import org.apache.usergrid.persistence.queue.guice.QueueModule;
+
+
+/**
+ * Created by Dave Johnson (snoopdave@apache.org) on 9/14/16.
+ */
+public class TestModule  extends AbstractModule {
+
+
+    @Override
+    protected void configure() {
+
+        install( new CommonModule() );
+        install( new ActorSystemModule() );
+        install( new QueueModule() );
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee0dda4c/stack/pom.xml
----------------------------------------------------------------------
diff --git a/stack/pom.xml b/stack/pom.xml
index d739bb4..e86580a 100644
--- a/stack/pom.xml
+++ b/stack/pom.xml
@@ -110,7 +110,7 @@
         <jackson-version>1.9.9</jackson-version>
         <jackson-2-version>2.3.3</jackson-2-version>
         <jclouds.version>1.9.0</jclouds.version>
-        <jersey-version>2.23.1</jersey-version>
+        <jersey-version>2.21</jersey-version>
         <junit-version>4.12</junit-version>
         <log4j-version>1.2.16</log4j-version>
         <org.springframework.version>3.2.13.RELEASE</org.springframework.version>


[16/25] usergrid git commit: Merge branch 'master' into usergrid-1318-queue

Posted by sn...@apache.org.
Merge branch 'master' into usergrid-1318-queue


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

Branch: refs/heads/usergrid-1318-queue
Commit: ffeadb20878d03002dd7a77fa9dacd6be614ec4b
Parents: f47a5f6 7fdba4a
Author: Dave Johnson <sn...@apache.org>
Authored: Wed Sep 14 13:36:14 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Wed Sep 14 13:36:14 2016 -0400

----------------------------------------------------------------------
 .../usergrid/rest/exceptions/AuthErrorInfo.java |   1 +
 .../shiro/filters/BasicAuthSecurityFilter.java  |  22 ++-
 .../management/AccountCreationProps.java        |   8 +
 .../cassandra/OrganizationConfigPropsImpl.java  |  38 +++-
 .../usergrid/services/users/UsersService.java   |  15 +-
 .../usergrid/tools/UniqueValueManager.java      | 183 +++++++------------
 6 files changed, 142 insertions(+), 125 deletions(-)
----------------------------------------------------------------------



[02/25] usergrid git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/usergrid

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV1Impl.java
index 62c35bb,62c35bb..0bf48d7
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV1Impl.java
@@@ -35,7 -35,7 +35,7 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
  import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.model.entity.Id;
  
  import com.google.inject.Inject;
@@@ -118,7 -118,7 +118,7 @@@ public class MvccLogEntrySerializationS
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
          return Collections.emptyList();
      }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV2Impl.java
index 325762d,325762d..28e0723
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV2Impl.java
@@@ -35,7 -35,7 +35,7 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
  import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
  import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.model.entity.Id;
  
  import com.google.inject.Inject;
@@@ -106,7 -106,7 +106,7 @@@ public class MvccLogEntrySerializationS
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
          return Collections.emptyList();
      }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
index 0753281,0753281..14639cf
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
@@@ -29,7 -29,7 +29,7 @@@ import com.datastax.driver.core.querybu
  import com.datastax.driver.core.querybuilder.Using;
  import org.apache.usergrid.persistence.core.CassandraConfig;
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.model.entity.SimpleId;
  import org.apache.usergrid.persistence.model.field.*;
  
@@@ -47,9 -47,9 +47,6 @@@ import org.apache.usergrid.persistence.
  
  import com.google.common.base.Preconditions;
  
--import com.netflix.astyanax.ColumnListMutation;
--
--
  
  /**
   * Reads and writes to UniqueValues column family.
@@@ -498,12 -498,12 +495,12 @@@ public abstract class UniqueValueSerial
      public abstract Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies();
  
      @Override
--    public abstract Collection<TableDefinition> getTables();
++    public abstract Collection<TableDefinitionImpl> getTables();
  
      /**
       * Get the CQL table definition for the unique values log table
       */
--    protected abstract TableDefinition getUniqueValuesTable();
++    protected abstract TableDefinitionImpl getUniqueValuesTable();
  
  
      protected abstract List<Object> deserializePartitionKey(ByteBuffer bb);
@@@ -525,7 -525,7 +522,7 @@@
      /**
       * Get the CQL table definition for the unique values log table
       */
--    protected abstract TableDefinition getEntityUniqueLogTable();
++    protected abstract TableDefinitionImpl getEntityUniqueLogTable();
  
  
      public class AllUniqueFieldsIterator implements Iterable<UniqueValue>, Iterator<UniqueValue> {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
index 61f0f80,61f0f80..6bb03ac
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
@@@ -31,7 -31,7 +31,7 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.collection.serialization.UniqueValueSet;
  import org.apache.usergrid.persistence.collection.serialization.impl.migration.CollectionMigrationPlugin;
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.core.migration.data.MigrationInfoCache;
  import org.apache.usergrid.persistence.core.migration.data.MigrationRelationship;
  import org.apache.usergrid.persistence.core.migration.data.VersionedMigrationSet;
@@@ -164,7 -164,7 +164,7 @@@ public class UniqueValueSerializationSt
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
          return Collections.emptyList();
      }
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
index 1435c1e,1435c1e..9f59906
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
@@@ -33,7 -33,7 +33,7 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.core.CassandraFig;
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
  import org.apache.usergrid.persistence.core.datastax.CQLUtils;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.model.entity.Id;
  import org.apache.usergrid.persistence.model.field.Field;
  
@@@ -73,13 -73,13 +73,13 @@@ public class UniqueValueSerializationSt
          new HashMap<String, String>(){{ put( "column1", "ASC" ); }};
  
  
--    private final static TableDefinition uniqueValues =
--        new TableDefinition( UNIQUE_VALUES_TABLE, UNIQUE_VALUES_PARTITION_KEYS, UNIQUE_VALUES_COLUMN_KEYS,
--            UNIQUE_VALUES_COLUMNS, TableDefinition.CacheOption.KEYS, UNIQUE_VALUES_CLUSTERING_ORDER);
++    private final static TableDefinitionImpl uniqueValues =
++        new TableDefinitionImpl( UNIQUE_VALUES_TABLE, UNIQUE_VALUES_PARTITION_KEYS, UNIQUE_VALUES_COLUMN_KEYS,
++            UNIQUE_VALUES_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, UNIQUE_VALUES_CLUSTERING_ORDER);
  
--    private final static TableDefinition uniqueValuesLog =
--        new TableDefinition( UNIQUE_VALUES_LOG_TABLE, UNIQUE_VALUES_LOG_PARTITION_KEYS, UNIQUE_VALUES_LOG_COLUMN_KEYS,
--            UNIQUE_VALUES_LOG_COLUMNS, TableDefinition.CacheOption.KEYS, UNIQUE_VALUES_LOG_CLUSTERING_ORDER);
++    private final static TableDefinitionImpl uniqueValuesLog =
++        new TableDefinitionImpl( UNIQUE_VALUES_LOG_TABLE, UNIQUE_VALUES_LOG_PARTITION_KEYS, UNIQUE_VALUES_LOG_COLUMN_KEYS,
++            UNIQUE_VALUES_LOG_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, UNIQUE_VALUES_LOG_CLUSTERING_ORDER);
  
  
  
@@@ -106,10 -106,10 +106,10 @@@
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
--        final TableDefinition uniqueValues = getUniqueValuesTable();
--        final TableDefinition uniqueValuesLog = getEntityUniqueLogTable();
++        final TableDefinitionImpl uniqueValues = getUniqueValuesTable();
++        final TableDefinitionImpl uniqueValuesLog = getEntityUniqueLogTable();
  
          return Arrays.asList( uniqueValues, uniqueValuesLog );
  
@@@ -118,14 -118,14 +118,14 @@@
  
  
      @Override
--    protected TableDefinition getUniqueValuesTable(){
++    protected TableDefinitionImpl getUniqueValuesTable(){
  
          return uniqueValues;
      }
  
  
      @Override
--    protected TableDefinition getEntityUniqueLogTable(){
++    protected TableDefinitionImpl getEntityUniqueLogTable(){
  
          return uniqueValuesLog;
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
index 518937d,518937d..1af4846
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
@@@ -27,13 -27,13 +27,12 @@@ import com.datastax.driver.core.DataTyp
  import com.datastax.driver.core.ProtocolVersion;
  import com.datastax.driver.core.Session;
  
--import org.apache.cassandra.utils.ByteBufferUtil;
  import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
  import org.apache.usergrid.persistence.core.CassandraConfig;
  import org.apache.usergrid.persistence.core.CassandraFig;
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
  import org.apache.usergrid.persistence.core.datastax.CQLUtils;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.model.entity.Id;
  
  import com.google.inject.Inject;
@@@ -69,13 -69,13 +68,13 @@@ public class UniqueValueSerializationSt
      private static final Map<String, String> UNIQUE_VALUES_LOG_CLUSTERING_ORDER =
          new HashMap<String, String>(){{ put( "column1", "ASC" );}};
  
--    private final static TableDefinition uniqueValues =
--        new TableDefinition( UNIQUE_VALUES_TABLE, UNIQUE_VALUES_PARTITION_KEYS, UNIQUE_VALUES_COLUMN_KEYS,
--            UNIQUE_VALUES_COLUMNS, TableDefinition.CacheOption.KEYS, UNIQUE_VALUES_CLUSTERING_ORDER);
++    private final static TableDefinitionImpl uniqueValues =
++        new TableDefinitionImpl( UNIQUE_VALUES_TABLE, UNIQUE_VALUES_PARTITION_KEYS, UNIQUE_VALUES_COLUMN_KEYS,
++            UNIQUE_VALUES_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, UNIQUE_VALUES_CLUSTERING_ORDER);
  
--    private final static TableDefinition uniqueValuesLog =
--        new TableDefinition( UNIQUE_VALUES_LOG_TABLE, UNIQUE_VALUES_LOG_PARTITION_KEYS, UNIQUE_VALUES_LOG_COLUMN_KEYS,
--            UNIQUE_VALUES_LOG_COLUMNS, TableDefinition.CacheOption.KEYS, UNIQUE_VALUES_LOG_CLUSTERING_ORDER);
++    private final static TableDefinitionImpl uniqueValuesLog =
++        new TableDefinitionImpl( UNIQUE_VALUES_LOG_TABLE, UNIQUE_VALUES_LOG_PARTITION_KEYS, UNIQUE_VALUES_LOG_COLUMN_KEYS,
++            UNIQUE_VALUES_LOG_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, UNIQUE_VALUES_LOG_CLUSTERING_ORDER);
  
  
      /**
@@@ -102,10 -102,10 +101,10 @@@
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
--        final TableDefinition uniqueValues = getUniqueValuesTable();
--        final TableDefinition uniqueValuesLog = getEntityUniqueLogTable();
++        final TableDefinitionImpl uniqueValues = getUniqueValuesTable();
++        final TableDefinitionImpl uniqueValuesLog = getEntityUniqueLogTable();
  
          return Arrays.asList( uniqueValues, uniqueValuesLog );
  
@@@ -113,13 -113,13 +112,13 @@@
  
  
      @Override
--    protected TableDefinition getUniqueValuesTable(){
++    protected TableDefinitionImpl getUniqueValuesTable(){
          return uniqueValues;
      }
  
  
      @Override
--    protected TableDefinition getEntityUniqueLogTable(){
++    protected TableDefinitionImpl getEntityUniqueLogTable(){
          return uniqueValuesLog;
      }
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
index 0d6a312,0d6a312..698915b
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
@@@ -23,43 -23,43 +23,23 @@@ import com.fasterxml.jackson.core.JsonP
  import com.fasterxml.jackson.databind.ObjectMapper;
  import com.google.inject.Inject;
  import org.apache.usergrid.persistence.core.CassandraFig;
--import org.apache.usergrid.persistence.core.util.StringUtils;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  
  import java.nio.ByteBuffer;
  import java.util.*;
  
  public class CQLUtils {
  
--    private final CassandraFig cassandraFig;
      private final static ObjectMapper mapper = new ObjectMapper();
  
--    public enum ACTION {
--        CREATE, UPDATE
--    }
--
      static String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS";
      static String ALTER_TABLE = "ALTER TABLE";
--    static String WITH ="WITH";
--    static String AND = "AND";
--    static String EQUAL = "=";
--    static String COMPRESSION = "compression";
--    static String COMPACTION = "compaction";
--    static String CACHING = "caching";
--    static String GC_GRACE_SECONDS = "gc_grace_seconds";
--    static String PRIMARY_KEY = "PRIMARY KEY";
--    static String COMPACT_STORAGE = "COMPACT STORAGE";
--    static String CLUSTERING_ORDER_BY = "CLUSTERING ORDER BY";
--    static String COMMA = ",";
--    static String PAREN_LEFT = "(";
--    static String PAREN_RIGHT = ")";
  
      static String COMPOSITE_TYPE = "'org.apache.cassandra.db.marshal.DynamicCompositeType(a=>org.apache.cassandra.db.marshal.AsciiType,A=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.AsciiType),b=>org.apache.cassandra.db.marshal.BytesType,B=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.BytesType),i=>org.apache.cassandra.db.marshal.IntegerType,I=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.IntegerType),l=>org.apache.cassandra.db.marshal.LongType,L=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.LongType),s=>org.apache.cassandra.db.marshal.UTF8Type,S=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.UTF8Type),t=>org.apache.cassandra.db.marshal.TimeUUIDType,T=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.TimeUUIDType),u=>org.apache.cassandra.db.marshal.UUIDType,U=>org.apache.cassandra.db.marshal.Rever
 sedType(org.apache.cassandra.db.marshal.UUIDType),x=>org.apache.cassandra.db.marshal.LexicalUUIDType,X=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.LexicalUUIDType))'";
  
--    @Inject
--    public CQLUtils ( final CassandraFig cassandraFig ){
--
--        this.cassandraFig = cassandraFig;
  
++    @Inject
++    public CQLUtils ( ) {
      }
  
  
@@@ -81,64 -81,64 +61,6 @@@
          return mapper.writeValueAsString(map).replace("\"", "'");
      }
  
--
--    public static String getTableCQL( CassandraFig cassandraFig, TableDefinition tableDefinition,
--                               ACTION tableAction) throws Exception {
--
--        StringJoiner cql = new StringJoiner(" ");
--
--        if ( tableAction.equals(ACTION.CREATE) ){
--            cql.add(CREATE_TABLE);
--        } else if ( tableAction.equals(ACTION.UPDATE) ){
--            cql.add(ALTER_TABLE);
--        }else{
--            throw new Exception("Invalid Action specified.  Must of of type CQLUtils.Action");
--        }
--
--        cql.add( tableDefinition.getTableName() );
--
--
--
--        if ( tableAction.equals(ACTION.CREATE) ){
--
--            cql.add(PAREN_LEFT).add( spaceSeparatedKeyValue(tableDefinition.getColumns()) ).add(COMMA)
--                .add(PRIMARY_KEY)
--                .add(PAREN_LEFT).add(PAREN_LEFT)
--                .add( StringUtils.join(tableDefinition.getPartitionKeys(), COMMA) ).add(PAREN_RIGHT);
--
--            if ( tableDefinition.getColumnKeys() != null && !tableDefinition.getColumnKeys().isEmpty() ){
--
--                cql.add(COMMA).add( StringUtils.join(tableDefinition.getColumnKeys(), COMMA) );
--            }
--
--            cql.add(PAREN_RIGHT).add(PAREN_RIGHT)
--                .add(WITH)
--                .add(CLUSTERING_ORDER_BY)
--                .add(PAREN_LEFT)
--                .add( spaceSeparatedKeyValue(tableDefinition.getClusteringOrder()) )
--                .add(PAREN_RIGHT)
--                .add(AND)
--                .add(COMPACT_STORAGE)
--                .add(AND);
--
--        } else if ( tableAction.equals(ACTION.UPDATE) ){
--            cql.add(WITH);
--
--        }
--
--
--        cql.add(COMPACTION).add(EQUAL).add( getMapAsCQLString( tableDefinition.getCompaction() ) )
--            .add(AND)
--            .add(COMPRESSION).add(EQUAL).add( getMapAsCQLString( tableDefinition.getCompression() ) )
--            .add(AND)
--            .add(GC_GRACE_SECONDS).add(EQUAL).add( tableDefinition.getGcGraceSeconds() )
--            .add(AND)
--            .add(CACHING).add(EQUAL).add( getCachingOptions( cassandraFig, tableDefinition.getCacheOption() ) );
--
--        return cql.toString();
--
--    }
--
      public static String quote( String value){
  
          return "\"" + value + "\"";
@@@ -162,7 -162,7 +84,7 @@@
      }
  
  
--    public static String getCachingOptions(CassandraFig cassandraFig, TableDefinition.CacheOption cacheOption) throws JsonProcessingException {
++    public static String getCachingOptions(CassandraFig cassandraFig, TableDefinitionImpl.CacheOption cacheOption) throws JsonProcessingException {
  
          // Cassandra 2.0 and below has a different CQL syntax for caching
          if( Double.parseDouble( cassandraFig.getVersion() ) <= 2.0 ){
@@@ -177,7 -177,7 +99,7 @@@
      }
  
  
--    public static String getCacheValue( TableDefinition.CacheOption cacheOption ) throws JsonProcessingException {
++    public static String getCacheValue( TableDefinitionImpl.CacheOption cacheOption ) throws JsonProcessingException {
  
  
          Map<String, Object>  cacheValue = new HashMap<>(2);
@@@ -213,7 -213,7 +135,7 @@@
  
      }
  
--    public static String getLegacyCacheValue( TableDefinition.CacheOption cacheOption ){
++    public static String getLegacyCacheValue( TableDefinitionImpl.CacheOption cacheOption ){
  
          String cacheValue;
          switch (cacheOption) {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
index d749d40,d749d40..8178129
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
@@@ -20,108 -20,108 +20,15 @@@
  package org.apache.usergrid.persistence.core.datastax;
  
  
--import com.datastax.driver.core.DataType;
--import com.google.common.base.Preconditions;
++import org.apache.usergrid.persistence.core.CassandraFig;
  
--import java.util.Collection;
--import java.util.HashMap;
--import java.util.Map;
++public interface TableDefinition {
  
--public class TableDefinition {
--
--
--    public enum CacheOption {
--
--        ALL, KEYS, ROWS, NONE
--    }
--
--
--    private final String tableName;
--    private final Collection<String> partitionKeys;
--    private final Collection<String> columnKeys;
--    private final Map<String, DataType.Name> columns;
--    private final CacheOption cacheOption;
--    private final Map<String, Object> compaction;
--    private final String bloomFilterChance;
--    private final String readRepairChance;
--    private final Map<String, Object> compression;
--    private final String gcGraceSeconds;
--    private final Map<String, String> clusteringOrder;
--
--    public TableDefinition( final String tableName, final Collection<String> partitionKeys,
--                            final Collection<String> columnKeys, final Map<String, DataType.Name> columns,
--                            final CacheOption cacheOption, final Map<String, String> clusteringOrder){
--
--        Preconditions.checkNotNull(tableName, "Table name cannot be null");
--        Preconditions.checkNotNull(partitionKeys, "Primary Key(s) cannot be null");
--        Preconditions.checkNotNull(columns, "Columns cannot be null");
--        Preconditions.checkNotNull(cacheOption, "CacheOption cannot be null");
--
--
--        this.tableName = tableName;
--        this.partitionKeys = partitionKeys;
--        this.columnKeys = columnKeys;
--        this.columns = columns;
--        this.cacheOption = cacheOption;
--        this.clusteringOrder = clusteringOrder;
--
--
--        // this are default settings always used
--        this.compaction = new HashMap<>(1);
--        compaction.put( "class", "LeveledCompactionStrategy" );
--        this.bloomFilterChance = "0.1d";
--        this.readRepairChance = "0.1d";
--        this.compression = new HashMap<>(1);
--        compression.put("sstable_compression", "LZ4Compressor");
--        this.gcGraceSeconds = "864000";
--
--
--
--    }
--
--    public String getTableName() {
--        return tableName;
--    }
--
--    public Collection<String> getPartitionKeys() {
--        return partitionKeys;
--    }
--
--    public Collection<String> getColumnKeys() {
--        return columnKeys;
--    }
--
--    public Map<String, DataType.Name> getColumns() {
--        return columns;
--    }
--
--    public CacheOption getCacheOption() {
--        return cacheOption;
--    }
--
--    public Map<String, Object> getCompaction() {
--        return compaction;
--    }
--
--    public String getBloomFilterChance() {
--        return bloomFilterChance;
--    }
--
--    public String getReadRepairChance() {
--        return readRepairChance;
--    }
--
--    public Map<String, Object> getCompression() {
--        return compression;
--    }
--
--    public String getGcGraceSeconds() {
--        return gcGraceSeconds;
--    }
--
--    public Map<String, String> getClusteringOrder() {
--        return clusteringOrder;
++    enum ACTION {
++        CREATE, UPDATE
      }
  
++    String getTableName();
  
++    String getTableCQL( CassandraFig cassandraFig, ACTION tableAction ) throws Exception;
  }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionImpl.java
index 0000000,0000000..a5a92e2
new file mode 100644
--- /dev/null
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionImpl.java
@@@ -1,0 -1,0 +1,210 @@@
++/*
++ * 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.core.datastax.impl;
++
++
++import com.datastax.driver.core.DataType;
++import com.google.common.base.Preconditions;
++import org.apache.usergrid.persistence.core.CassandraFig;
++import org.apache.usergrid.persistence.core.datastax.CQLUtils;
++import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.util.StringUtils;
++
++import java.util.Collection;
++import java.util.HashMap;
++import java.util.Map;
++import java.util.StringJoiner;
++
++import static org.apache.usergrid.persistence.core.datastax.CQLUtils.getCachingOptions;
++import static org.apache.usergrid.persistence.core.datastax.CQLUtils.getMapAsCQLString;
++import static org.apache.usergrid.persistence.core.datastax.CQLUtils.spaceSeparatedKeyValue;
++
++public class TableDefinitionImpl implements TableDefinition {
++
++    public enum CacheOption {
++        ALL, KEYS, ROWS, NONE
++    }
++
++    private final String tableName;
++    private final Collection<String> partitionKeys;
++    private final Collection<String> columnKeys;
++    private final Map<String, DataType.Name> columns;
++    private final CacheOption cacheOption;
++    private final Map<String, Object> compaction;
++    private final String bloomFilterChance;
++    private final String readRepairChance;
++    private final Map<String, Object> compression;
++    private final String gcGraceSeconds;
++    private final Map<String, String> clusteringOrder;
++
++    static String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS";
++    static String ALTER_TABLE = "ALTER TABLE";
++    static String WITH ="WITH";
++    static String AND = "AND";
++    static String EQUAL = "=";
++    static String COMPRESSION = "compression";
++    static String COMPACTION = "compaction";
++    static String CACHING = "caching";
++    static String GC_GRACE_SECONDS = "gc_grace_seconds";
++    static String PRIMARY_KEY = "PRIMARY KEY";
++    static String COMPACT_STORAGE = "COMPACT STORAGE";
++    static String CLUSTERING_ORDER_BY = "CLUSTERING ORDER BY";
++    static String COMMA = ",";
++    static String PAREN_LEFT = "(";
++    static String PAREN_RIGHT = ")";
++
++    static String COMPOSITE_TYPE = "'org.apache.cassandra.db.marshal.DynamicCompositeType(a=>org.apache.cassandra.db.marshal.AsciiType,A=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.AsciiType),b=>org.apache.cassandra.db.marshal.BytesType,B=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.BytesType),i=>org.apache.cassandra.db.marshal.IntegerType,I=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.IntegerType),l=>org.apache.cassandra.db.marshal.LongType,L=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.LongType),s=>org.apache.cassandra.db.marshal.UTF8Type,S=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.UTF8Type),t=>org.apache.cassandra.db.marshal.TimeUUIDType,T=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.TimeUUIDType),u=>org.apache.cassandra.db.marshal.UUIDType,U=>org.apache.cassandra.db.marshal.Rever
 sedType(org.apache.cassandra.db.marshal.UUIDType),x=>org.apache.cassandra.db.marshal.LexicalUUIDType,X=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.LexicalUUIDType))'";
++
++
++    public TableDefinitionImpl(final String tableName, final Collection<String> partitionKeys,
++                               final Collection<String> columnKeys, final Map<String, DataType.Name> columns,
++                               final CacheOption cacheOption, final Map<String, String> clusteringOrder){
++
++        Preconditions.checkNotNull(tableName, "Table name cannot be null");
++        Preconditions.checkNotNull(partitionKeys, "Primary Key(s) cannot be null");
++        Preconditions.checkNotNull(columns, "Columns cannot be null");
++        Preconditions.checkNotNull(cacheOption, "CacheOption cannot be null");
++
++
++        this.tableName = tableName;
++        this.partitionKeys = partitionKeys;
++        this.columnKeys = columnKeys;
++        this.columns = columns;
++        this.cacheOption = cacheOption;
++        this.clusteringOrder = clusteringOrder;
++
++
++        // this are default settings always used
++        this.compaction = new HashMap<>(1);
++        compaction.put( "class", "LeveledCompactionStrategy" );
++        this.bloomFilterChance = "0.1d";
++        this.readRepairChance = "0.1d";
++        this.compression = new HashMap<>(1);
++        compression.put("sstable_compression", "LZ4Compressor");
++        this.gcGraceSeconds = "864000";
++
++
++
++    }
++
++    public String getTableName() {
++        return tableName;
++    }
++
++    @Override
++    public String getTableCQL(CassandraFig cassandraFig, ACTION tableAction) throws Exception {
++
++        StringJoiner cql = new StringJoiner(" ");
++
++        if ( tableAction.equals( ACTION.CREATE) ){
++            cql.add(CREATE_TABLE);
++        } else if ( tableAction.equals( ACTION.UPDATE) ){
++            cql.add(ALTER_TABLE);
++        }else{
++            throw new Exception("Invalid Action specified.  Must of of type CQLUtils.Action");
++        }
++
++        cql.add( getTableName() );
++
++
++
++        if ( tableAction.equals( ACTION.CREATE) ){
++
++            cql.add(PAREN_LEFT).add( spaceSeparatedKeyValue( getColumns()) ).add(COMMA)
++                .add(PRIMARY_KEY)
++                .add(PAREN_LEFT).add(PAREN_LEFT)
++                .add( StringUtils.join(getPartitionKeys(), COMMA) ).add(PAREN_RIGHT);
++
++            if ( getColumnKeys() != null && !getColumnKeys().isEmpty() ){
++
++                cql.add(COMMA).add( StringUtils.join(getColumnKeys(), COMMA) );
++            }
++
++            cql.add(PAREN_RIGHT).add(PAREN_RIGHT)
++                .add(WITH)
++                .add(CLUSTERING_ORDER_BY)
++                .add(PAREN_LEFT)
++                .add( spaceSeparatedKeyValue(getClusteringOrder()) )
++                .add(PAREN_RIGHT)
++                .add(AND)
++                .add(COMPACT_STORAGE)
++                .add(AND);
++
++        } else if ( tableAction.equals( ACTION.UPDATE) ){
++            cql.add(WITH);
++
++        }
++
++
++        cql.add(COMPACTION).add(EQUAL).add( getMapAsCQLString( getCompaction() ) )
++            .add(AND)
++            .add(COMPRESSION).add(EQUAL).add( getMapAsCQLString( getCompression() ) )
++            .add(AND)
++            .add(GC_GRACE_SECONDS).add(EQUAL).add( getGcGraceSeconds() )
++            .add(AND)
++            .add(CACHING).add(EQUAL).add( getCachingOptions( cassandraFig, getCacheOption() ) );
++
++        return cql.toString();
++    }
++
++
++
++    public Collection<String> getPartitionKeys() {
++        return partitionKeys;
++    }
++
++    public Collection<String> getColumnKeys() {
++        return columnKeys;
++    }
++
++    public Map<String, DataType.Name> getColumns() {
++        return columns;
++    }
++
++    public CacheOption getCacheOption() {
++        return cacheOption;
++    }
++
++    public Map<String, Object> getCompaction() {
++        return compaction;
++    }
++
++    public String getBloomFilterChance() {
++        return bloomFilterChance;
++    }
++
++    public String getReadRepairChance() {
++        return readRepairChance;
++    }
++
++    public Map<String, Object> getCompression() {
++        return compression;
++    }
++
++    public String getGcGraceSeconds() {
++        return gcGraceSeconds;
++    }
++
++    public Map<String, String> getClusteringOrder() {
++        return clusteringOrder;
++    }
++
++
++}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionStringImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionStringImpl.java
index 0000000,0000000..8e7d854
new file mode 100644
--- /dev/null
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionStringImpl.java
@@@ -1,0 -1,0 +1,48 @@@
++/*
++ * 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.core.datastax.impl;
++
++import org.apache.usergrid.persistence.core.CassandraFig;
++import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++
++
++public class TableDefinitionStringImpl implements TableDefinition {
++
++    private String tableName;
++    private String cql;
++
++
++    public TableDefinitionStringImpl( String tableName, String cql ) {
++        this.tableName = tableName;
++        this.cql = cql;
++    }
++
++
++    @Override
++    public String getTableName() {
++        return tableName;
++    }
++
++
++    @Override
++    public String getTableCQL(CassandraFig cassandraFig, ACTION tableAction) throws Exception {
++        return cql;
++    }
++}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/MigrationInfoSerializationImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/MigrationInfoSerializationImpl.java
index ee04293,ee04293..2fe24a9
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/MigrationInfoSerializationImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/MigrationInfoSerializationImpl.java
@@@ -27,7 -27,7 +27,7 @@@ import org.apache.cassandra.db.marshal.
  import org.apache.cassandra.db.marshal.UTF8Type;
  
  import org.apache.usergrid.persistence.core.astyanax.*;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.core.migration.util.AstyanaxUtils;
  import org.apache.usergrid.persistence.model.entity.Id;
  import org.apache.usergrid.persistence.model.entity.SimpleId;
@@@ -208,7 -208,7 +208,7 @@@ public class MigrationInfoSerialization
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
          return Collections.emptyList();
      }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
index 952f898,952f898..b2ab031
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
@@@ -19,11 -19,11 +19,11 @@@
  package org.apache.usergrid.persistence.core.migration.schema;
  
  
--import java.util.Collection;
--
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
  import org.apache.usergrid.persistence.core.datastax.TableDefinition;
  
++import java.util.Collection;
++
  
  /**
   * @author tnine

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
index c5d1312,c5d1312..71b35e0
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
@@@ -27,6 -27,6 +27,7 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.core.datastax.CQLUtils;
  import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
  import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
@@@ -79,13 -79,13 +80,15 @@@ public class MigrationManagerImpl imple
  
                  final Collection<MultiTenantColumnFamilyDefinition> columnFamilies = migration.getColumnFamilies();
  
--                final Collection<TableDefinition> tables = migration.getTables();
++                final Collection<TableDefinitionImpl> tables = migration.getTables();
  
  
                  if ((columnFamilies == null || columnFamilies.size() == 0) &&
                      (tables == null || tables.size() == 0)) {
                      logger.warn(
--                        "Class {} implements {} but returns null for getColumnFamilies and getTables for migration.  Either implement this method or remove the interface from the class",
++                        "Class {} implements {} but returns null for getColumnFamilies and " +
++                            "getTables for migration.  Either implement this method or remove " +
++                            "the interface from the class",
                          migration.getClass().getSimpleName(), Migration.class.getSimpleName());
                      continue;
                  }
@@@ -98,7 -98,7 +101,7 @@@
  
  
                  if ( tables != null && !tables.isEmpty() ) {
--                    for (TableDefinition tableDefinition : tables) {
++                    for (TableDefinitionImpl tableDefinition : tables) {
  
                          createTable(tableDefinition);
  
@@@ -140,18 -140,18 +143,19 @@@
  
      }
  
--    private void createTable(TableDefinition tableDefinition ) throws Exception {
++    private void createTable(TableDefinitionImpl tableDefinition ) throws Exception {
  
          KeyspaceMetadata keyspaceMetadata = dataStaxCluster.getClusterSession().getCluster().getMetadata()
              .getKeyspace(CQLUtils.quote(cassandraFig.getApplicationKeyspace()));
  
--        boolean exists =  keyspaceMetadata != null && keyspaceMetadata.getTable(tableDefinition.getTableName()) != null;
++        boolean exists =  keyspaceMetadata != null
++            && keyspaceMetadata.getTable(tableDefinition.getTableName()) != null;
  
          if( exists ){
              return;
          }
  
--        String CQL = CQLUtils.getTableCQL(cassandraFig, tableDefinition, CQLUtils.ACTION.CREATE);
++        String CQL = tableDefinition.getTableCQL(cassandraFig, TableDefinition.ACTION.CREATE);
          if (logger.isDebugEnabled()) {
              logger.debug(CQL);
          }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
index 34dd370,34dd370..37311ba
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
@@@ -22,6 -22,6 +22,7 @@@ package org.apache.usergrid.persistence
  import com.datastax.driver.core.DataType;
  import com.google.inject.Inject;
  import org.apache.usergrid.persistence.core.CassandraFig;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.core.guice.TestCommonModule;
  import org.apache.usergrid.persistence.core.test.ITRunner;
  import org.apache.usergrid.persistence.core.test.UseModules;
@@@ -69,17 -69,17 +70,17 @@@ public class CQLUtilsTest 
  
  
  
--        TableDefinition table1 = new TableDefinition(
++        TableDefinitionImpl table1 = new TableDefinitionImpl(
              CQLUtils.quote("table1"),
              partitionKeys,
              columnKeys,
              columns,
--            TableDefinition.CacheOption.KEYS,
++            TableDefinitionImpl.CacheOption.KEYS,
              clusteringOrder
              );
  
--        String createCQL = CQLUtils.getTableCQL(cassandraFig, table1, CQLUtils.ACTION.CREATE);
--        String updateCQL = CQLUtils.getTableCQL(cassandraFig, table1, CQLUtils.ACTION.UPDATE);
++        String createCQL = table1.getTableCQL(cassandraFig, TableDefinition.ACTION.CREATE);
++        String updateCQL = table1.getTableCQL(cassandraFig, TableDefinition.ACTION.UPDATE);
  
          assertTrue(
              createCQL.contains(CQLUtils.CREATE_TABLE ) &&
@@@ -121,16 -121,16 +122,16 @@@
  
  
  
--        TableDefinition table1 = new TableDefinition(
++        TableDefinitionImpl table1 = new TableDefinitionImpl(
              CQLUtils.quote("table1"),
              partitionKeys,
              columnKeys,
              columns,
--            TableDefinition.CacheOption.KEYS,
++            TableDefinitionImpl.CacheOption.KEYS,
              clusteringOrder
          );
  
--        String createCQL = CQLUtils.getTableCQL(cassandraFig, table1, CQLUtils.ACTION.CREATE);
++        String createCQL = table1.getTableCQL(cassandraFig, TableDefinition.ACTION.CREATE);
          logger.info(createCQL);
          assertTrue(
              createCQL.contains( "\"keys_only\"" ) &&
@@@ -164,16 -164,16 +165,16 @@@
  
  
  
--        TableDefinition table1 = new TableDefinition(
++        TableDefinitionImpl table1 = new TableDefinitionImpl(
              CQLUtils.quote("table1"),
              partitionKeys,
              columnKeys,
              columns,
--            TableDefinition.CacheOption.KEYS,
++            TableDefinitionImpl.CacheOption.KEYS,
              clusteringOrder
          );
  
--        String createCQL = CQLUtils.getTableCQL(cassandraFig, table1, CQLUtils.ACTION.CREATE);
++        String createCQL = table1.getTableCQL(cassandraFig, TableDefinition.ACTION.CREATE);
          logger.info(createCQL);
          assertTrue(
              createCQL.contains( "'keys':'ALL'"  ) &&

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
index 3acce69,3acce69..b5f98d9
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
@@@ -19,6 -19,6 +19,7 @@@
  package org.apache.usergrid.persistence.core.datastax;
  
  
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.junit.Test;
  
  import java.util.ArrayList;
@@@ -32,7 -32,7 +33,7 @@@ public class TableDefinitionTest 
      public void testNullTableName(){
  
          try{
--            TableDefinition table1 = new TableDefinition(null, null, null, null, null, null);
++            TableDefinitionImpl table1 = new TableDefinitionImpl(null, null, null, null, null, null);
          } catch (NullPointerException npe){
              assertEquals("Table name cannot be null", npe.getMessage());
          }
@@@ -44,7 -44,7 +45,7 @@@
      public void testNullPrimaryKeys(){
  
          try{
--            TableDefinition table1 = new TableDefinition("table1", null, null, null, null, null);
++            TableDefinitionImpl table1 = new TableDefinitionImpl("table1", null, null, null, null, null);
          } catch (NullPointerException npe){
              assertEquals("Primary Key(s) cannot be null", npe.getMessage());
          }
@@@ -56,7 -56,7 +57,7 @@@
      public void testNullColumns(){
  
          try{
--            TableDefinition table1 = new TableDefinition("table1",
++            TableDefinitionImpl table1 = new TableDefinitionImpl("table1",
                  new ArrayList<>(), null, null, null, null);
          } catch (NullPointerException npe){
              assertEquals("Columns cannot be null", npe.getMessage());
@@@ -69,7 -69,7 +70,7 @@@
      public void testNullCacheOption(){
  
          try{
--            TableDefinition table1 = new TableDefinition("table1",
++            TableDefinitionImpl table1 = new TableDefinitionImpl("table1",
                  new ArrayList<>(),
                  new ArrayList<>(), new HashMap<>(), null, null);
          } catch (NullPointerException npe){

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationProxyImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationProxyImpl.java
index 46acd1c,46acd1c..5e90d8f
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationProxyImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationProxyImpl.java
@@@ -26,7 -26,7 +26,7 @@@ import java.util.Collection
  import java.util.Collections;
  import java.util.Iterator;
  
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
@@@ -290,7 -290,7 +290,7 @@@ public class EdgeMetadataSerializationP
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
          return Collections.emptyList();
      }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
index d7a5c80,d7a5c80..b1049f2
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
@@@ -37,7 -37,7 +37,7 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
  import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
  import org.apache.usergrid.persistence.core.astyanax.StringColumnParser;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.core.migration.schema.Migration;
  import org.apache.usergrid.persistence.core.scope.ApplicationScope;
  import org.apache.usergrid.persistence.core.util.ValidationUtils;
@@@ -379,7 -379,7 +379,7 @@@ public class EdgeMetadataSerializationV
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
          return Collections.emptyList();
      }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
index 1f81864,1f81864..34cb1d2
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
@@@ -37,7 -37,7 +37,7 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
  import org.apache.usergrid.persistence.core.astyanax.StringColumnParser;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.core.migration.schema.Migration;
  import org.apache.usergrid.persistence.core.scope.ApplicationScope;
  import org.apache.usergrid.persistence.core.shard.ExpandingShardLocator;
@@@ -467,7 -467,7 +467,7 @@@ public class EdgeMetadataSerializationV
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
          return Collections.emptyList();
      }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
index 2429d5a,2429d5a..12e9237
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
@@@ -38,7 -38,7 +38,7 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
  import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
  import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.core.migration.schema.Migration;
  import org.apache.usergrid.persistence.core.scope.ApplicationScope;
  import org.apache.usergrid.persistence.core.util.ValidationUtils;
@@@ -112,7 -112,7 +112,7 @@@ public class NodeSerializationImpl impl
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
          return Collections.emptyList();
      }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
index 098c152,098c152..764536e
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
@@@ -34,7 -34,7 +34,7 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
  import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
  import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.core.scope.ApplicationScope;
  import org.apache.usergrid.persistence.core.util.ValidationUtils;
  import org.apache.usergrid.persistence.graph.GraphFig;
@@@ -188,7 -188,7 +188,7 @@@ public class EdgeShardSerializationImp
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
          return Collections.emptyList();
      }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/SizebasedEdgeColumnFamilies.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/SizebasedEdgeColumnFamilies.java
index f4e19d6,f4e19d6..9d0b157
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/SizebasedEdgeColumnFamilies.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/SizebasedEdgeColumnFamilies.java
@@@ -33,7 -33,7 +33,7 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
  import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
  import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.graph.serialization.impl.shard.DirectedEdge;
  import org.apache.usergrid.persistence.graph.serialization.impl.shard.EdgeColumnFamilies;
  import org.apache.usergrid.persistence.graph.serialization.impl.shard.EdgeRowKey;
@@@ -146,7 -146,7 +146,7 @@@ public class SizebasedEdgeColumnFamilie
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
          return Collections.emptyList();
      }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
index 2c77ebf64,2c77ebf64..6253cec
--- a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
+++ b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
@@@ -31,7 -31,7 +31,7 @@@ import com.datastax.driver.core.querybu
  import org.apache.usergrid.persistence.core.CassandraConfig;
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
  import org.apache.usergrid.persistence.core.datastax.CQLUtils;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.core.shard.ExpandingShardLocator;
  import org.apache.usergrid.persistence.core.shard.StringHashUtils;
  import org.apache.usergrid.persistence.map.MapKeyResults;
@@@ -306,15 -306,15 +306,15 @@@ public class MapSerializationImpl imple
  
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
--        final TableDefinition mapEntries =
--            new TableDefinition( MAP_ENTRIES_TABLE, MAP_ENTRIES_PARTITION_KEYS, MAP_ENTRIES_COLUMN_KEYS,
--                MAP_ENTRIES_COLUMNS, TableDefinition.CacheOption.KEYS, MAP_ENTRIES_CLUSTERING_ORDER);
++        final TableDefinitionImpl mapEntries =
++            new TableDefinitionImpl( MAP_ENTRIES_TABLE, MAP_ENTRIES_PARTITION_KEYS, MAP_ENTRIES_COLUMN_KEYS,
++                MAP_ENTRIES_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, MAP_ENTRIES_CLUSTERING_ORDER);
  
--        final TableDefinition mapKeys =
--            new TableDefinition( MAP_KEYS_TABLE, MAP_KEYS_PARTITION_KEYS, MAP_KEYS_COLUMN_KEYS,
--                MAP_KEYS_COLUMNS, TableDefinition.CacheOption.KEYS, MAP_KEYS_CLUSTERING_ORDER);
++        final TableDefinitionImpl mapKeys =
++            new TableDefinitionImpl( MAP_KEYS_TABLE, MAP_KEYS_PARTITION_KEYS, MAP_KEYS_COLUMN_KEYS,
++                MAP_KEYS_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, MAP_KEYS_CLUSTERING_ORDER);
  
  
  


[08/25] usergrid git commit: Initial integration of Qakka into Usergrid Queue module, and implementation of Qakka-based LegacyQueueManager implementation.

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
new file mode 100644
index 0000000..c154067
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
@@ -0,0 +1,272 @@
+/*
+ * 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.qakka.core;
+
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.ProtocolVersion;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.serialization.Result;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.QakkaModule;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaRuntimeException;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLog;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLogSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessageBody;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLog;
+import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLogSerialization;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+
+public class QueueMessageManagerTest extends AbstractTest {
+    private static final Logger logger = LoggerFactory.getLogger( QueueMessageManagerTest.class );
+
+    // TODO: test that multiple threads pulling from same queue will never pop same item
+
+    protected Injector myInjector = null;
+
+    @Override
+    protected Injector getInjector() {
+        if ( myInjector == null ) {
+            myInjector = Guice.createInjector( new QakkaModule() );
+        }
+        return myInjector;
+    }
+
+
+    @Test
+    public void testBasicOperation() throws Exception {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+        DistributedQueueService distributedQueueService = getInjector().getInstance( DistributedQueueService.class );
+        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+
+        String region = actorSystemFig.getRegionLocal();
+        App app = getInjector().getInstance( App.class );
+        app.start( "localhost", getNextAkkaPort(), region );
+
+        // create queue and send one message to it
+        String queueName = "qmmt_queue_" + RandomStringUtils.randomAlphanumeric(15);
+        QueueManager queueManager = getInjector().getInstance( QueueManager.class );
+        QueueMessageManager qmm = getInjector().getInstance( QueueMessageManager.class );
+        queueManager.createQueue( new Queue( queueName, "test-type", region, region, 0L, 5, 10, null ));
+        String jsonData = "{}";
+        qmm.sendMessages( queueName, Collections.singletonList(region), null, null,
+                "application/json", DataType.serializeValue( jsonData, ProtocolVersion.NEWEST_SUPPORTED) );
+
+        distributedQueueService.refresh();
+        Thread.sleep(1000);
+
+        // get message from the queue
+        List<QueueMessage> messages = qmm.getNextMessages( queueName, 1 );
+        Assert.assertEquals( 1, messages.size() );
+        QueueMessage message = messages.get(0);
+
+        // test that queue message data is present and correct
+        QueueMessageSerialization qms = getInjector().getInstance( QueueMessageSerialization.class );
+        DatabaseQueueMessageBody data = qms.loadMessageData( message.getMessageId() );
+        Assert.assertNotNull( data );
+        Assert.assertEquals( "application/json", data.getContentType() );
+        String jsonDataReturned = new String( data.getBlob().array(), Charset.forName("UTF-8") );
+        Assert.assertEquals( jsonData, jsonDataReturned );
+
+        // test that transfer log is empty for our queue
+        TransferLogSerialization tlogs = getInjector().getInstance( TransferLogSerialization.class );
+        Result<TransferLog> all = tlogs.getAllTransferLogs( null, 1000 );
+        List<TransferLog> logs = all.getEntities().stream()
+                .filter( log -> log.getQueueName().equals( queueName ) ).collect( Collectors.toList() );
+        Assert.assertTrue( logs.isEmpty() );
+
+        // ack the message
+        qmm.ackMessage( queueName, message.getQueueMessageId() );
+
+        // test that message is no longer stored in non-replicated keyspace
+
+        Assert.assertNull( qms.loadMessage( queueName, region, null,
+                DatabaseQueueMessage.Type.DEFAULT, message.getQueueMessageId() ));
+
+        Assert.assertNull( qms.loadMessage( queueName, region, null,
+                DatabaseQueueMessage.Type.INFLIGHT, message.getQueueMessageId() ));
+
+        // test that audit log entry was written
+        AuditLogSerialization auditLogSerialization = getInjector().getInstance( AuditLogSerialization.class );
+        Result<AuditLog> auditLogs = auditLogSerialization.getAuditLogs( message.getMessageId() );
+        Assert.assertEquals( 3, auditLogs.getEntities().size() );
+    }
+
+
+    @Test
+    public void testQueueMessageTimeouts() throws Exception {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+        DistributedQueueService distributedQueueService = getInjector().getInstance( DistributedQueueService.class );
+        QakkaFig qakkaFig = getInjector().getInstance( QakkaFig.class );
+        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+
+        String region = actorSystemFig.getRegionLocal();
+        App app = getInjector().getInstance( App.class );
+        app.start( "localhost", getNextAkkaPort(), region );
+
+        // create some number of queue messages
+
+        QueueManager queueManager = getInjector().getInstance( QueueManager.class );
+        QueueMessageManager qmm = getInjector().getInstance( QueueMessageManager.class );
+        String queueName = "qmmt_queue_" + RandomStringUtils.randomAlphanumeric(15);
+        queueManager.createQueue( new Queue( queueName, "test-type", region, region, 0L, 5, 10, null ));
+
+        int numMessages = 40;
+
+        for ( int i=0; i<numMessages; i++ ) {
+            qmm.sendMessages(
+                    queueName,
+                    Collections.singletonList( region ),
+                    null, // delay
+                    null, // expiration
+                    "application/json",
+                    DataType.serializeValue( "{}", ProtocolVersion.NEWEST_SUPPORTED ) );
+        }
+
+        distributedQueueService.refresh();
+        Thread.sleep(1000);
+
+        // get all messages from queue
+
+        List<QueueMessage> messages = qmm.getNextMessages( queueName, numMessages );
+        Assert.assertEquals( numMessages, messages.size() );
+
+        // ack half of the messages
+
+        List<QueueMessage> remove = new ArrayList<>();
+
+        for ( int i=0; i<numMessages/2; i++ ) {
+            QueueMessage queueMessage = messages.get( i );
+            qmm.ackMessage( queueName, queueMessage.getQueueMessageId() );
+            remove.add( queueMessage );
+        }
+
+        for ( QueueMessage message : remove ) {
+            messages.remove( message );
+        }
+
+        // wait for twice timeout period
+
+        Thread.sleep( 2 * qakkaFig.getQueueTimeoutSeconds()*1000 );
+
+        distributedQueueService.processTimeouts();
+
+        Thread.sleep( qakkaFig.getQueueTimeoutSeconds()*1000 );
+
+        // attempt to ack other half of messages
+
+        for ( QueueMessage message : messages ) {
+            try {
+                qmm.ackMessage( queueName, message.getQueueMessageId() );
+                Assert.fail("Message should have timed out by now");
+
+            } catch ( QakkaRuntimeException expected ) {
+                // keep on going...
+            }
+        }
+    }
+
+
+    @Test
+    public void testGetWithMissingData() throws InterruptedException {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+        getInjector().getInstance( App.class ); // init the INJECTOR
+
+        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        DistributedQueueService qas         = getInjector().getInstance( DistributedQueueService.class );
+        QueueManager qm               = getInjector().getInstance( QueueManager.class );
+        QueueMessageManager qmm       = getInjector().getInstance( QueueMessageManager.class );
+        QueueMessageSerialization qms = getInjector().getInstance( QueueMessageSerialization.class );
+
+        String region = actorSystemFig.getRegionLocal();
+        App app = getInjector().getInstance( App.class );
+        app.start( "localhost", getNextAkkaPort(), region );
+
+        // create queue messages, every other one with missing data
+
+        int numMessages = 100;
+        String queueName = "qmmt_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
+        qm.createQueue( new Queue( queueName, "test-type", region, region, 0L, 5, 10, null ));
+
+        for ( int i=0; i<numMessages; i++ ) {
+
+            final UUID messageId = QakkaUtils.getTimeUuid();
+
+            if ( i % 2 == 0 ) { // every other it
+                final String data = "my test data";
+                final DatabaseQueueMessageBody messageBody = new DatabaseQueueMessageBody(
+                        DataType.serializeValue( data, ProtocolVersion.NEWEST_SUPPORTED ), "text/plain" );
+                qms.writeMessageData( messageId, messageBody );
+            }
+
+            UUID queueMessageId = QakkaUtils.getTimeUuid();
+
+            DatabaseQueueMessage message = new DatabaseQueueMessage(
+                    messageId,
+                    DatabaseQueueMessage.Type.DEFAULT,
+                    queueName,
+                    actorSystemFig.getRegionLocal(),
+                    null,
+                    System.currentTimeMillis(),
+                    null,
+                    queueMessageId);
+            qms.writeMessage( message );
+        }
+
+        qas.refresh();
+        Thread.sleep(1000);
+
+        int count = 0;
+        while ( count < numMessages / 2 ) {
+            List<QueueMessage> messages = qmm.getNextMessages( queueName, 1 );
+            Assert.assertTrue( !messages.isEmpty() );
+            count += messages.size();
+            logger.debug("Got {} messages", ++count);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
new file mode 100644
index 0000000..829ba27
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
@@ -0,0 +1,175 @@
+/*
+ * 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.qakka.distributed;
+
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.ProtocolVersion;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.apache.cassandra.utils.UUIDGen;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.QakkaModule;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.core.Queue;
+import org.apache.usergrid.persistence.qakka.core.QueueManager;
+import org.apache.usergrid.persistence.qakka.core.impl.InMemoryQueue;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessageBody;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayInputStream;
+import java.io.ObjectInputStream;
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import java.util.UUID;
+
+
+public class QueueActorServiceTest extends AbstractTest {
+    private static final Logger logger = LoggerFactory.getLogger( QueueActorServiceTest.class );
+
+    protected Injector myInjector = null;
+
+    @Override
+    protected Injector getInjector() {
+        if ( myInjector == null ) {
+            myInjector = Guice.createInjector( new QakkaModule() );
+        }
+        return myInjector;
+    }
+
+
+    @Test
+    public void testBasicOperation() throws Exception {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        String region = actorSystemFig.getRegionLocal();
+
+        App app = getInjector().getInstance( App.class );
+        app.start( "localhost", getNextAkkaPort(), region );
+
+        DistributedQueueService distributedQueueService = getInjector().getInstance( DistributedQueueService.class );
+        QueueMessageSerialization serialization = getInjector().getInstance( QueueMessageSerialization.class );
+
+        String queueName = "testqueue_" + UUID.randomUUID();
+        QueueManager queueManager = getInjector().getInstance( QueueManager.class );
+        queueManager.createQueue( new Queue( queueName, "test-type", region, region, 0L, 5, 10, null ));
+
+        // send 1 queue message, get back one queue message
+        UUID messageId = UUIDGen.getTimeUUID();
+
+        final String data = "my test data";
+        final DatabaseQueueMessageBody messageBody = new DatabaseQueueMessageBody(
+                DataType.serializeValue( data, ProtocolVersion.NEWEST_SUPPORTED ), "text/plain" );
+        serialization.writeMessageData( messageId, messageBody );
+
+        distributedQueueService.sendMessageToRegion(
+                queueName, region, region, messageId, null, null);
+
+        distributedQueueService.refresh();
+        Thread.sleep(1000);
+
+        Collection<DatabaseQueueMessage> qmReturned = distributedQueueService.getNextMessages( queueName, 1 );
+        Assert.assertEquals( 1, qmReturned.size() );
+
+        DatabaseQueueMessage dqm = qmReturned.iterator().next();
+        DatabaseQueueMessageBody dqmb = serialization.loadMessageData( dqm.getMessageId() );
+        ByteBuffer blob = dqmb.getBlob();
+
+        String returnedData = new String( blob.array(), "UTF-8");
+//        ByteArrayInputStream bais = new ByteArrayInputStream( blob.array() );
+//        ObjectInputStream ios = new ObjectInputStream( bais );
+//        String returnedData = (String)ios.readObject();
+
+        Assert.assertEquals( data, returnedData );
+
+    }
+
+
+    @Test
+    public void testGetMultipleQueueMessages() throws InterruptedException {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        String region = actorSystemFig.getRegionLocal();
+
+        App app = getInjector().getInstance( App.class );
+        app.start("localhost", getNextAkkaPort(), region);
+
+        DistributedQueueService distributedQueueService = getInjector().getInstance( DistributedQueueService.class );
+        QueueMessageSerialization serialization = getInjector().getInstance( QueueMessageSerialization.class );
+        InMemoryQueue inMemoryQueue             = getInjector().getInstance( InMemoryQueue.class );
+
+        String queueName = "testqueue_" + UUID.randomUUID();
+        QueueManager queueManager = getInjector().getInstance( QueueManager.class );
+        queueManager.createQueue(
+                new Queue( queueName, "test-type", region, region, 0L, 5, 10, null ));
+
+        for ( int i=0; i<100; i++ ) {
+
+            UUID messageId = UUIDGen.getTimeUUID();
+
+            final String data = "my test data";
+            final DatabaseQueueMessageBody messageBody = new DatabaseQueueMessageBody(
+                    DataType.serializeValue( data, ProtocolVersion.NEWEST_SUPPORTED ), "text/plain" );
+            serialization.writeMessageData( messageId, messageBody );
+
+            distributedQueueService.sendMessageToRegion(
+                    queueName, region, region, messageId , null, null);
+        }
+
+        int maxRetries = 15;
+        int retries = 0;
+        while ( retries++ < maxRetries ) {
+            distributedQueueService.refresh();
+            Thread.sleep( 3000 );
+            if (inMemoryQueue.size( queueName ) == 100) {
+                break;
+            }
+        }
+
+        Assert.assertEquals( 100, inMemoryQueue.size( queueName ) );
+
+        Assert.assertEquals( 25, distributedQueueService.getNextMessages( queueName, 25 ).size() );
+        Assert.assertEquals( 75, inMemoryQueue.size( queueName ) );
+
+        Assert.assertEquals( 25, distributedQueueService.getNextMessages( queueName, 25 ).size() );
+        Assert.assertEquals( 50, inMemoryQueue.size( queueName ) );
+
+        Assert.assertEquals( 25, distributedQueueService.getNextMessages( queueName, 25 ).size() );
+        Assert.assertEquals( 25, inMemoryQueue.size( queueName ) );
+
+        Assert.assertEquals( 25, distributedQueueService.getNextMessages( queueName, 25 ).size() );
+        Assert.assertEquals( 0, inMemoryQueue.size( queueName ) );
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
new file mode 100644
index 0000000..9e4128e
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
@@ -0,0 +1,284 @@
+/*
+ * 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.qakka.distributed.actors;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.QakkaModule;
+import org.apache.usergrid.persistence.qakka.core.*;
+import org.apache.usergrid.persistence.qakka.serialization.Result;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLog;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLogSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.UUID;
+
+
+public class QueueActorHelperTest extends AbstractTest {
+
+    protected Injector myInjector = null;
+
+    @Override
+    protected Injector getInjector() {
+        if ( myInjector == null ) {
+            myInjector = Guice.createInjector( new QakkaModule() );
+        }
+        return myInjector;
+    }
+
+
+    @Test
+    public void loadDatabaseQueueMessage() throws Exception {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+        getInjector().getInstance( App.class ); // init the INJECTOR
+
+        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        QueueMessageSerialization qms = getInjector().getInstance( QueueMessageSerialization.class );
+        QueueManager queueManager     = getInjector().getInstance( QueueManager.class );
+
+        String region = actorSystemFig.getRegionLocal();
+        App app = getInjector().getInstance( App.class );
+        app.start( "localhost", getNextAkkaPort(), region );
+
+        String queueName = "qat_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
+        queueManager.createQueue( new Queue( queueName ) );
+
+        UUID queueMessageId = QakkaUtils.getTimeUuid();
+
+        // write message
+
+        DatabaseQueueMessage message = new DatabaseQueueMessage(
+                QakkaUtils.getTimeUuid(),
+                DatabaseQueueMessage.Type.DEFAULT,
+                queueName,
+                actorSystemFig.getRegionLocal(),
+                null,
+                System.currentTimeMillis(),
+                null,
+                queueMessageId);
+        qms.writeMessage( message );
+
+        // load message
+
+        QueueActorHelper helper = getInjector().getInstance( QueueActorHelper.class );
+        DatabaseQueueMessage queueMessage = helper.loadDatabaseQueueMessage(
+                queueName, message.getQueueMessageId(), message.getType() );
+
+        Assert.assertNotNull( queueMessage );
+    }
+
+
+    @Test
+    public void loadDatabaseQueueMessageNotFound() throws Exception {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+
+        getInjector().getInstance( App.class ); // init the INJECTOR
+        QueueManager queueManager = getInjector().getInstance( QueueManager.class );
+
+        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        String region = actorSystemFig.getRegionLocal();
+        App app = getInjector().getInstance( App.class );
+        app.start( "localhost", getNextAkkaPort(), region );
+
+        String queueName = "qat_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
+        queueManager.createQueue( new Queue( queueName ) );
+
+        // don't write any message
+
+        // load message
+
+        QueueActorHelper helper = getInjector().getInstance( QueueActorHelper.class );
+        DatabaseQueueMessage queueMessage = helper.loadDatabaseQueueMessage(
+                queueName, QakkaUtils.getTimeUuid(), DatabaseQueueMessage.Type.DEFAULT );
+
+        Assert.assertNull( queueMessage );
+    }
+
+
+    @Test
+    public void putInflight() throws Exception {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+
+        getInjector().getInstance( App.class ); // init the INJECTOR
+
+        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        QueueMessageSerialization qms = getInjector().getInstance( QueueMessageSerialization.class );
+        QueueManager queueManager     = getInjector().getInstance( QueueManager.class );
+
+        String region = actorSystemFig.getRegionLocal();
+        App app = getInjector().getInstance( App.class );
+        app.start( "localhost", getNextAkkaPort(), region );
+
+        // write message to messages_available table
+
+        UUID queueMessageId = QakkaUtils.getTimeUuid();
+
+        String queueName = "qat_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
+        queueManager.createQueue( new Queue( queueName ) );
+
+        DatabaseQueueMessage message = new DatabaseQueueMessage(
+                QakkaUtils.getTimeUuid(),
+                DatabaseQueueMessage.Type.DEFAULT,
+                queueName,
+                actorSystemFig.getRegionLocal(),
+                null,
+                System.currentTimeMillis(),
+                null,
+                queueMessageId);
+        qms.writeMessage( message );
+
+        // put message inflight
+
+        QueueActorHelper helper = getInjector().getInstance( QueueActorHelper.class );
+        helper.putInflight( queueName, message );
+
+        // message must be gone from messages_available table
+
+        Assert.assertNull( qms.loadMessage(
+                queueName,
+                actorSystemFig.getRegionLocal(),
+                null,
+                DatabaseQueueMessage.Type.DEFAULT,
+                message.getQueueMessageId() ) );
+
+        // message must be present in messages_inflight table
+
+        Assert.assertNotNull( qms.loadMessage(
+                queueName,
+                actorSystemFig.getRegionLocal(),
+                null,
+                DatabaseQueueMessage.Type.INFLIGHT,
+                message.getQueueMessageId() ) );
+
+        // there must be an audit log record of the successful get operation
+
+        AuditLogSerialization auditLogSerialization = getInjector().getInstance( AuditLogSerialization.class );
+        Result<AuditLog> auditLogs = auditLogSerialization.getAuditLogs( message.getMessageId() );
+        Assert.assertEquals( 1, auditLogs.getEntities().size() );
+        Assert.assertEquals( AuditLog.Status.SUCCESS, auditLogs.getEntities().get(0).getStatus()  );
+        Assert.assertEquals( AuditLog.Action.GET,     auditLogs.getEntities().get(0).getAction()  );
+    }
+
+
+    @Test
+    public void ackQueueMessage() throws Exception {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+
+        getInjector().getInstance( App.class ); // init the INJECTOR
+
+        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        QueueMessageSerialization qms = getInjector().getInstance( QueueMessageSerialization.class );
+        QueueManager queueManager     = getInjector().getInstance( QueueManager.class );
+
+        String region = actorSystemFig.getRegionLocal();
+        App app = getInjector().getInstance( App.class );
+        app.start( "localhost", getNextAkkaPort(), region );
+
+        UUID queueMessageId = QakkaUtils.getTimeUuid();
+
+        String queueName = "qat_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
+        queueManager.createQueue( new Queue( queueName ) );
+
+        // write message to messages_inflight table
+
+        DatabaseQueueMessage message = new DatabaseQueueMessage(
+                QakkaUtils.getTimeUuid(),
+                DatabaseQueueMessage.Type.INFLIGHT,
+                queueName,
+                actorSystemFig.getRegionLocal(),
+                null,
+                System.currentTimeMillis(),
+                null,
+                queueMessageId);
+        qms.writeMessage( message );
+
+        // ack message
+
+        QueueActorHelper helper = getInjector().getInstance( QueueActorHelper.class );
+        helper.ackQueueMessage( queueName, message.getQueueMessageId() );
+
+        // message must be gone from messages_available table
+
+        Assert.assertNull( helper.loadDatabaseQueueMessage(
+                queueName, QakkaUtils.getTimeUuid(), DatabaseQueueMessage.Type.INFLIGHT ));
+
+        // message must be gone from messages_inflight table
+
+        Assert.assertNull( helper.loadDatabaseQueueMessage(
+                queueName, QakkaUtils.getTimeUuid(), DatabaseQueueMessage.Type.DEFAULT ));
+
+        // there should be an audit log record of the successful ack operation
+
+        AuditLogSerialization auditLogSerialization = getInjector().getInstance( AuditLogSerialization.class );
+        Result<AuditLog> auditLogs = auditLogSerialization.getAuditLogs( message.getMessageId() );
+        Assert.assertEquals( 1, auditLogs.getEntities().size() );
+        Assert.assertEquals( AuditLog.Status.SUCCESS, auditLogs.getEntities().get(0).getStatus()  );
+        Assert.assertEquals( AuditLog.Action.ACK,     auditLogs.getEntities().get(0).getAction()  );
+    }
+
+
+    @Test
+    public void ackQueueMessageNotFound() throws Exception {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+
+        getInjector().getInstance( App.class ); // init the INJECTOR
+        QueueManager queueManager     = getInjector().getInstance( QueueManager.class );
+        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+
+        String region = actorSystemFig.getRegionLocal();
+        App app = getInjector().getInstance( App.class );
+        app.start( "localhost", getNextAkkaPort(), region );
+
+        String queueName = "qat_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
+        queueManager.createQueue( new Queue( queueName ) );
+
+        // don't write message, just make up some bogus IDs
+
+        UUID queueMessageId = QakkaUtils.getTimeUuid();
+
+        // ack message must fail
+
+        QueueActorHelper helper = getInjector().getInstance( QueueActorHelper.class );
+        Assert.assertEquals( DistributedQueueService.Status.BAD_REQUEST, helper.ackQueueMessage( queueName, queueMessageId ));
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueReaderTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueReaderTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueReaderTest.java
new file mode 100644
index 0000000..5f0be53
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueReaderTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.qakka.distributed.actors;
+
+import akka.actor.ActorRef;
+import akka.actor.ActorSystem;
+import akka.actor.Props;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.core.QakkaUtils;
+import org.apache.usergrid.persistence.qakka.core.impl.InMemoryQueue;
+import org.apache.usergrid.persistence.qakka.distributed.messages.QueueRefreshRequest;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardSerialization;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.UUID;
+
+
+public class QueueReaderTest extends AbstractTest {
+    private static final Logger logger = LoggerFactory.getLogger( QueueReaderTest.class );
+
+    
+    
+    @Test
+    public void testBasicOperation() throws Exception {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+
+        getInjector().getInstance( App.class ); // init the INJECTOR 
+        
+        QakkaFig qakkaFig = getInjector().getInstance( QakkaFig.class );
+        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        ShardSerialization shardSerialization = getInjector().getInstance( ShardSerialization.class );
+
+        int numMessages = 200;
+        // create queue messages, only first lot get queue message data
+        
+        QueueMessageSerialization serialization = getInjector().getInstance( QueueMessageSerialization.class );
+        String queueName = "qrt_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
+        
+        Shard newShard = new Shard( queueName, actorSystemFig.getRegionLocal(),
+                Shard.Type.DEFAULT, 1L, QakkaUtils.getTimeUuid());
+        shardSerialization.createShard( newShard );
+
+        for ( int i=0; i<numMessages; i++ ) {
+
+            UUID messageId = QakkaUtils.getTimeUuid();
+            UUID queueMessageId = QakkaUtils.getTimeUuid();
+
+            DatabaseQueueMessage message = new DatabaseQueueMessage( 
+                    messageId,
+                    DatabaseQueueMessage.Type.DEFAULT, 
+                    queueName, 
+                    actorSystemFig.getRegionLocal(),
+                    null, 
+                    System.currentTimeMillis(), 
+                    null, 
+                    queueMessageId);
+            serialization.writeMessage( message ); 
+        }
+
+        InMemoryQueue inMemoryQueue = getInjector().getInstance( InMemoryQueue.class );
+        Assert.assertEquals( 0, inMemoryQueue.size( queueName ) );
+
+        // run the QueueRefresher to fill up the in-memory queue
+
+        ActorSystem system = ActorSystem.create("Test-" + queueName);
+        ActorRef queueReaderRef = system.actorOf( Props.create( QueueRefresher.class, queueName ), "queueReader");
+        QueueRefreshRequest refreshRequest = new QueueRefreshRequest( queueName );
+        queueReaderRef.tell( refreshRequest, null ); // tell sends message, returns immediately
+    
+        // need to wait for refresh to complete
+        int maxRetries = 10;
+        int retries = 0;
+        while ( inMemoryQueue.size( queueName ) < qakkaFig.getQueueInMemorySize() && retries++ < maxRetries ) {
+            Thread.sleep(1000);     
+        }
+        
+        Assert.assertEquals( numMessages, inMemoryQueue.size( queueName ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouterTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouterTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouterTest.java
new file mode 100644
index 0000000..511b059
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueTimeouterTest.java
@@ -0,0 +1,152 @@
+/*
+ * 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.qakka.distributed.actors;
+
+import akka.actor.ActorRef;
+import akka.actor.ActorSystem;
+import akka.actor.Props;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.distributed.messages.QueueTimeoutRequest;
+import org.apache.usergrid.persistence.qakka.serialization.MultiShardMessageIterator;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardIterator;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardSerialization;
+import org.apache.usergrid.persistence.qakka.core.QakkaUtils;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+
+public class QueueTimeouterTest extends AbstractTest {
+    private static final Logger logger = LoggerFactory.getLogger( QueueTimeouterTest.class );
+
+    
+    @Test
+    public void testBasicOperation() throws Exception {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+        getInjector().getInstance( App.class ); // init the INJECTOR
+
+        QakkaFig qakkaFig             = getInjector().getInstance( QakkaFig.class );
+        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        QueueMessageSerialization qms = getInjector().getInstance( QueueMessageSerialization.class );
+        ShardSerialization shardSerialization = getInjector().getInstance( ShardSerialization.class );
+        
+        // create records in inflight table, with some being old enough to time out 
+
+        int numInflight = 200; // number of messages to be put into timeout table
+        int numTimedout = 75;  // number of messages to be timedout
+        
+        long timeoutMs = qakkaFig.getQueueTimeoutSeconds()*1000;
+
+        String queueName = "qtt_queue_" + RandomStringUtils.randomAlphanumeric( 20 );
+
+        Shard newShard = new Shard( queueName, actorSystemFig.getRegionLocal(),
+                Shard.Type.INFLIGHT, 1L, QakkaUtils.getTimeUuid());
+        shardSerialization.createShard( newShard );
+
+        newShard = new Shard( queueName, actorSystemFig.getRegionLocal(),
+                Shard.Type.DEFAULT, 1L, QakkaUtils.getTimeUuid());
+        shardSerialization.createShard( newShard );
+
+        for ( int i=0; i<numInflight; i++ ) {
+           
+            long created = System.currentTimeMillis();
+            created = i < numTimedout ? created - timeoutMs: created + timeoutMs;
+
+            UUID queueMessageId = QakkaUtils.getTimeUuid();
+            
+            UUID messageId = QakkaUtils.getTimeUuid();
+            DatabaseQueueMessage message = new DatabaseQueueMessage(
+                    messageId,
+                    DatabaseQueueMessage.Type.INFLIGHT,
+                    queueName,
+                    actorSystemFig.getRegionLocal(),
+                    null,
+                    created,
+                    created,
+                    queueMessageId );
+            
+            qms.writeMessage( message );
+        }
+
+        List<DatabaseQueueMessage> inflightMessages = getDatabaseQueueMessages( 
+                cassandraClient, queueName, actorSystemFig.getRegionLocal(), Shard.Type.INFLIGHT );
+        Assert.assertEquals( numInflight, inflightMessages.size() );
+        
+        // run timeouter actor
+
+        ActorSystem system = ActorSystem.create("Test-" + queueName);
+        ActorRef timeouterRef = system.actorOf( Props.create( QueueTimeouter.class, queueName ), "timeouter");
+        QueueTimeoutRequest qtr = new QueueTimeoutRequest( queueName );
+        timeouterRef.tell( qtr, null ); // tell sends message, returns immediately
+        
+        Thread.sleep( timeoutMs );
+
+        // timed out messages should have been moved into available (DEFAULT) table
+        
+        List<DatabaseQueueMessage> queuedMessages = getDatabaseQueueMessages( 
+                cassandraClient, queueName, actorSystemFig.getRegionLocal(), Shard.Type.DEFAULT);
+        Assert.assertEquals( numTimedout, queuedMessages.size() );
+
+        // and there should still be some messages in the INFLIGHT table
+
+        inflightMessages = getDatabaseQueueMessages( 
+                cassandraClient, queueName, actorSystemFig.getRegionLocal(), Shard.Type.INFLIGHT );
+        Assert.assertEquals( numInflight - numTimedout, inflightMessages.size() );
+
+    }
+
+    private List<DatabaseQueueMessage> getDatabaseQueueMessages(
+            CassandraClient cassandraClient, String queueName, String region, Shard.Type type ) {
+        
+        ShardIterator shardIterator = new ShardIterator(
+                cassandraClient, queueName, region, type, Optional.empty() );
+
+        DatabaseQueueMessage.Type dbqmType = Shard.Type.DEFAULT.equals( type ) ?
+                DatabaseQueueMessage.Type.DEFAULT : DatabaseQueueMessage.Type.INFLIGHT;
+        
+        MultiShardMessageIterator multiShardIterator = new MultiShardMessageIterator(
+                cassandraClient, queueName, region, dbqmType, shardIterator, null);
+
+        List<DatabaseQueueMessage> inflightMessages = new ArrayList<>(2000);
+        while ( multiShardIterator.hasNext() && inflightMessages.size() < 2000 ) {
+            DatabaseQueueMessage message = multiShardIterator.next();
+            inflightMessages.add( message );
+        }
+        return inflightMessages;
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
new file mode 100644
index 0000000..3dbd980
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
@@ -0,0 +1,212 @@
+/*
+ * 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.qakka.distributed.actors;
+
+import akka.actor.ActorRef;
+import akka.actor.ActorSystem;
+import akka.actor.Props;
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.ProtocolVersion;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.QakkaModule;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.core.*;
+import org.apache.usergrid.persistence.qakka.distributed.messages.ShardCheckRequest;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardCounterSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardIterator;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardSerialization;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collections;
+import java.util.Optional;
+
+
+public class ShardAllocatorTest extends AbstractTest {
+    private static final Logger logger = LoggerFactory.getLogger( QueueReaderTest.class );
+
+
+    protected Injector myInjector = null;
+
+    @Override
+    protected Injector getInjector() {
+        if ( myInjector == null ) {
+            myInjector = Guice.createInjector( new QakkaModule() );
+        }
+        return myInjector;
+    }
+
+
+    @Test
+    public void testBasicOperation() throws InterruptedException {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+        getInjector().getInstance( App.class ); // init the INJECTOR
+
+        ShardSerialization shardSer        = getInjector().getInstance( ShardSerialization.class );
+        QakkaFig qakkaFig        = getInjector().getInstance( QakkaFig.class );
+        ActorSystemFig            actorSystemFig  = getInjector().getInstance( ActorSystemFig.class );
+        ShardCounterSerialization shardCounterSer = getInjector().getInstance( ShardCounterSerialization.class );
+
+        String rando = RandomStringUtils.randomAlphanumeric( 20 );
+
+        String queueName = "queue_" + rando;
+        String region = actorSystemFig.getRegionLocal();
+
+        // Create a set of shards, each with max count
+
+        Shard lastShard = null;
+
+        int numShards = 4;
+        long maxPerShard = qakkaFig.getMaxShardSize();
+
+        for ( long shardId = 1; shardId < numShards + 1; shardId++ ) {
+
+            Shard shard = new Shard( queueName, region, Shard.Type.DEFAULT, shardId, QakkaUtils.getTimeUuid());
+            shardSer.createShard( shard );
+
+            if ( shardId != numShards ) {
+                shardCounterSer.incrementCounter( queueName, Shard.Type.DEFAULT, shardId, maxPerShard );
+
+            } else {
+                // Create last shard with %20 less than max
+                shardCounterSer.incrementCounter( queueName, Shard.Type.DEFAULT, shardId, (long)(0.8 * maxPerShard) );
+                lastShard = shard;
+            }
+
+            Thread.sleep( 10 );
+        }
+
+        Assert.assertEquals( numShards, countShards(
+                cassandraClient, shardCounterSer, queueName, region, Shard.Type.DEFAULT ));
+
+        // Run shard allocator actor by sending message to it
+
+        ActorSystem system = ActorSystem.create("Test-" + queueName);
+        ActorRef shardAllocRef = system.actorOf( Props.create( ShardAllocator.class, queueName ), "shardallocator");
+
+        ShardCheckRequest checkRequest = new ShardCheckRequest( queueName );
+        shardAllocRef.tell( checkRequest, null ); // tell sends message, returns immediately
+        Thread.sleep(1000);
+
+        // Test that no new shards created
+
+        Assert.assertEquals( numShards, countShards(
+                cassandraClient, shardCounterSer, queueName, region, Shard.Type.DEFAULT ));
+
+        // Increment last shard by 20% of max
+
+        shardCounterSer.incrementCounter(
+                queueName, Shard.Type.DEFAULT, lastShard.getShardId(), (long)(0.2 * maxPerShard) );
+
+        // Run shard allocator again
+
+        shardAllocRef.tell( checkRequest, null ); // tell sends message, returns immediately
+        Thread.sleep(1000);
+
+        // Test that, this time, a new shard was created
+
+        Assert.assertEquals( numShards + 1, countShards(
+                cassandraClient, shardCounterSer, queueName, region, Shard.Type.DEFAULT ));
+    }
+
+
+    int countShards(
+            CassandraClient cassandraClient,
+            ShardCounterSerialization scs,
+            String queueName,
+            String region,
+            Shard.Type type ) {
+
+        ShardIterator shardIterator =
+                new ShardIterator( cassandraClient, queueName, region, type, Optional.empty() );
+
+        int shardCount = 0;
+        while ( shardIterator.hasNext() ) {
+            Shard s = shardIterator.next();
+            shardCount++;
+            long counterValue = scs.getCounterValue( s.getQueueName(), type, s.getShardId() );
+            logger.debug("Shard {} {} is #{} has count={}", type, s.getShardId(), shardCount, counterValue );
+
+        }
+
+        return shardCount;
+    }
+
+
+    @Test
+    public void testBasicOperationWithMessages() throws InterruptedException {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+        getInjector().getInstance( App.class ); // init the INJECTOR
+
+        ActorSystemFig      actorSystemFig        = getInjector().getInstance( ActorSystemFig.class );
+        QueueManager        queueManager          = getInjector().getInstance( QueueManager.class );
+        QueueMessageManager queueMessageManager   = getInjector().getInstance( QueueMessageManager.class );
+        DistributedQueueService distributedQueueService = getInjector().getInstance( DistributedQueueService.class );
+        ShardCounterSerialization shardCounterSer = getInjector().getInstance( ShardCounterSerialization.class );
+
+
+        String region = actorSystemFig.getRegionLocal();
+        App app = getInjector().getInstance( App.class );
+        app.start( "localhost", getNextAkkaPort(), region );
+
+        String rando = RandomStringUtils.randomAlphanumeric( 20 );
+        String queueName = "queue_" + rando;
+
+        queueManager.createQueue( new Queue( queueName ));
+
+        // Create 4000 messages
+
+        int numMessages = 4000;
+
+        for ( int i=0; i<numMessages; i++ ) {
+            queueMessageManager.sendMessages(
+                    queueName,
+                    Collections.singletonList( region ),
+                    null, // delay
+                    null, // expiration
+                    "application/json",
+                    DataType.serializeValue( "{}", ProtocolVersion.NEWEST_SUPPORTED ) );
+        }
+
+        distributedQueueService.refresh();
+        Thread.sleep(3000);
+
+        // Test that 8 shards were created
+
+        Assert.assertEquals( 8,
+                countShards( cassandraClient, shardCounterSer, queueName, region, Shard.Type.DEFAULT ));
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardDatabaseQueueMessageIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardDatabaseQueueMessageIteratorTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardDatabaseQueueMessageIteratorTest.java
new file mode 100644
index 0000000..76e3279
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardDatabaseQueueMessageIteratorTest.java
@@ -0,0 +1,127 @@
+/*
+ * 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.qakka.serialization;
+
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.core.QakkaUtils;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardIterator;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardSerializationImpl;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Optional;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Created by russo on 6/9/16.
+ */
+public class MultiShardDatabaseQueueMessageIteratorTest extends AbstractTest {
+    private static final Logger logger = LoggerFactory.getLogger( MultiShardDatabaseQueueMessageIteratorTest.class );
+
+    
+    @Test
+    public void testIterator() throws InterruptedException {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+
+        ShardSerialization shardSerialization = new ShardSerializationImpl( cassandraClient );
+        
+        QueueMessageSerialization queueMessageSerialization =
+                getInjector().getInstance( QueueMessageSerialization.class );
+        
+        Shard shard1 = new Shard("test", "region", Shard.Type.DEFAULT, 1L, null);
+        Shard shard2 = new Shard("test", "region", Shard.Type.DEFAULT, 2L, null);
+        Shard shard3 = new Shard("test", "region", Shard.Type.DEFAULT, 3L, null);
+        Shard shard4 = new Shard("test", "region", Shard.Type.DEFAULT, 4L, null);
+
+        shardSerialization.createShard(shard1);
+        shardSerialization.createShard(shard2);
+        shardSerialization.createShard(shard3);
+        shardSerialization.createShard(shard4);
+
+        final int numMessagesPerShard = 50;
+
+        // just do these separately to space out the time UUIDs per shard
+        for(int i=0; i < numMessagesPerShard; i++){
+
+            queueMessageSerialization.writeMessage( new DatabaseQueueMessage(QakkaUtils.getTimeUuid(),
+                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard1.getShardId(), 
+                    System.currentTimeMillis(), null, null));
+            Thread.sleep(3);
+        }
+
+        for(int i=0; i < numMessagesPerShard; i++){
+
+            queueMessageSerialization.writeMessage( new DatabaseQueueMessage(QakkaUtils.getTimeUuid(),
+                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard2.getShardId(), 
+                    System.currentTimeMillis(), null, null));
+            Thread.sleep(3);
+        }
+
+        for(int i=0; i < numMessagesPerShard; i++){
+
+            queueMessageSerialization.writeMessage( new DatabaseQueueMessage(QakkaUtils.getTimeUuid(),
+                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard3.getShardId(), 
+                    System.currentTimeMillis(), null, null));
+            Thread.sleep(3);
+        }
+
+        for(int i=0; i < numMessagesPerShard; i++){
+
+            queueMessageSerialization.writeMessage( new DatabaseQueueMessage(QakkaUtils.getTimeUuid(),
+                    DatabaseQueueMessage.Type.DEFAULT, "test", "region", shard4.getShardId(), 
+                    System.currentTimeMillis(), null, null));
+            Thread.sleep(3);
+        }
+
+
+        ShardIterator shardIterator = new ShardIterator(
+                cassandraClient, "test", "region", Shard.Type.DEFAULT, Optional.empty());
+        MultiShardMessageIterator iterator = new MultiShardMessageIterator( 
+                cassandraClient, "test", "region", DatabaseQueueMessage.Type.DEFAULT, shardIterator, null);
+
+        final AtomicInteger[] counts = { 
+                new AtomicInteger(0), new AtomicInteger(0), new AtomicInteger(0), new AtomicInteger(0) };
+        
+        iterator.forEachRemaining(message -> {
+            //logger.info("Shard ID: {}, DatabaseQueueMessage ID: {}", message.getShardId(), message.getMessageId());
+            counts[ (int)(message.getShardId() - 1) ] .incrementAndGet();
+        });
+
+        logger.info("Total Count 1: {}", counts[0].get());
+        logger.info("Total Count 2: {}", counts[1].get());
+        logger.info("Total Count 3: {}", counts[2].get());
+        logger.info("Total Count 4: {}", counts[3].get());
+
+        assertEquals(numMessagesPerShard, counts[0].get());
+        assertEquals(numMessagesPerShard, counts[1].get());
+        assertEquals(numMessagesPerShard, counts[2].get());
+        assertEquals(numMessagesPerShard, counts[3].get());
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/auditlogs/AuditLogSerializationTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/auditlogs/AuditLogSerializationTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/auditlogs/AuditLogSerializationTest.java
new file mode 100644
index 0000000..072fd94
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/auditlogs/AuditLogSerializationTest.java
@@ -0,0 +1,102 @@
+/*
+ * 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.qakka.serialization.auditlogs;
+
+import org.apache.cassandra.utils.UUIDGen;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.serialization.Result;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLog;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLogSerialization;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.UUID;
+
+
+public class AuditLogSerializationTest extends AbstractTest {
+
+    @Test
+    public void testRecordAuditLog() throws Exception {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+        AuditLogSerialization logSerialization = getInjector().getInstance( AuditLogSerialization.class );
+
+        // record some audit logs for a message
+        UUID messageId = UUIDGen.getTimeUUID();
+        String queueName = "alst_queue_" + RandomStringUtils.randomAlphanumeric( 15 );
+        String source = RandomStringUtils.randomAlphanumeric( 15 );
+        String dest = RandomStringUtils.randomAlphanumeric( 15 );
+        
+        logSerialization.recordAuditLog( AuditLog.Action.GET, AuditLog.Status.SUCCESS, 
+            queueName, dest, messageId, UUIDGen.getTimeUUID() );
+           
+        // get audit logs for that message
+        Result<AuditLog> result = logSerialization.getAuditLogs( messageId );
+        Assert.assertEquals( 1, result.getEntities().size() );
+    }
+
+    @Test
+    public void testGetAuditLogs() throws Exception {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+
+        AuditLogSerialization logSerialization = getInjector().getInstance( AuditLogSerialization.class );
+
+        // record some audit logs for a message
+        UUID messageId = UUIDGen.getTimeUUID();
+        String queueName = "alst_queue_" + RandomStringUtils.randomAlphanumeric( 15 );
+        String source = RandomStringUtils.randomAlphanumeric( 15 );
+        String dest = RandomStringUtils.randomAlphanumeric( 15 );
+
+        int numLogs = 10;
+        
+        UUID queueMessageId1 = UUIDGen.getTimeUUID();
+        for ( int i=0; i<numLogs; i++ ) {
+            logSerialization.recordAuditLog( AuditLog.Action.GET, AuditLog.Status.SUCCESS,
+                    queueName, dest, messageId, queueMessageId1 );
+            Thread.sleep(5); 
+        }
+        
+        UUID queueMessageId2 = UUIDGen.getTimeUUID();
+        for ( int i=0; i<numLogs; i++ ) {
+            logSerialization.recordAuditLog( AuditLog.Action.GET, AuditLog.Status.SUCCESS,
+                    queueName, dest, messageId, queueMessageId2 );
+            Thread.sleep(5);
+        }
+
+        UUID queueMessageId3 = UUIDGen.getTimeUUID();
+        for ( int i=0; i<numLogs; i++ ) {
+            logSerialization.recordAuditLog( AuditLog.Action.GET, AuditLog.Status.SUCCESS,
+                    queueName, dest, messageId, queueMessageId3 );
+            Thread.sleep(5);
+        }
+
+        // test that we have 3 X number of logs for the messageId
+        Result<AuditLog> result = logSerialization.getAuditLogs( messageId );
+        Assert.assertEquals( numLogs * 3, result.getEntities().size() );
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/DatabaseQueueMessageSerializationTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/DatabaseQueueMessageSerializationTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/DatabaseQueueMessageSerializationTest.java
new file mode 100644
index 0000000..4ea6de3
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/DatabaseQueueMessageSerializationTest.java
@@ -0,0 +1,267 @@
+/*
+ * 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.qakka.serialization.queuemessages;
+
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.ProtocolVersion;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaRuntimeException;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.core.QakkaUtils;
+import org.junit.Test;
+
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+
+public class DatabaseQueueMessageSerializationTest extends AbstractTest {
+
+
+    static class ThingToSave implements Serializable {
+        String value;
+    }
+
+
+    @Test
+    public void writeNewMessage(){
+
+        QueueMessageSerialization queueMessageSerialization =
+                getInjector().getInstance( QueueMessageSerialization.class );
+
+        Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
+
+        DatabaseQueueMessage message1 = new DatabaseQueueMessage(QakkaUtils.getTimeUuid(),
+                DatabaseQueueMessage.Type.DEFAULT, "test", "region1",
+                shard1.getShardId(), System.currentTimeMillis(), null, null);
+
+        UUID queueMessageId = queueMessageSerialization.writeMessage(message1);
+    }
+
+    @Test
+    public void deleteMessage(){
+
+        QueueMessageSerialization queueMessageSerialization =
+                getInjector().getInstance( QueueMessageSerialization.class );
+
+        Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
+
+        UUID messageId = QakkaUtils.getTimeUuid();
+        String queueName = "dqmst_queue_" + RandomStringUtils.randomAlphanumeric( 20 );
+
+        DatabaseQueueMessage message = new DatabaseQueueMessage(
+                messageId,
+                DatabaseQueueMessage.Type.DEFAULT,
+                queueName,
+                "dummy_region",
+                shard1.getShardId(),
+                System.currentTimeMillis(),
+                null, null );
+
+        UUID queueMessageId = queueMessageSerialization.writeMessage( message );
+
+        queueMessageSerialization.deleteMessage(
+            queueName,
+            "dummy_region",
+            shard1.getShardId(),
+            DatabaseQueueMessage.Type.DEFAULT,
+            queueMessageId );
+
+        assertNull( queueMessageSerialization.loadMessage(
+            queueName,
+            "dummy_region",
+            shard1.getShardId(),
+            DatabaseQueueMessage.Type.DEFAULT,
+            queueMessageId
+        ));
+    }
+
+
+    @Test
+    public void loadNullMessage(){
+
+        QueueMessageSerialization queueMessageSerialization =
+                getInjector().getInstance( QueueMessageSerialization.class );
+
+        Shard shard1 = new Shard("junk", "region1", Shard.Type.DEFAULT, 100L, null);
+
+        assertNull( queueMessageSerialization.loadMessage(
+                RandomStringUtils.randomAlphanumeric( 20 ),
+                "dummy_region",
+                shard1.getShardId(),
+                DatabaseQueueMessage.Type.DEFAULT,
+                null
+        ));
+    }
+
+
+    @Test
+    public void writeNewMessageData(){
+
+        QueueMessageSerialization queueMessageSerialization =
+                getInjector().getInstance( QueueMessageSerialization.class );
+
+        Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
+
+        UUID messageId = QakkaUtils.getTimeUuid();
+
+        final String data = "my test data";
+
+        final DatabaseQueueMessageBody messageBody = new DatabaseQueueMessageBody(
+                DataType.serializeValue(data, ProtocolVersion.NEWEST_SUPPORTED), "text/plain");
+
+        queueMessageSerialization.writeMessageData(messageId, messageBody);
+
+        final DatabaseQueueMessageBody returnedData = queueMessageSerialization.loadMessageData( messageId );
+    }
+
+
+    @Test
+    public void loadMessageData() throws Exception {
+
+        QueueMessageSerialization queueMessageSerialization =
+                getInjector().getInstance( QueueMessageSerialization.class );
+
+        Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
+
+        UUID messageId = QakkaUtils.getTimeUuid();
+
+        final String data = "my test data";
+
+        final DatabaseQueueMessageBody messageBody = new DatabaseQueueMessageBody( DataType.serializeValue(data,
+                ProtocolVersion.NEWEST_SUPPORTED), "text/plain");
+
+        queueMessageSerialization.writeMessageData(messageId, messageBody);
+
+        final DatabaseQueueMessageBody returnedBody = queueMessageSerialization.loadMessageData( messageId );
+        String returnedData = new String( returnedBody.getBlob().array(), "UTF-8");
+
+        assertEquals(data, returnedData);
+    }
+
+
+    @Test
+    public void loadMessageObjectData() throws Exception {
+
+        QueueMessageSerialization queueMessageSerialization =
+            getInjector().getInstance( QueueMessageSerialization.class );
+
+        Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
+
+        UUID messageId = QakkaUtils.getTimeUuid();
+
+        final String data = "my test data";
+
+        final DatabaseQueueMessageBody messageBody = new DatabaseQueueMessageBody( DataType.serializeValue(data,
+            ProtocolVersion.NEWEST_SUPPORTED), "text/plain");
+
+        queueMessageSerialization.writeMessageData(messageId, messageBody);
+
+        final DatabaseQueueMessageBody returnedBody = queueMessageSerialization.loadMessageData( messageId );
+        String returnedData = new String( returnedBody.getBlob().array(), "UTF-8");
+
+        assertEquals(data, returnedData);
+    }
+
+
+
+
+    @Test
+    public void deleteMessageData() throws UnsupportedEncodingException {
+
+        QueueMessageSerialization queueMessageSerialization =
+                getInjector().getInstance( QueueMessageSerialization.class );
+
+        Shard shard1 = new Shard("test", "region1", Shard.Type.DEFAULT, 100L, null);
+
+        UUID messageId = QakkaUtils.getTimeUuid();
+
+        final String data = "my test data";
+
+        final DatabaseQueueMessageBody messageBody = new DatabaseQueueMessageBody( DataType.serializeValue(data,
+                ProtocolVersion.NEWEST_SUPPORTED), "text/plain");
+
+        queueMessageSerialization.writeMessageData(messageId, messageBody);
+
+        final DatabaseQueueMessageBody returnedBody = queueMessageSerialization.loadMessageData( messageId );
+        final String returnedData = new String( returnedBody.getBlob().array(), "UTF-8");
+
+        assertEquals(data, returnedData);
+
+        queueMessageSerialization.deleteMessageData(messageId);
+
+        assertNull(queueMessageSerialization.loadMessageData( messageId ));
+
+
+    }
+
+
+    /**
+     * Persist to blob using Java serialization.
+     */
+    @Test
+    public void persistJavaObjectData() throws Exception {
+
+        QueueMessageSerialization queueMessageSerialization =
+            getInjector().getInstance( QueueMessageSerialization.class );
+
+        // serialize Java object to byte buffer
+
+        final ThingToSave data = new ThingToSave();
+        data.value = "my test data";
+
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(bos);
+        oos.writeObject(data);
+        oos.flush();
+        oos.close();
+        ByteBuffer byteBuffer = ByteBuffer.wrap( bos.toByteArray() );
+
+        // write to Cassandra
+
+        final DatabaseQueueMessageBody messageBody = new DatabaseQueueMessageBody(
+            byteBuffer,"application/octet-stream");
+
+        UUID messageId = QakkaUtils.getTimeUuid();
+        queueMessageSerialization.writeMessageData(messageId, messageBody);
+
+        // load from Cassandra
+
+        final DatabaseQueueMessageBody returnedBody = queueMessageSerialization.loadMessageData( messageId );
+
+        // deserialize byte buffer
+
+        ByteBuffer messageData = returnedBody.getBlob();
+        ByteArrayInputStream bais = new ByteArrayInputStream( messageData.array() );
+
+        // throws exception -> java.io.StreamCorruptedException: invalid stream header: 00000000
+        ObjectInputStream ios = new ObjectInputStream( bais );
+        ThingToSave returnedData = (ThingToSave)ios.readObject();
+
+        assertEquals( data.value, returnedData.value );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueueSerializationTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueueSerializationTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueueSerializationTest.java
new file mode 100644
index 0000000..4690a1a
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueueSerializationTest.java
@@ -0,0 +1,85 @@
+/*
+ * 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.qakka.serialization.queues;
+
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+/**
+ * Created by russo on 6/9/16.
+ */
+public class DatabaseQueueSerializationTest extends AbstractTest {
+
+    @Test
+    public void writeQueue(){
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+        QueueSerialization queueSerialization = getInjector().getInstance( QueueSerialization.class );
+
+        DatabaseQueue queue = new DatabaseQueue("test", "west", "west", 0L, 0, 0, "test_dlq");
+
+        queueSerialization.writeQueue(queue);
+
+    }
+
+    @Test
+    public void loadQueue(){
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+        QueueSerialization queueSerialization = getInjector().getInstance( QueueSerialization.class );
+        
+        DatabaseQueue queue = new DatabaseQueue("test1", "west", "west", 0L, 0, 0, "test_dlq");
+
+        queueSerialization.writeQueue(queue);
+        DatabaseQueue returnedQueue = queueSerialization.getQueue("test1");
+
+        assertEquals(queue, returnedQueue);
+
+    }
+
+    @Test
+    public void deleteQueue(){
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+        QueueSerialization queueSerialization = getInjector().getInstance( QueueSerialization.class );
+        
+        DatabaseQueue queue = new DatabaseQueue("test1", "west", "west", 0L, 0, 0, "test_dlq");
+
+        queueSerialization.writeQueue(queue);
+        DatabaseQueue returnedQueue = queueSerialization.getQueue("test1");
+
+        assertEquals(queue, returnedQueue);
+
+        queueSerialization.deleteQueue(queue.getName());
+
+        assertNull(queueSerialization.getQueue("test1"));
+
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardCounterSerializationTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardCounterSerializationTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardCounterSerializationTest.java
new file mode 100644
index 0000000..3152025
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardCounterSerializationTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.qakka.serialization.sharding;
+
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.AbstractTest;
+import org.apache.usergrid.persistence.qakka.exceptions.NotFoundException;
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.junit.Assert.fail;
+
+
+public class ShardCounterSerializationTest extends AbstractTest {
+
+    
+    @Test
+    public void testBasicOperation() throws Exception {
+
+        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        cassandraClient.getSession();
+
+
+        ShardCounterSerialization scs = getInjector().getInstance( ShardCounterSerialization.class ); 
+       
+        String queueName = "scst_queue_" + RandomStringUtils.randomAlphanumeric( 20 );
+        long shardId = 100L;
+       
+        try {
+            scs.getCounterValue( queueName, Shard.Type.DEFAULT, shardId );
+            fail("Should have throw NotFoundException");
+        } catch ( NotFoundException expected ) {
+            // pass 
+        }
+
+        scs.incrementCounter( queueName, Shard.Type.DEFAULT, shardId, 10 );
+        Assert.assertEquals( 10, scs.getCounterValue( queueName, Shard.Type.DEFAULT, shardId ) );
+        
+        scs.incrementCounter( queueName, Shard.Type.DEFAULT, shardId, 50 );
+        Assert.assertEquals( 60, scs.getCounterValue( queueName, Shard.Type.DEFAULT, shardId ) );
+        
+        scs.incrementCounter( queueName, Shard.Type.DEFAULT, shardId, 150 );
+        Assert.assertEquals( 210, scs.getCounterValue( queueName, Shard.Type.DEFAULT, shardId ) );
+    }
+
+}
\ No newline at end of file


[13/25] usergrid git commit: Initial integration of Qakka into Usergrid Queue module, and implementation of Qakka-based LegacyQueueManager implementation.

Posted by sn...@apache.org.
Initial integration of Qakka into Usergrid Queue module, and implementation of Qakka-based LegacyQueueManager implementation.


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

Branch: refs/heads/usergrid-1318-queue
Commit: 3075dce1631cc7f225ddb34aa08fb16a4a8f486a
Parents: 9016fd2
Author: Dave Johnson <sn...@apache.org>
Authored: Tue Sep 13 13:44:42 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Tue Sep 13 13:44:42 2016 -0400

----------------------------------------------------------------------
 stack/core/pom.xml                              |   2 +-
 .../usergrid/persistence/entities/Receipt.java  |  33 +-
 .../usergrid/corepersistence/index/RxTest.java  |  23 +-
 stack/corepersistence/queryindex/pom.xml        |   1 +
 .../persistence/index/guice/IndexModule.java    |   1 -
 stack/corepersistence/queue/pom.xml             | 156 +++++++
 .../apache/usergrid/persistence/qakka/App.java  |  94 ++++
 .../persistence/qakka/MetricsService.java       |  39 ++
 .../usergrid/persistence/qakka/QakkaFig.java    | 131 ++++++
 .../usergrid/persistence/qakka/QakkaModule.java | 120 +++++
 .../persistence/qakka/api/ApiResponse.java      |  68 +++
 .../persistence/qakka/api/QueueResource.java    | 443 +++++++++++++++++++
 .../persistence/qakka/api/StatusResource.java   |  82 ++++
 .../persistence/qakka/api/URIStrategy.java      |  31 ++
 .../qakka/api/impl/BadRequestMapper.java        |  43 ++
 .../qakka/api/impl/GuiceFeature.java            |  45 ++
 .../qakka/api/impl/JacksonProvider.java         |  44 ++
 .../qakka/api/impl/JerseyResourceConfig.java    |  31 ++
 .../qakka/api/impl/NotFoundMapper.java          |  43 ++
 .../qakka/api/impl/StartupListener.java         |  70 +++
 .../qakka/api/impl/URIStrategyLocalhost.java    |  49 ++
 .../persistence/qakka/core/CassandraClient.java |  29 ++
 .../qakka/core/CassandraClientImpl.java         |  49 ++
 .../persistence/qakka/core/QakkaUtils.java      |  44 ++
 .../usergrid/persistence/qakka/core/Queue.java  | 147 ++++++
 .../persistence/qakka/core/QueueManager.java    |  35 ++
 .../persistence/qakka/core/QueueMessage.java    | 186 ++++++++
 .../qakka/core/QueueMessageManager.java         |  83 ++++
 .../persistence/qakka/core/QueueType.java       |  26 ++
 .../persistence/qakka/core/Regions.java         |  84 ++++
 .../qakka/core/impl/InMemoryQueue.java          |  84 ++++
 .../qakka/core/impl/QueueManagerImpl.java       | 125 ++++++
 .../core/impl/QueueMessageManagerImpl.java      | 299 +++++++++++++
 .../distributed/DistributedQueueService.java    |  60 +++
 .../qakka/distributed/actors/QueueActor.java    | 207 +++++++++
 .../distributed/actors/QueueActorHelper.java    | 167 +++++++
 .../distributed/actors/QueueActorRouter.java    |  95 ++++
 .../distributed/actors/QueueRefresher.java      | 124 ++++++
 .../qakka/distributed/actors/QueueSender.java   | 220 +++++++++
 .../distributed/actors/QueueSenderRouter.java   |  53 +++
 .../distributed/actors/QueueTimeouter.java      | 147 ++++++
 .../qakka/distributed/actors/QueueWriter.java   | 152 +++++++
 .../distributed/actors/QueueWriterRouter.java   |  53 +++
 .../distributed/actors/ShardAllocator.java      | 153 +++++++
 .../impl/DistributedQueueServiceImpl.java       | 296 +++++++++++++
 .../impl/QueueActorRouterProducer.java          | 141 ++++++
 .../impl/QueueSenderRouterProducer.java         | 134 ++++++
 .../impl/QueueWriterRouterProducer.java         | 134 ++++++
 .../distributed/messages/QakkaMessage.java      |  28 ++
 .../distributed/messages/QueueAckRequest.java   |  52 +++
 .../distributed/messages/QueueAckResponse.java  |  59 +++
 .../distributed/messages/QueueGetRequest.java   |  49 ++
 .../distributed/messages/QueueGetResponse.java  |  63 +++
 .../distributed/messages/QueueInitRequest.java  |  43 ++
 .../messages/QueueRefreshRequest.java           |  43 ++
 .../distributed/messages/QueueSendRequest.java  |  84 ++++
 .../distributed/messages/QueueSendResponse.java |  43 ++
 .../messages/QueueTimeoutRequest.java           |  43 ++
 .../distributed/messages/QueueWriteRequest.java |  84 ++++
 .../messages/QueueWriteResponse.java            |  43 ++
 .../distributed/messages/ShardCheckRequest.java |  43 ++
 .../qakka/exceptions/BadRequestException.java   |  32 ++
 .../qakka/exceptions/NotFoundException.java     |  32 ++
 .../qakka/exceptions/QakkaException.java        |  32 ++
 .../qakka/exceptions/QakkaRuntimeException.java |  32 ++
 .../MultiShardMessageIterator.java              | 181 ++++++++
 .../persistence/qakka/serialization/Result.java |  34 ++
 .../qakka/serialization/auditlog/AuditLog.java  | 101 +++++
 .../auditlog/AuditLogSerialization.java         |  45 ++
 .../impl/AuditLogSerializationImpl.java         | 148 +++++++
 .../queuemessages/DatabaseQueueMessage.java     | 155 +++++++
 .../queuemessages/DatabaseQueueMessageBody.java |  52 +++
 .../MessageCounterSerialization.java            |  31 ++
 .../QueueMessageSerialization.java              |  54 +++
 .../impl/MessageCounterSerializationImpl.java   | 204 +++++++++
 .../impl/QueueMessageSerializationImpl.java     | 320 ++++++++++++++
 .../serialization/queues/DatabaseQueue.java     | 114 +++++
 .../queues/QueueSerialization.java              |  36 ++
 .../queues/impl/QueueSerializationImpl.java     | 157 +++++++
 .../qakka/serialization/sharding/Shard.java     | 111 +++++
 .../sharding/ShardCounterSerialization.java     |  29 ++
 .../serialization/sharding/ShardIterator.java   | 142 ++++++
 .../sharding/ShardSerialization.java            |  35 ++
 .../serialization/sharding/ShardStrategy.java   |  35 ++
 .../sharding/impl/PlaceholderShardStrategy.java |  44 ++
 .../impl/ShardCounterSerializationImpl.java     | 198 +++++++++
 .../sharding/impl/ShardSerializationImpl.java   | 200 +++++++++
 .../sharding/impl/ShardStrategyImpl.java        |  71 +++
 .../serialization/transferlog/TransferLog.java  |  84 ++++
 .../transferlog/TransferLogSerialization.java   |  62 +++
 .../impl/TransferLogSerializationImpl.java      | 165 +++++++
 .../persistence/queue/guice/QueueModule.java    |  20 +-
 .../queue/impl/QakkaQueueManager.java           | 178 ++++++++
 .../queue/impl/QueueManagerFactoryImpl.java     |   4 +-
 .../queue/src/main/webapp/WEB-INF/web.xml       |  51 +++
 .../persistence/qakka/AbstractTest.java         |  79 ++++
 .../persistence/qakka/KeyspaceDropper.java      |  70 +++
 .../persistence/qakka/api/AbstractRestTest.java |  64 +++
 .../persistence/qakka/api/PerformanceTest.java  | 148 +++++++
 .../qakka/api/QueueResourceTest.java            | 418 +++++++++++++++++
 .../qakka/common/CassandraClientTest.java       |  46 ++
 .../qakka/core/QueueMessageManagerTest.java     | 272 ++++++++++++
 .../distributed/QueueActorServiceTest.java      | 175 ++++++++
 .../actors/QueueActorHelperTest.java            | 284 ++++++++++++
 .../distributed/actors/QueueReaderTest.java     | 111 +++++
 .../distributed/actors/QueueTimeouterTest.java  | 152 +++++++
 .../distributed/actors/ShardAllocatorTest.java  | 212 +++++++++
 ...tiShardDatabaseQueueMessageIteratorTest.java | 127 ++++++
 .../auditlogs/AuditLogSerializationTest.java    | 102 +++++
 .../DatabaseQueueMessageSerializationTest.java  | 267 +++++++++++
 .../queues/DatabaseQueueSerializationTest.java  |  85 ++++
 .../sharding/ShardCounterSerializationTest.java |  65 +++
 .../sharding/ShardIteratorTest.java             | 139 ++++++
 .../sharding/ShardSerializationTest.java        | 106 +++++
 .../sharding/ShardStrategyTest.java             |  71 +++
 .../qakka/serialization/sharding/ShardTest.java |  53 +++
 .../TransferLogSerializationTest.java           | 133 ++++++
 .../queue/LegacyQueueManagerTest.java           | 117 +++--
 .../queue/guice/TestQueueModule.java            |   2 -
 .../queue/src/test/resources/cassandra.yaml     |  53 +++
 .../queue/src/test/resources/log4j.properties   |  29 ++
 .../queue/src/test/resources/qakka-duck.jpg     | Bin 0 -> 11188 bytes
 .../queue/src/test/resources/qakka.properties   |  50 +++
 stack/pom.xml                                   |   6 +-
 .../notifications/apns/APNsAdapter.java         |  28 +-
 .../services/notifications/gcm/GCMAdapter.java  |  11 +-
 126 files changed, 12116 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/core/pom.xml
----------------------------------------------------------------------
diff --git a/stack/core/pom.xml b/stack/core/pom.xml
index 9f2dc88..7ee3b06 100644
--- a/stack/core/pom.xml
+++ b/stack/core/pom.xml
@@ -40,7 +40,6 @@
         </plugins>
     </reporting>
 
-
     <build>
 
         <resources>
@@ -429,6 +428,7 @@
             <groupId>org.apache.usergrid</groupId>
             <artifactId>queue</artifactId>
             <version>${project.version}</version>
+            <classifier>classes</classifier>
             <type>jar</type>
         </dependency>
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/core/src/main/java/org/apache/usergrid/persistence/entities/Receipt.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/entities/Receipt.java b/stack/core/src/main/java/org/apache/usergrid/persistence/entities/Receipt.java
index 1e145ac..e7c90b5 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/entities/Receipt.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/entities/Receipt.java
@@ -16,14 +16,15 @@
  */
 package org.apache.usergrid.persistence.entities;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import org.apache.usergrid.persistence.TypedEntity;
+import org.apache.usergrid.persistence.annotations.EntityProperty;
 
 import javax.xml.bind.annotation.XmlRootElement;
 import java.util.HashMap;
 import java.util.UUID;
-import org.apache.usergrid.persistence.annotations.EntityProperty;
-import org.mortbay.util.ajax.JSON;
 
 @XmlRootElement
 public class Receipt extends TypedEntity {
@@ -31,6 +32,11 @@ public class Receipt extends TypedEntity {
     public static final String ENTITY_TYPE = "receipt";
     public static final String NOTIFICATION_CONNECTION = "notification";
 
+    private static ObjectMapper objectMapper = new ObjectMapper();
+    static private final TypeReference<HashMap> hashMapTypeRef = new TypeReference<HashMap>() {};
+
+
+
     /** device id **/
     @EntityProperty
     protected UUID deviceId;
@@ -65,27 +71,28 @@ public class Receipt extends TypedEntity {
     public Receipt() {
     }
 
-    public Receipt(UUID notificationUUID, String notifierId, Object payload,UUID deviceId) {
+    public Receipt(UUID notificationUUID, String notifierId, Object payload, UUID deviceId) {
         this.notificationUUID = notificationUUID;
         this.notifierId = notifierId;
         HashMap receiptPayload;
-        if(! (payload instanceof HashMap) ){
-            if(payload instanceof String){
+
+        if (!(payload instanceof HashMap)) {
+            if (payload instanceof String) {
                 try {
-                    receiptPayload = (HashMap) JSON.parse((String) payload);
-                }catch (Exception e){
+                    receiptPayload = (HashMap) objectMapper.readValue( (String)payload, hashMapTypeRef );
+                } catch (Exception e) {
                     receiptPayload = new HashMap<>();
-                    receiptPayload.put("payload", payload);
+                    receiptPayload.put( "payload", payload );
                 }
-            }else {
+            } else {
                 receiptPayload = new HashMap<>();
-                receiptPayload.put("payload", payload);
+                receiptPayload.put( "payload", payload );
             }
-        }else{
-            receiptPayload = (HashMap)payload;
+        } else {
+            receiptPayload = (HashMap) payload;
         }
         this.payload = receiptPayload;
-        this.setDeviceId(deviceId);
+        this.setDeviceId( deviceId );
     }
 
     @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/RxTest.java
----------------------------------------------------------------------
diff --git a/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/RxTest.java b/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/RxTest.java
index f7d52d6..d4fd33d 100644
--- a/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/RxTest.java
+++ b/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/RxTest.java
@@ -20,18 +20,8 @@
 package org.apache.usergrid.corepersistence.index;
 
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import org.apache.avro.generic.GenericData;
 import org.apache.usergrid.ExperimentalTest;
-import org.junit.Ignore;
 import org.junit.Test;
-
 import org.junit.experimental.categories.Category;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,6 +30,13 @@ import rx.Subscription;
 import rx.observables.ConnectableObservable;
 import rx.schedulers.Schedulers;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -61,8 +58,10 @@ public class RxTest {
         final CountDownLatch latch = new CountDownLatch( count+1 );
 
         final Subscription connectedObservable =
-            Observable.range( 0, count ).doOnNext( integer -> latch.countDown() ).doOnCompleted( () -> latch.countDown() ).subscribeOn( Schedulers.io() )
-                      .subscribe();
+            Observable.range( 0, count )
+                .doOnNext( integer -> latch.countDown() )
+                .doOnCompleted( () -> latch.countDown() ).subscribeOn( Schedulers.io() )
+                .subscribe();
 
 
         final boolean completed = latch.await( 3, TimeUnit.SECONDS );

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queryindex/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/pom.xml b/stack/corepersistence/queryindex/pom.xml
index 9b4eca4..a3f293d 100644
--- a/stack/corepersistence/queryindex/pom.xml
+++ b/stack/corepersistence/queryindex/pom.xml
@@ -97,6 +97,7 @@
                   <groupId>${project.parent.groupId}</groupId>
                   <artifactId>queue</artifactId>
                   <version>${project.version}</version>
+                    <classifier>classes</classifier>
                   <type>jar</type>
               </dependency>
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/guice/IndexModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/guice/IndexModule.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/guice/IndexModule.java
index b828934..47399c7 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/guice/IndexModule.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/guice/IndexModule.java
@@ -23,7 +23,6 @@ import com.google.inject.TypeLiteral;
 import com.google.inject.multibindings.Multibinder;
 import org.apache.usergrid.persistence.core.migration.data.DataMigration;
 import org.apache.usergrid.persistence.core.migration.data.MigrationPlugin;
-import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.index.*;
 import com.google.inject.AbstractModule;
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/pom.xml b/stack/corepersistence/queue/pom.xml
index c81e71c..c74d49c 100644
--- a/stack/corepersistence/queue/pom.xml
+++ b/stack/corepersistence/queue/pom.xml
@@ -21,6 +21,7 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
     <parent>
         <artifactId>persistence</artifactId>
         <groupId>org.apache.usergrid</groupId>
@@ -30,6 +31,48 @@
     <modelVersion>4.0.0</modelVersion>
     <artifactId>queue</artifactId>
     <name>Usergrid Queue</name>
+    <packaging>war</packaging>
+
+    <properties>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <servlet.version>3.0.1</servlet.version>
+        <jersey.version>2.23.1</jersey.version>
+        <guice-bridge.version>2.4.0</guice-bridge.version>
+    </properties>
+
+
+    <build>
+
+        <finalName>queue-${project.version}</finalName>
+
+        <pluginManagement>
+            <plugins>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>2.6</version>
+                <configuration>
+                    <archiveClasses>true</archiveClasses>
+                    <attachClasses>true</attachClasses>
+                </configuration>
+            </plugin>
+
+            </plugins>
+        </pluginManagement>
+
+        <testResources>
+            <testResource>
+                <directory>src/test/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/**</include>
+                </includes>
+            </testResource>
+        </testResources>
+
+    </build>
 
     <dependencies>
 
@@ -90,6 +133,119 @@
             <version>4.2</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>actorsystem</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>common</artifactId>
+            <version>${project.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>cassandra-all</artifactId>
+                    <groupId>org.apache.cassandra</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!--
+                <dependency>
+                    <groupId>com.datastax.cassandra</groupId>
+                    <artifactId>cassandra-driver-core</artifactId>
+                    <version>2.1.9</version>
+                    <exclusions>
+                        <exclusion>
+                            <groupId>com.google.guava</groupId>
+                            <artifactId>guava</artifactId>
+                        </exclusion>
+                    </exclusions>
+                </dependency>
+
+                <dependency>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
+                    <version>1.7.13</version>
+                </dependency>
+
+                <dependency>
+                    <groupId>com.fasterxml.uuid</groupId>
+                    <artifactId>java-uuid-generator</artifactId>
+                    <version>3.1.4</version>
+                </dependency>
+
+                <dependency>
+                    <groupId>org.apache.commons</groupId>
+                    <artifactId>commons-lang3</artifactId>
+                    <version>3.3.2</version>
+                </dependency>
+        -->
+
+        <!-- Java EE & Jersey -->
+
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <version>${servlet.version}</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.glassfish.jersey.media</groupId>
+            <artifactId>jersey-media-json-jackson</artifactId>
+            <version>${jersey.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.glassfish.jersey.core</groupId>
+            <artifactId>jersey-client</artifactId>
+            <version>${jersey.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.glassfish.jersey.containers</groupId>
+            <artifactId>jersey-container-servlet</artifactId>
+            <version>${jersey.version}</version>
+        </dependency>
+
+        <!-- added for Guice Jersey integration -->
+        <dependency>
+            <groupId>org.glassfish.hk2</groupId>
+            <artifactId>guice-bridge</artifactId>
+            <version>${guice-bridge.version}</version>
+        </dependency>
+
+        <!-- added for Guice Jersey integration -->
+        <dependency>
+            <groupId>com.google.inject.extensions</groupId>
+            <artifactId>guice-servlet</artifactId>
+            <version>${guice.version}</version>
+        </dependency>
+
+        <!-- added to enable logging from within Jersey -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jul-to-slf4j</artifactId>
+            <version>1.7.5</version>
+        </dependency>
+
+        <!-- Testing -->
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
+            <artifactId>jersey-test-framework-provider-jetty</artifactId>
+            <version>${jersey.version}</version>
+        </dependency>
+
     </dependencies>
 
     <!--

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/App.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/App.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/App.java
new file mode 100644
index 0000000..9d9c972
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/App.java
@@ -0,0 +1,94 @@
+/*
+ * 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.qakka;
+
+import com.codahale.metrics.MetricRegistry;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemManager;
+import org.apache.usergrid.persistence.core.migration.schema.MigrationException;
+import org.apache.usergrid.persistence.core.migration.schema.MigrationManager;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaRuntimeException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Akka queueing application
+ */
+public class App implements MetricsService {
+    private static final Logger logger = LoggerFactory.getLogger( App.class );
+
+    // TODO: can we avoid this kludge with better Akka-Guice integration?
+    static public Injector INJECTOR;
+
+    private final ActorSystemFig          actorSystemFig;
+    private final ActorSystemManager      actorSystemManager;
+    private final DistributedQueueService distributedQueueService;
+    private final MetricRegistry          metrics = new MetricRegistry();
+
+
+    @Inject
+    public App(
+            Injector                  injector,
+            ActorSystemFig            actorSystemFig,
+            ActorSystemManager        actorSystemManager,
+            DistributedQueueService   distributedQueueService,
+            MigrationManager          migrationManager) {
+
+        this.INJECTOR = injector;
+        this.actorSystemFig = actorSystemFig;
+        this.actorSystemManager = actorSystemManager;
+        this.distributedQueueService = distributedQueueService;
+
+        try {
+            migrationManager.migrate();
+        } catch (MigrationException e) {
+            throw new QakkaRuntimeException( "Error running migration", e );
+        }
+    }
+
+    /**
+     * Init Akka ActorSystems and wait for request actors to init.
+     */
+    public void start() {
+        start(
+            actorSystemFig.getHostname(),
+            Integer.parseInt(actorSystemFig.getPort()), // TODO: make port an int in Actor System module
+            actorSystemFig.getRegionLocal());
+    }
+
+    /**
+     * For testing purposes only; does not wait for request actors to init.
+     */
+    public void start( String h, Integer p, String r ) {
+        actorSystemManager.start( h, p, r );
+        actorSystemManager.waitForClientActor();
+        distributedQueueService.init();
+    }
+
+
+    @Override
+    public MetricRegistry getMetricRegistry() {
+        return metrics;
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/MetricsService.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/MetricsService.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/MetricsService.java
new file mode 100644
index 0000000..378ba0d
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/MetricsService.java
@@ -0,0 +1,39 @@
+/*
+ * 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.qakka;
+
+import com.codahale.metrics.MetricRegistry;
+
+
+public interface MetricsService {
+
+    String SEND_TIME_TOTAL  = "org.apache.usergrid.persistence.qakka.send.time.total";
+    String SEND_TIME_SEND   = "org.apache.usergrid.persistence.qakka.send.time.send";
+    String SEND_TIME_WRITE  = "org.apache.usergrid.persistence.qakka.send.time.write";
+    String GET_TIME_TOTAL   = "org.apache.usergrid.persistence.qakka.get.time.total";
+    String GET_TIME_GET     = "org.apache.usergrid.persistence.qakka.get.time.get";
+    String ACK_TIME_TOTAL   = "org.apache.usergrid.persistence.qakka.ack.time.total";
+    String ACK_TIME_ACK     = "org.apache.usergrid.persistence.qakka.ack.time.ack";
+    String TIMEOUT_TIME     = "org.apache.usergrid.persistence.qakka.timeout.time";
+    String REFRESH_TIME     = "org.apache.usergrid.persistence.qakka.timeout.time";
+    String ALLOCATE_TIME    = "org.apache.usergrid.persistence.qakka.allocate.time";
+
+    MetricRegistry getMetricRegistry();
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaFig.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaFig.java
new file mode 100644
index 0000000..6f3df11
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaFig.java
@@ -0,0 +1,131 @@
+/*
+ * 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.qakka;
+
+import org.safehaus.guicyfig.Default;
+import org.safehaus.guicyfig.FigSingleton;
+import org.safehaus.guicyfig.GuicyFig;
+import org.safehaus.guicyfig.Key;
+
+import java.io.Serializable;
+
+
+@FigSingleton
+public interface QakkaFig extends GuicyFig, Serializable {
+
+    String QUEUE_NUM_ACTORS                       = "queue.num.actors";
+
+    String QUEUE_SENDER_NUM_ACTORS                = "queue.sender.num.actors";
+
+    String QUEUE_WRITER_NUM_ACTORS                = "queue.writer.num.actors";
+
+    String QUEUE_TIMEOUT_SECONDS                  = "queue.timeout.seconds";
+
+    String QUEUE_REFRESH_MILLISECONDS             = "queue.refresh.milliseconds";
+
+    String QUEUE_INMEMORY_SIZE                    = "queue.inmemory.size";
+
+    String QUEUE_SEND_MAX_RETRIES                 = "queue.send.max.retries";
+
+    String QUEUE_SEND_TIMEOUT                     = "queue.send.timeout.seconds";
+
+    String QUEUE_GET_MAX_RETRIES                  = "queue.get.max.retries";
+
+    String QUEUE_GET_TIMEOUT                      = "queue.get.timeout.seconds";
+
+    String QUEUE_MAX_SHARD_COUNTER                = "queue.max.inmemory.shard.counter";
+
+    String QUEUE_SHARD_ALLOCATION_CHECK_FREQUENCY = "queue.shard.allocation.check.frequency.millis";
+
+    String QUEUE_SHARD_ALLOCATION_ADVANCE_TIME    = "queue.shard.allocation.advance.time.millis";
+
+    String QUEUE_SHARD_MAX_SIZE                   = "queue.shard.max.size";
+
+
+    /** Queue senders send to queue writers */
+    @Key(QUEUE_SENDER_NUM_ACTORS)
+    @Default("200")
+    int getNumQueueSenderActors();
+
+    /** Queue writers write to Cassandra */
+    @Key(QUEUE_WRITER_NUM_ACTORS)
+    @Default("500")
+    int getNumQueueWriterActors();
+
+    /** Queue actors handle get, ack and manage scheduled timeout and refersh tasks */
+    @Key(QUEUE_NUM_ACTORS)
+    @Default("500")
+    int getNumQueueActors();
+
+    /** Time for queue messages to timeout, if not set per queue */
+    @Key(QUEUE_TIMEOUT_SECONDS)
+    @Default("10")
+    int getQueueTimeoutSeconds();
+
+    /** How often to refresh each queue's in-memory data */
+    @Key(QUEUE_REFRESH_MILLISECONDS)
+    @Default("500")
+    int getQueueRefreshMilliseconds();
+
+    /** How many queue messages to keep in-memory */
+    @Key(QUEUE_INMEMORY_SIZE)
+    @Default("1000")
+    int getQueueInMemorySize();
+
+    /** Max number of times to retry call to queue actor for queue get operation */
+    @Key(QUEUE_GET_MAX_RETRIES)
+    @Default("5")
+    int getMaxGetRetries();
+
+    /** How long to wait for response from queue actor before timing out and trying again */
+    @Key(QUEUE_GET_TIMEOUT)
+    @Default("2")
+    int getGetTimeoutSeconds();
+
+    /** Max number of times to retry call to queue writer for queue send operation */
+    @Key(QUEUE_SEND_MAX_RETRIES)
+    @Default("5")
+    int getMaxSendRetries();
+
+    /** How long to wait for response from queue writer before timing out and trying again */
+    @Key(QUEUE_SEND_TIMEOUT)
+    @Default("2")
+    int getSendTimeoutSeconds();
+
+    /** Once counter reaches this value, write it to permanent storage */
+    @Key(QUEUE_MAX_SHARD_COUNTER)
+    @Default("100")
+    long getMaxInMemoryShardCounter();
+
+    /** How often to check whether new shard is needed for each queue */
+    @Key(QUEUE_SHARD_ALLOCATION_CHECK_FREQUENCY)
+    @Default("5000")
+    long getShardAllocationCheckFrequencyMillis();
+
+    /** New shards are created in advance of the time they will be used */
+    @Key(QUEUE_SHARD_ALLOCATION_ADVANCE_TIME)
+    @Default("5000")
+    long getShardAllocationAdvanceTimeMillis();
+
+    /** Max size to allow for a shard */
+    @Key(QUEUE_SHARD_MAX_SIZE)
+    @Default("400000")
+    long getMaxShardSize();
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
new file mode 100644
index 0000000..b7c977c
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
@@ -0,0 +1,120 @@
+/*
+ * 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.qakka;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Key;
+import com.google.inject.multibindings.Multibinder;
+import com.netflix.config.ConfigurationManager;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemModule;
+import org.apache.usergrid.persistence.core.guice.CommonModule;
+import org.apache.usergrid.persistence.core.migration.schema.Migration;
+import org.apache.usergrid.persistence.qakka.api.URIStrategy;
+import org.apache.usergrid.persistence.qakka.api.impl.URIStrategyLocalhost;
+import org.apache.usergrid.persistence.qakka.core.*;
+import org.apache.usergrid.persistence.qakka.core.impl.QueueManagerImpl;
+import org.apache.usergrid.persistence.qakka.core.impl.QueueMessageManagerImpl;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.apache.usergrid.persistence.qakka.distributed.actors.QueueActorHelper;
+import org.apache.usergrid.persistence.qakka.distributed.impl.DistributedQueueServiceImpl;
+import org.apache.usergrid.persistence.qakka.distributed.impl.QueueActorRouterProducer;
+import org.apache.usergrid.persistence.qakka.distributed.impl.QueueSenderRouterProducer;
+import org.apache.usergrid.persistence.qakka.distributed.impl.QueueWriterRouterProducer;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLogSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.impl.AuditLogSerializationImpl;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.impl.QueueMessageSerializationImpl;
+import org.apache.usergrid.persistence.qakka.serialization.queues.QueueSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.queues.impl.QueueSerializationImpl;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardCounterSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardStrategy;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardCounterSerializationImpl;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardSerializationImpl;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardStrategyImpl;
+import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLogSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.transferlog.impl.TransferLogSerializationImpl;
+import org.safehaus.guicyfig.GuicyFigModule;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+
+public class QakkaModule extends AbstractModule {
+    private static final Logger logger = LoggerFactory.getLogger( QakkaModule.class );
+
+    static {
+        try {
+            // TODO: reconcile with usergrid props
+            // load properties from one properties file using Netflix Archaius so that GuicyFig will see them
+            ConfigurationManager.loadCascadedPropertiesFromResources( "qakka" );
+        } catch (IOException e) {
+            throw new RuntimeException( "Cannot qakka.properties file", e );
+        }
+    }
+
+    @Override
+    protected void configure() {
+
+        install( new CommonModule() );
+        install( new ActorSystemModule() );
+        install( new GuicyFigModule( QakkaFig.class ) );
+
+        bind( App.class );
+
+        bind( CassandraClient.class ).to(           CassandraClientImpl.class );
+        bind( MetricsService.class ).to(            App.class );
+
+        bind( QueueManager.class ).to(              QueueManagerImpl.class );
+        bind( QueueSerialization.class ).to(        QueueSerializationImpl.class );
+
+        bind( QueueMessageManager.class ).to(       QueueMessageManagerImpl.class );
+        bind( QueueMessageSerialization.class ).to( QueueMessageSerializationImpl.class );
+
+        bind( ShardSerialization.class ).to(        ShardSerializationImpl.class );
+        bind( ShardStrategy.class ).to(             ShardStrategyImpl.class );
+
+        bind( ShardCounterSerialization.class ).to( ShardCounterSerializationImpl.class );
+
+        bind( TransferLogSerialization.class ).to(  TransferLogSerializationImpl.class );
+        bind( AuditLogSerialization.class ).to(     AuditLogSerializationImpl.class );
+        bind( DistributedQueueService.class ).to(   DistributedQueueServiceImpl.class );
+
+        bind( QueueActorRouterProducer.class );
+        bind( QueueWriterRouterProducer.class );
+        bind( QueueSenderRouterProducer.class );
+        bind( QueueActorHelper.class );
+
+        bind( Regions.class );
+        bind( URIStrategy.class ).to( URIStrategyLocalhost.class );
+
+        Multibinder<Migration> migrationBinder = Multibinder.newSetBinder( binder(), Migration.class );
+
+        migrationBinder.addBinding().to( Key.get( AuditLogSerialization.class ) );
+        //migrationBinder.addBinding().to( Key.get( MessageCounterSerialization.class ) );
+        migrationBinder.addBinding().to( Key.get( QueueMessageSerialization.class ) );
+        migrationBinder.addBinding().to( Key.get( QueueSerialization.class ) );
+        migrationBinder.addBinding().to( Key.get( ShardCounterSerialization.class ) );
+        migrationBinder.addBinding().to( Key.get( ShardSerialization.class ) );
+        migrationBinder.addBinding().to( Key.get( TransferLogSerialization.class ) );
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/ApiResponse.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/ApiResponse.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/ApiResponse.java
new file mode 100644
index 0000000..c2c0910
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/ApiResponse.java
@@ -0,0 +1,68 @@
+/*
+ * 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.qakka.api;
+
+import org.apache.usergrid.persistence.qakka.core.Queue;
+import org.apache.usergrid.persistence.qakka.core.QueueMessage;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.Collection;
+
+
+@XmlRootElement
+public class ApiResponse {
+
+    private String message;
+    private Integer count;
+    private Collection<Queue> queues;
+    private Collection<QueueMessage> queueMessages;
+
+    public Collection<Queue> getQueues() {
+        return queues;
+    }
+
+    public void setQueues(Collection<Queue> queues) {
+        this.queues = queues;
+    }
+
+    public Collection<QueueMessage> getQueueMessages() {
+        return queueMessages;
+    }
+
+    public void setQueueMessages(Collection<QueueMessage> queueMessages) {
+        this.queueMessages = queueMessages;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/QueueResource.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/QueueResource.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/QueueResource.java
new file mode 100644
index 0000000..f82661c
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/QueueResource.java
@@ -0,0 +1,443 @@
+/*
+ * 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.qakka.api;
+
+import com.codahale.metrics.Timer;
+import com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream;
+import com.google.common.base.Preconditions;
+import com.google.common.io.ByteStreams;
+import org.apache.usergrid.persistence.qakka.MetricsService;
+import org.apache.usergrid.persistence.qakka.core.*;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardCounterSerialization;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.inject.Inject;
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.StreamingOutput;
+import java.nio.ByteBuffer;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+
+
+@Path("queues")
+public class QueueResource {
+    private static final Logger logger = LoggerFactory.getLogger( QueueResource.class );
+
+    private final QueueManager queueManager;
+    private final QueueMessageManager queueMessageManager;
+    private final MetricsService            metricsService;
+    private final URIStrategy               uriStrategy;
+    private final Regions regions;
+    private final ShardCounterSerialization shardCounterSerialization;
+
+
+    @Inject
+    public QueueResource(
+            QueueManager              queueManager,
+            QueueMessageManager       queueMessageManager,
+            MetricsService            metricsService,
+            URIStrategy               uriStrategy,
+            Regions                   regions,
+            ShardCounterSerialization shardCounterSerialization ) {
+
+        this.queueManager              = queueManager;
+        this.queueMessageManager       = queueMessageManager;
+        this.metricsService            = metricsService;
+        this.uriStrategy               = uriStrategy;
+        this.regions                   = regions;
+        this.shardCounterSerialization = shardCounterSerialization;
+    }
+
+
+    @POST
+    @Consumes({MediaType.APPLICATION_JSON})
+    @Produces({MediaType.APPLICATION_JSON})
+    public Response createQueue(Queue queue ) throws Exception {
+
+        Preconditions.checkArgument(queue != null, "Queue configuration is required");
+        Preconditions.checkArgument(!QakkaUtils.isNullOrEmpty(queue.getName()), "Queue name is required");
+
+        queueManager.createQueue(queue);
+
+        ApiResponse apiResponse = new ApiResponse();
+        apiResponse.setQueues( Collections.singletonList(queue) );
+        return Response.created( uriStrategy.queueURI( queue.getName() )).entity(apiResponse).build();
+    }
+
+
+    @PUT
+    @Path( "{queueName}/config" )
+    @Consumes({MediaType.APPLICATION_JSON})
+    @Produces({MediaType.APPLICATION_JSON})
+    public Response updateQueueConfig( @PathParam("queueName") String queueName, Queue queue) {
+
+        Preconditions.checkArgument(!QakkaUtils.isNullOrEmpty(queueName), "Queue name is required");
+        Preconditions.checkArgument(queue != null, "Queue configuration is required");
+
+        queue.setName(queueName);
+        queueManager.updateQueueConfig(queue);
+
+        ApiResponse apiResponse = new ApiResponse();
+        apiResponse.setQueues( Collections.singletonList(queue) );
+        return Response.ok().entity(apiResponse).build();
+    }
+
+
+    @DELETE
+    @Path( "{queueName}" )
+    @Produces({MediaType.APPLICATION_JSON})
+    public Response deleteQueue( @PathParam("queueName") String queueName,
+                                 @QueryParam("confirm") @DefaultValue("false") Boolean confirmedParam) {
+
+        Preconditions.checkArgument(!QakkaUtils.isNullOrEmpty(queueName), "Queue name is required");
+        Preconditions.checkArgument(confirmedParam != null, "Confirm parameter is required");
+
+        ApiResponse apiResponse = new ApiResponse();
+
+        if ( confirmedParam ) {
+            queueManager.deleteQueue( queueName );
+            return Response.ok().entity( apiResponse ).build();
+        }
+
+        apiResponse.setMessage( "confirm parameter must be true" );
+        return Response.status( Response.Status.BAD_REQUEST ).entity( apiResponse ).build();
+    }
+
+
+    @GET
+    @Path( "{queueName}/config" )
+    @Produces({MediaType.APPLICATION_JSON})
+    public Response getQueueConfig( @PathParam("queueName") String queueName) {
+
+        Preconditions.checkArgument(!QakkaUtils.isNullOrEmpty(queueName), "Queue name is required");
+
+        ApiResponse apiResponse = new ApiResponse();
+        Queue queue = queueManager.getQueueConfig( queueName );
+        if ( queue != null ) {
+            apiResponse.setQueues( Collections.singletonList(queue) );
+            return Response.ok().entity(apiResponse).build();
+        }
+        return Response.status( Response.Status.NOT_FOUND ).build();
+    }
+
+
+    @GET
+    @Produces({MediaType.APPLICATION_JSON})
+    public List<String> getListOfQueues() {
+
+        // TODO: create design to handle large number of queues, e.g. paging and/or hierarchy of queues
+
+        // TODO: create design to support multi-tenant usage, authentication, etc.
+
+        return queueManager.getListOfQueues();
+    }
+
+
+    @GET
+    @Path( "{queueName}/stats" )
+    @Produces({MediaType.APPLICATION_JSON})
+    public Response getQueueStats( @PathParam("queueName") String queueName) throws Exception {
+        // TODO: implement GET /queues/{queueName}/stats
+        throw new UnsupportedOperationException();
+    }
+
+
+    Long convertDelayParameter(String delayParam) {
+        Long delayMs = 0L;
+        if (!QakkaUtils.isNullOrEmpty(delayParam)) {
+            switch (delayParam.toUpperCase()) {
+                case "NONE":
+                case "":
+                    delayMs = 0L;
+                    break;
+                default:
+                    try {
+                        delayMs = Long.parseLong(delayParam);
+                    } catch (Exception e) {
+                        throw new IllegalArgumentException("Invalid delay parameter");
+                    }
+                    break;
+            }
+        }
+        return delayMs;
+    }
+
+    Long convertExpirationParameter(String expirationParam) throws IllegalArgumentException {
+        Long expirationSecs = null;
+        if (!QakkaUtils.isNullOrEmpty(expirationParam)) {
+            switch (expirationParam.toUpperCase()) {
+                case "NEVER":
+                case "":
+                    expirationSecs = null;
+                    break;
+                default:
+                    try {
+                        expirationSecs = Long.parseLong(expirationParam);
+                    } catch (Exception e) {
+                        throw new IllegalArgumentException("Invalid expiration parameter");
+                    }
+                    break;
+            }
+        }
+        return expirationSecs;
+    }
+
+
+    /**
+     * Send a queue message with a JSON payload.
+     *
+     * @param queueName         Name of queue to target (queue must exist)
+     * @param regionsParam      Comma-separated list of regions to send to
+     * @param delayParam        Delay (ms) before sending message (not yet supported)
+     * @param expirationParam   Time (ms) after which message will expire (not yet supported)
+     * @param messageBody       JSON payload in string form
+     */
+    @POST
+    @Path( "{queueName}/messages" )
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response sendMessageJson(
+            @PathParam("queueName")                     String queueName,
+            @QueryParam("regions" )   @DefaultValue("") String regionsParam,
+            @QueryParam("delay")      @DefaultValue("") String delayParam,
+            @QueryParam("expiration") @DefaultValue("") String expirationParam,
+                                                        String messageBody) throws Exception {
+
+        return sendMessage( queueName, regionsParam, delayParam, expirationParam,
+                MediaType.APPLICATION_JSON, ByteBuffer.wrap( messageBody.getBytes() ) );
+    }
+
+
+    /**
+     * Send a queue message with a binary data payload.
+     *
+     * @param queueName         Name of queue to target (queue must exist)
+     * @param regionsParam      Comma-separated list of regions to send to
+     * @param delayParam        Delay (ms) before sending message (not yet supported)
+     * @param expirationParam   Time (ms) after which message will expire (not yet supported)
+     * @param actualContentType Content type of messageBody data (if not application/octet-stream)
+     * @param messageBody       Binary data that is the payload of the queue message
+     */
+    @POST
+    @Path( "{queueName}/messages" )
+    @Consumes(MediaType.APPLICATION_OCTET_STREAM)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response sendMessageBinary(
+            @PathParam("queueName")                     String queueName,
+            @QueryParam("regions" )   @DefaultValue("") String regionsParam,
+            @QueryParam("delay")      @DefaultValue("") String delayParam,
+            @QueryParam("expiration") @DefaultValue("") String expirationParam,
+            @QueryParam("contentType")                  String actualContentType,
+                                                        byte[] messageBody) throws Exception {
+
+        String contentType = actualContentType != null ? actualContentType : MediaType.APPLICATION_OCTET_STREAM;
+
+        return sendMessage( queueName, regionsParam, delayParam, expirationParam,
+                contentType, ByteBuffer.wrap( messageBody ) );
+    }
+
+
+    private Response sendMessage( String queueName,
+                                   String regionsParam,
+                                   String delayParam,
+                                   String expirationParam,
+                                   String contentType,
+                                   ByteBuffer byteBuffer) {
+
+        Timer.Context timer = metricsService.getMetricRegistry().timer( MetricsService.SEND_TIME_TOTAL ).time();
+        try {
+
+            Preconditions.checkArgument( !QakkaUtils.isNullOrEmpty( queueName ), "Queue name is required" );
+
+            // if regions, delay or expiration are empty string, would get the defaults from the queue
+            if (regionsParam.equals( "" )) {
+                regionsParam = Regions.LOCAL;
+            }
+
+            Long delayMs = convertDelayParameter( delayParam );
+
+            Long expirationSecs = convertExpirationParameter( expirationParam );
+
+            List<String> regionList = regions.getRegions( regionsParam );
+
+            queueMessageManager.sendMessages( queueName, regionList, delayMs, expirationSecs,
+                    contentType, byteBuffer );
+
+            ApiResponse apiResponse = new ApiResponse();
+            apiResponse.setCount( 1 );
+            return Response.ok().entity( apiResponse ).build();
+
+        } finally {
+            timer.close();
+        }
+    }
+
+
+    @GET
+    @Path( "{queueName}/messages" )
+    @Produces({MediaType.APPLICATION_JSON})
+    public Response getNextMessages( @PathParam("queueName") String queueName,
+                                     @QueryParam("count") @DefaultValue("1") String countParam) throws Exception {
+
+        Timer.Context timer = metricsService.getMetricRegistry().timer( MetricsService.GET_TIME_TOTAL ).time();
+        try {
+
+            Preconditions.checkArgument( !QakkaUtils.isNullOrEmpty( queueName ), "Queue name is required" );
+
+            int count = 1;
+            try {
+                count = Integer.parseInt( countParam );
+            } catch (Exception e) {
+                throw new IllegalArgumentException( "Invalid count parameter" );
+            }
+            if (count <= 0) {
+                // invalid count
+                throw new IllegalArgumentException( "Count must be >= 1" );
+            }
+
+            List<QueueMessage> messages = queueMessageManager.getNextMessages( queueName, count );
+
+            ApiResponse apiResponse = new ApiResponse();
+
+            if (messages != null && !messages.isEmpty()) {
+                apiResponse.setQueueMessages( messages );
+
+            } else { // always return queueMessages field
+                apiResponse.setQueueMessages( Collections.EMPTY_LIST );
+            }
+            apiResponse.setCount( apiResponse.getQueueMessages().size() );
+            return Response.ok().entity( apiResponse ).build();
+
+        } finally {
+            timer.close();
+        }
+    }
+
+
+    @DELETE
+    @Path( "{queueName}/messages/{queueMessageId}" )
+    @Produces({MediaType.APPLICATION_JSON})
+    public Response ackMessage( @PathParam("queueName") String queueName,
+                                @PathParam("queueMessageId") String queueMessageId) throws Exception {
+
+        Timer.Context timer = metricsService.getMetricRegistry().timer( MetricsService.ACK_TIME_TOTAL ).time();
+        try {
+
+            Preconditions.checkArgument( !QakkaUtils.isNullOrEmpty( queueName ), "Queue name is required" );
+
+            UUID messageUuid;
+            try {
+                messageUuid = UUID.fromString( queueMessageId );
+            } catch (Exception e) {
+                throw new IllegalArgumentException( "Invalid queue message UUID" );
+            }
+            queueMessageManager.ackMessage( queueName, messageUuid );
+
+            ApiResponse apiResponse = new ApiResponse();
+            return Response.ok().entity( apiResponse ).build();
+
+        } finally {
+            timer.close();
+        }
+    }
+
+
+    @GET
+    @Path( "{queueName}/data/{queueMessageId}" )
+    public Response getMessageData(
+            @PathParam("queueName") String queueName,
+            @PathParam("queueMessageId") String queueMessageIdParam ) {
+
+        Preconditions.checkArgument(!QakkaUtils.isNullOrEmpty(queueName), "Queue name is required");
+
+        UUID queueMessageId;
+        try {
+            queueMessageId = UUID.fromString(queueMessageIdParam);
+        }
+        catch (Exception e) {
+            throw new IllegalArgumentException("Invalid queue message UUID");
+        }
+
+        QueueMessage message = queueMessageManager.getMessage( queueName, queueMessageId );
+        if ( message == null ) {
+            throw new NotFoundException(
+                    "Message not found for queueName: " + queueName + " queue message id: " + queueMessageId );
+        }
+
+        ByteBuffer messageData = queueMessageManager.getMessageData( message.getMessageId() );
+        if ( messageData == null ) {
+            throw new NotFoundException( "Message data not found queueName: " + queueName
+                    + " queue message id: " + queueMessageId + " message id: " + message.getMessageId() );
+        }
+
+        ByteBufferBackedInputStream input = new ByteBufferBackedInputStream( messageData );
+
+        StreamingOutput stream = output -> {
+            try {
+                ByteStreams.copy(input, output);
+            } catch (Exception e) {
+                throw new WebApplicationException(e);
+            }
+        };
+
+        return Response.ok( stream ).header( "Content-Type", message.getContentType() ).build();
+    }
+
+
+//    @PUT
+//    @Path( "{queueName}/messages/{queueMessageId}" )
+//    @Produces({MediaType.APPLICATION_JSON})
+//    public Response requeueMessage( @PathParam("queueName") String queueName,
+//                                    @PathParam("queueMessageId") String queueMessageIdParam,
+//                                    @QueryParam("delay") @DefaultValue("") String delayParam) throws Exception {
+//
+//        Preconditions.checkArgument(!QakkaUtils.isNullOrEmpty(queueName), "Queue name is required");
+//
+//        UUID queueMessageId;
+//        try {
+//            queueMessageId = UUID.fromString(queueMessageIdParam);
+//        }
+//        catch (Exception e) {
+//            throw new IllegalArgumentException("Invalid message UUID");
+//        }
+//        Long delayMs = convertDelayParameter(delayParam);
+//
+//        queueMessageManager.requeueMessage(queueName, queueMessageId, delayMs);
+//
+//        ApiResponse apiResponse = new ApiResponse();
+//        return Response.ok().entity(apiResponse).build();
+//    }
+//
+//
+//    @DELETE
+//    @Path( "{queueName}/messages" )
+//    @Produces({MediaType.APPLICATION_JSON})
+//    public Response clearMessages( @PathParam("queueName") String queueName,
+//                                   @QueryParam("confirm") @DefaultValue("false") Boolean confirmed) throws Exception {
+//
+//        // TODO: implement DELETE /queues/{queueName}/messages"
+//        throw new UnsupportedOperationException();
+//    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/StatusResource.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/StatusResource.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/StatusResource.java
new file mode 100644
index 0000000..1d1c836
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/StatusResource.java
@@ -0,0 +1,82 @@
+/*
+ * 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.qakka.api;
+
+import com.codahale.metrics.Timer;
+import com.google.inject.servlet.RequestScoped;
+import org.apache.usergrid.persistence.qakka.App;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.inject.Inject;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.text.DecimalFormat;
+import java.util.HashMap;
+import java.util.SortedSet;
+
+
+@Path("status")
+@RequestScoped
+public class StatusResource {
+    private static final Logger logger = LoggerFactory.getLogger( StatusResource.class );
+
+    private App app;
+
+    @Inject
+    public StatusResource( App app ) {
+        this.app = app;
+    }
+
+    @GET
+    @Produces( MediaType.APPLICATION_JSON )
+    public Object status() {
+
+        final DecimalFormat format = new DecimalFormat("##.###");
+        final long nano = 1000000000;
+
+        return new HashMap<String, Object>() {{
+            put( "name", "Qakka" );
+            try {
+                put( "host", InetAddress.getLocalHost().getHostName() );
+            } catch (UnknownHostException e) {
+                put( "host", "unknown" );
+            }
+            SortedSet<String> names = app.getMetricRegistry().getNames();
+            for (String name : names) {
+                Timer t = app.getMetricRegistry().timer( name );
+                put( name, new HashMap<String, Object>() {{
+                    put( "count", ""            + t.getCount() );
+                    put( "mean_rate", ""        + format.format( t.getMeanRate() ) );
+                    put( "one_minute_rate", ""  + format.format( t.getOneMinuteRate() ) );
+                    put( "five_minute_rate", "" + format.format( t.getFiveMinuteRate() ) );
+                    put( "mean", ""             + format.format( t.getSnapshot().getMean() / nano ) );
+                    put( "min", ""              + format.format( (double) t.getSnapshot().getMin() / nano ) );
+                    put( "max", ""              + format.format( (double) t.getSnapshot().getMax() / nano ) );
+                }} );
+            }
+        }};
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/URIStrategy.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/URIStrategy.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/URIStrategy.java
new file mode 100644
index 0000000..2f0b65c
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/URIStrategy.java
@@ -0,0 +1,31 @@
+/*
+ * 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.qakka.api;
+
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.UUID;
+
+public interface URIStrategy {
+
+    URI queueURI(String queueName) throws URISyntaxException;
+
+    URI queueMessageDataURI(String queueName, UUID queueMessageId) throws URISyntaxException;
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/BadRequestMapper.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/BadRequestMapper.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/BadRequestMapper.java
new file mode 100644
index 0000000..88d6394
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/BadRequestMapper.java
@@ -0,0 +1,43 @@
+/*
+ * 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.qakka.api.impl;
+
+import org.apache.usergrid.persistence.qakka.api.ApiResponse;
+import org.apache.usergrid.persistence.qakka.exceptions.BadRequestException;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+
+
+@Provider
+public class BadRequestMapper implements ExceptionMapper<BadRequestException> {
+
+    public Response toResponse( BadRequestException ex ) {
+
+        ApiResponse apiResponse = new ApiResponse();
+        apiResponse.setMessage( ex.getMessage() );
+
+        return Response.status(400).entity( apiResponse ).type( MediaType.APPLICATION_JSON ).build();
+    }
+
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/GuiceFeature.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/GuiceFeature.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/GuiceFeature.java
new file mode 100644
index 0000000..a3485d0
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/GuiceFeature.java
@@ -0,0 +1,45 @@
+/*
+ * 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.qakka.api.impl;
+
+import org.glassfish.hk2.api.ServiceLocator;
+import org.glassfish.jersey.ServiceLocatorProvider;
+import org.jvnet.hk2.guice.bridge.api.GuiceBridge;
+import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge;
+
+import javax.ws.rs.core.Feature;
+import javax.ws.rs.core.FeatureContext;
+import javax.ws.rs.ext.Provider;
+
+
+@Provider
+public class GuiceFeature implements Feature {
+
+    @Override
+    public boolean configure(FeatureContext context) {
+
+        ServiceLocator serviceLocator = ServiceLocatorProvider.getServiceLocator( context );
+        GuiceBridge.getGuiceBridge().initializeGuiceBridge( serviceLocator );
+
+        GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService( GuiceIntoHK2Bridge.class );
+        guiceBridge.bridgeGuiceInjector( StartupListener.INJECTOR );
+
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/JacksonProvider.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/JacksonProvider.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/JacksonProvider.java
new file mode 100644
index 0000000..b1400ca
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/JacksonProvider.java
@@ -0,0 +1,44 @@
+/*
+ * 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.qakka.api.impl;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
+import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Provider;
+
+
+@Provider
+public class JacksonProvider implements ContextResolver<ObjectMapper> {
+    final ObjectMapper mapper;
+
+    public JacksonProvider() {
+        mapper = new ObjectMapper();
+        mapper.enable( SerializationFeature.INDENT_OUTPUT );
+        mapper.setSerializationInclusion( JsonInclude.Include.NON_NULL );
+    }
+
+    @Override
+    public ObjectMapper getContext(final Class<?> type) {
+         return mapper;
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/JerseyResourceConfig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/JerseyResourceConfig.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/JerseyResourceConfig.java
new file mode 100644
index 0000000..86cfe05
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/JerseyResourceConfig.java
@@ -0,0 +1,31 @@
+/*
+ * 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.qakka.api.impl;
+
+import org.glassfish.jersey.server.ResourceConfig;
+
+
+public class JerseyResourceConfig extends ResourceConfig {
+
+    public JerseyResourceConfig() {
+        packages( "org.apache.usergrid.persistence.qakka.api" );
+    }
+}
+
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/NotFoundMapper.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/NotFoundMapper.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/NotFoundMapper.java
new file mode 100644
index 0000000..2725766
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/NotFoundMapper.java
@@ -0,0 +1,43 @@
+/*
+ * 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.qakka.api.impl;
+
+import org.apache.usergrid.persistence.qakka.api.ApiResponse;
+import org.apache.usergrid.persistence.qakka.exceptions.NotFoundException;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+
+
+@Provider
+public class NotFoundMapper implements ExceptionMapper<NotFoundException> {
+
+    public Response toResponse( NotFoundException ex ) {
+
+        ApiResponse apiResponse = new ApiResponse();
+        apiResponse.setMessage( ex.getMessage() );
+
+        return Response.status(404).entity( apiResponse ).type( MediaType.APPLICATION_JSON ).build();
+    }
+
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/StartupListener.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/StartupListener.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/StartupListener.java
new file mode 100644
index 0000000..d97363a
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/StartupListener.java
@@ -0,0 +1,70 @@
+/*
+ * 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.qakka.api.impl;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.servlet.GuiceServletContextListener;
+import com.google.inject.servlet.ServletModule;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.QakkaModule;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.bridge.SLF4JBridgeHandler;
+
+import java.util.logging.LogManager;
+
+
+public class StartupListener extends GuiceServletContextListener {
+    private static final Logger logger = LoggerFactory.getLogger( StartupListener.class );
+
+    public static App APP = null;
+
+    public static Injector INJECTOR = null;
+
+    static {
+
+        try {
+            LogManager.getLogManager().reset();
+            SLF4JBridgeHandler.install();
+
+            INJECTOR = Guice.createInjector( new ServletModule() {
+                @Override
+                protected void configureServlets() {
+                    install( new QakkaModule() );
+                }
+            } );
+
+            APP = INJECTOR.getInstance( App.class );
+
+            APP.start();
+
+        } catch ( Throwable t ) {
+            logger.error("Error static initializing StartupListener class", t);
+        }
+
+    }
+
+    @Override
+    protected Injector getInjector() {
+        return INJECTOR;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/URIStrategyLocalhost.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/URIStrategyLocalhost.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/URIStrategyLocalhost.java
new file mode 100644
index 0000000..6f8dbb2
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/api/impl/URIStrategyLocalhost.java
@@ -0,0 +1,49 @@
+/*
+ * 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.qakka.api.impl;
+
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.qakka.api.URIStrategy;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.UUID;
+
+
+/** TODO: implement a "real" URI strategy */
+public class URIStrategyLocalhost implements URIStrategy {
+
+    final private String hostname;
+
+    @Inject
+    public URIStrategyLocalhost( ActorSystemFig actorSystemFig ) {
+        this.hostname = actorSystemFig.getHostname();
+    }
+
+    @Override
+    public URI queueURI(String queueName) throws URISyntaxException {
+        return new URI("http://" + hostname + ":8080/api/queues/" + queueName);
+    }
+
+    @Override
+    public URI queueMessageDataURI(String queueName, UUID queueMessageId) throws URISyntaxException {
+        return new URI("http://" + hostname + ":8080/api/queues/" + queueName + "/data/" + queueMessageId );
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClient.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClient.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClient.java
new file mode 100644
index 0000000..9f40b51
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClient.java
@@ -0,0 +1,29 @@
+/*
+ * 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.qakka.core;
+
+import com.datastax.driver.core.Session;
+
+/**
+ * Created by Dave Johnson (snoopdave@apache.org) on 9/9/16.
+ */
+public interface CassandraClient {
+    Session getSession();
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClientImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClientImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClientImpl.java
new file mode 100644
index 0000000..ed665c2
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClientImpl.java
@@ -0,0 +1,49 @@
+/*
+ * 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.qakka.core;
+
+import com.datastax.driver.core.Session;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@Singleton
+public class CassandraClientImpl implements CassandraClient {
+    private static final Logger logger = LoggerFactory.getLogger( CassandraClientImpl.class );
+
+    private final Session session;
+
+    @Inject
+    public CassandraClientImpl( DataStaxCluster dataStaxCluster) {
+
+        logger.info("Constructing Cassandra client");
+
+        this.session = dataStaxCluster.getApplicationSession();
+    }
+
+
+    @Override
+    public Session getSession() {
+        return session;
+    }
+}


[20/25] usergrid git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/usergrid into usergrid-1318-queue

Posted by sn...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/usergrid into usergrid-1318-queue

* 'master' of https://git-wip-us.apache.org/repos/asf/usergrid:
  allow no password when creating admin users when SSO-enabled
  Load properties into Guice by using the getProperty method instead of generic putAll from Map superclass as it getProperty could be overridden
  add count to paged organizations get, and fix limit=1000
  Refactor superuser authentication/login such that permissions are handled more appropriately, allowing access to all parts of the system.
  Enhance superuser basic auth filter to login to shiro with a token just like the sysadmin tokens.
  Adding paging to get all orgs endpoint.  Enhance Akka cluster so it properly downs nodes that are restarted but still ok on the network. Don't load all orgs when validating sysadmin creds.


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

Branch: refs/heads/usergrid-1318-queue
Commit: 447b60d4364c9f705a1350f11288dbad6ed3673c
Parents: 483ca0f 9947d48
Author: Dave Johnson <sn...@apache.org>
Authored: Fri Sep 16 07:49:02 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Fri Sep 16 07:49:02 2016 -0400

----------------------------------------------------------------------
 .../actorsystem/ActorSystemManagerImpl.java     |  15 ++-
 .../actorsystem/ClusterListener.java            | 107 +++++++++++++++++++
 .../organizations/OrganizationsResource.java    |  48 +++++++--
 .../security/SecuredResourceFilterFactory.java  |  35 +++---
 .../shiro/filters/BasicAuthSecurityFilter.java  |  54 ++++++++--
 .../rest/applications/ApplicationDeleteIT.java  |   1 -
 .../usergrid/rest/applications/SecurityIT.java  |  31 ++++++
 .../activities/ActivityResourceIT.java          |   5 -
 .../test/resource/endpoints/NamedResource.java  |   9 ++
 .../cassandra/ManagementServiceImpl.java        |   5 +-
 .../AbstractPasswordCredentials.java            |   3 +-
 .../shiro/credentials/AdminUserPassword.java    |   2 +
 .../shiro/principals/AdminUserPrincipal.java    |  25 +----
 .../usergrid/services/AbstractService.java      |   8 ++
 14 files changed, 284 insertions(+), 64 deletions(-)
----------------------------------------------------------------------



[25/25] usergrid git commit: Changes to get Qakka using same injector as rest of Usergrid

Posted by sn...@apache.org.
Changes to get Qakka using same injector as rest of Usergrid


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

Branch: refs/heads/usergrid-1318-queue
Commit: 18e4305b995be88947b72172dd22056702659a8e
Parents: 832b505
Author: Dave Johnson <sn...@apache.org>
Authored: Fri Sep 16 18:33:10 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Fri Sep 16 18:33:10 2016 -0400

----------------------------------------------------------------------
 .../corepersistence/CpEntityManagerFactory.java |  3 ++
 .../usergrid/persistence/core/CassandraFig.java |  2 +-
 .../index/impl/EsIndexProducerImpl.java         |  2 --
 .../apache/usergrid/persistence/qakka/App.java  | 12 +++----
 .../usergrid/persistence/qakka/QakkaModule.java |  6 ++--
 .../impl/DistributedQueueServiceImpl.java       | 35 ++++++++++++++------
 6 files changed, 38 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/18e4305b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
index 5d8c417..4bec92d 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
@@ -60,6 +60,7 @@ import org.apache.usergrid.persistence.index.EntityIndex;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.entity.SimpleId;
 import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+import org.apache.usergrid.persistence.qakka.App;
 import org.apache.usergrid.persistence.qakka.distributed.impl.QueueActorRouterProducer;
 import org.apache.usergrid.persistence.qakka.distributed.impl.QueueSenderRouterProducer;
 import org.apache.usergrid.persistence.qakka.distributed.impl.QueueWriterRouterProducer;
@@ -151,6 +152,8 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
             try {
                 logger.info("Akka cluster starting...");
 
+                // TODO: fix this kludge
+                injector.getInstance( App.class );
                 this.actorSystemManager = injector.getInstance( ActorSystemManager.class );
 
                 actorSystemManager.registerRouterProducer( injector.getInstance( UniqueValuesService.class ) );

http://git-wip-us.apache.org/repos/asf/usergrid/blob/18e4305b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
index b599a20..bc8d087 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
@@ -91,7 +91,7 @@ public interface CassandraFig extends GuicyFig {
     @Default( "Usergrid_Applications" )
     String getApplicationKeyspace();
 
-    @Key( "cassandra.keyspace.application_local" )
+    @Key( "cassandra.keyspace.application.local" )
     @Default( "Usergrid_Applications_Local" )
     String getApplicationLocalKeyspace();
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/18e4305b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsIndexProducerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsIndexProducerImpl.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsIndexProducerImpl.java
index 10d5e4a..8f58ef7 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsIndexProducerImpl.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsIndexProducerImpl.java
@@ -57,7 +57,6 @@ public class EsIndexProducerImpl implements IndexProducer {
     private final IndexFig config;
     private final FailureMonitorImpl failureMonitor;
     private final Client client;
-    private final Timer flushTimer;
     private final IndexFig indexFig;
     private final Counter indexSizeCounter;
     private final Histogram roundtripTimer;
@@ -70,7 +69,6 @@ public class EsIndexProducerImpl implements IndexProducer {
     @Inject
     public EsIndexProducerImpl(final IndexFig config, final EsProvider provider,
                                final MetricsFactory metricsFactory, final IndexFig indexFig) {
-        this.flushTimer = metricsFactory.getTimer(EsIndexProducerImpl.class, "index_buffer.flush");
         this.indexSizeCounter = metricsFactory.getCounter(EsIndexProducerImpl.class, "index_buffer.size");
         this.roundtripTimer = metricsFactory.getHistogram(EsIndexProducerImpl.class, "index_buffer.message_cycle");
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/18e4305b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/App.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/App.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/App.java
index 9d9c972..41bc6fa 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/App.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/App.java
@@ -59,12 +59,12 @@ public class App implements MetricsService {
         this.actorSystemFig = actorSystemFig;
         this.actorSystemManager = actorSystemManager;
         this.distributedQueueService = distributedQueueService;
-
-        try {
-            migrationManager.migrate();
-        } catch (MigrationException e) {
-            throw new QakkaRuntimeException( "Error running migration", e );
-        }
+//
+//        try {
+//            migrationManager.migrate();
+//        } catch (MigrationException e) {
+//            throw new QakkaRuntimeException( "Error running migration", e );
+//        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/usergrid/blob/18e4305b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
index 0c37e82..d1d8d7e 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
@@ -64,8 +64,8 @@ public class QakkaModule extends AbstractModule {
             // TODO: reconcile with usergrid props
             // load properties from one properties file using Netflix Archaius so that GuicyFig will see them
             ConfigurationManager.loadCascadedPropertiesFromResources( "qakka" );
-        } catch (IOException e) {
-            logger.warn("Unable to load qakka.properties");
+        } catch (Throwable t) {
+            logger.warn("Unable to load qakka.properties (can be ignored in Usergrid)");
         }
     }
 
@@ -105,11 +105,11 @@ public class QakkaModule extends AbstractModule {
         Multibinder<Migration> migrationBinder = Multibinder.newSetBinder( binder(), Migration.class );
 
         migrationBinder.addBinding().to( Key.get( AuditLogSerialization.class ) );
-        //migrationBinder.addBinding().to( Key.get( MessageCounterSerialization.class ) );
         migrationBinder.addBinding().to( Key.get( QueueMessageSerialization.class ) );
         migrationBinder.addBinding().to( Key.get( QueueSerialization.class ) );
         migrationBinder.addBinding().to( Key.get( ShardCounterSerialization.class ) );
         migrationBinder.addBinding().to( Key.get( ShardSerialization.class ) );
         migrationBinder.addBinding().to( Key.get( TransferLogSerialization.class ) );
+        //migrationBinder.addBinding().to( Key.get( MessageCounterSerialization.class ) );
     }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/18e4305b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
index 1243c23..ec667e6 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
@@ -25,6 +25,7 @@ import akka.util.Timeout;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import org.apache.usergrid.persistence.actorsystem.ActorSystemManager;
+import org.apache.usergrid.persistence.actorsystem.ClientActor;
 import org.apache.usergrid.persistence.qakka.QakkaFig;
 import org.apache.usergrid.persistence.qakka.core.QueueManager;
 import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
@@ -185,23 +186,37 @@ public class DistributedQueueServiceImpl implements DistributedQueueService {
                 // ask ClientActor and wait (up to timeout) for response
 
                 Future<Object> fut = Patterns.ask( actorSystemManager.getClientActor(), request, t );
-                final QakkaMessage response = (QakkaMessage)Await.result( fut, t.duration() );
+                Object responseObject = Await.result( fut, t.duration() );
+
+                if ( responseObject instanceof QakkaMessage ) {
 
-                if ( response != null && response instanceof QueueGetResponse) {
-                    QueueGetResponse qprm = (QueueGetResponse)response;
-                    if ( qprm.isSuccess() ) {
-                        if (retries > 1) {
-                            logger.debug( "getNextMessage SUCCESS after {} retries", retries );
+                    final QakkaMessage response = (QakkaMessage)Await.result( fut, t.duration() );
+
+                    if ( response != null && response instanceof QueueGetResponse) {
+                        QueueGetResponse qprm = (QueueGetResponse)response;
+                        if ( qprm.isSuccess() ) {
+                            if (retries > 1) {
+                                logger.debug( "getNextMessage SUCCESS after {} retries", retries );
+                            }
                         }
+                        return qprm.getQueueMessages();
+
+
+                    } else if ( response != null  ) {
+                        logger.debug("ERROR RESPONSE (1) popping queue, retrying {}", retries );
+
+                    } else {
+                        logger.debug("TIMEOUT popping to queue, retrying {}", retries );
                     }
-                    return qprm.getQueueMessages();
 
+                } else if ( responseObject instanceof ClientActor.ErrorResponse ) {
 
-                } else if ( response != null  ) {
-                    logger.debug("ERROR RESPONSE popping queue, retrying {}", retries );
+                    final ClientActor.ErrorResponse errorResponse = (ClientActor.ErrorResponse)responseObject;
+                    logger.debug("ACTORSYSTEM ERROR popping queue: {}, retrying {}",
+                        errorResponse.getMessage(), retries );
 
                 } else {
-                    logger.debug("TIMEOUT popping to queue, retrying {}", retries );
+                    logger.debug("UNKNOWN RESPONSE popping queue, retrying {}", retries );
                 }
 
             } catch ( Exception e ) {


[24/25] usergrid git commit: Don't init queue in constructor

Posted by sn...@apache.org.
Don't init queue in constructor


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

Branch: refs/heads/usergrid-1318-queue
Commit: 832b505c75724ed61a2d5869727208cbabf5ce13
Parents: 6f983a4
Author: Dave Johnson <sn...@apache.org>
Authored: Fri Sep 16 14:54:35 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Fri Sep 16 14:54:35 2016 -0400

----------------------------------------------------------------------
 .../persistence/queue/impl/QakkaQueueManager.java         | 10 ++++++++++
 1 file changed, 10 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/832b505c/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QakkaQueueManager.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QakkaQueueManager.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QakkaQueueManager.java
index c407a78..832cecd 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QakkaQueueManager.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QakkaQueueManager.java
@@ -65,6 +65,10 @@ public class QakkaQueueManager implements LegacyQueueManager {
         this.qakkaFig = qakkaFig;
         this.queueMessageManager = queueMessageManager;
         this.regions = regions;
+    }
+
+
+    private synchronized void createQueueIfNecessary() {
 
         if ( queueManager.getQueueConfig(scope.getName()) == null ) {
 
@@ -80,6 +84,8 @@ public class QakkaQueueManager implements LegacyQueueManager {
     @Override
     public <T extends Serializable> void sendMessage(T body) throws IOException {
 
+        createQueueIfNecessary();
+
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ObjectOutputStream oos = new ObjectOutputStream(bos);
         oos.writeObject(body);
@@ -106,6 +112,8 @@ public class QakkaQueueManager implements LegacyQueueManager {
     @Override
     public List<LegacyQueueMessage> getMessages(int limit, Class klass) {
 
+        createQueueIfNecessary();
+
         List<LegacyQueueMessage> messages = new ArrayList<>();
         List<QueueMessage> qakkaMessages = queueMessageManager.getNextMessages( scope.getName(), limit );
 
@@ -147,6 +155,8 @@ public class QakkaQueueManager implements LegacyQueueManager {
     @Override
     public void commitMessage(LegacyQueueMessage queueMessage) {
 
+        createQueueIfNecessary();
+
         UUID queueMessageId  = UUID.fromString( queueMessage.getMessageId() );
         queueMessageManager.ackMessage( scope.getName(), queueMessageId );
     }


[19/25] usergrid git commit: switch Qakka to using two keyspaces, the original replicated Applications one and a new un-replicated Applications Local one

Posted by sn...@apache.org.
switch Qakka to using two keyspaces, the original replicated Applications one and a new un-replicated Applications Local one


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

Branch: refs/heads/usergrid-1318-queue
Commit: 483ca0f5485891f2acc5d3b1a921d68c87d1d647
Parents: ee0dda4
Author: Dave Johnson <sn...@apache.org>
Authored: Fri Sep 16 07:48:09 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Fri Sep 16 07:48:09 2016 -0400

----------------------------------------------------------------------
 .../main/resources/usergrid-default.properties  |  2 +
 .../usergrid/corepersistence/GuiceFactory.java  |  3 ++
 .../impl/ScopedCacheSerializationImpl.java      | 10 ++++-
 .../UniqueValueSerializationStrategyImpl.java   | 16 ++++---
 .../UniqueValueSerializationStrategyV1Impl.java | 46 +++++++++++++-------
 .../UniqueValueSerializationStrategyV2Impl.java | 34 ++++++++++-----
 .../persistence/core/CassandraConfig.java       |  3 ++
 .../persistence/core/CassandraConfigImpl.java   | 18 ++++++++
 .../usergrid/persistence/core/CassandraFig.java |  4 ++
 .../persistence/core/datastax/CQLUtils.java     |  6 ++-
 .../core/datastax/DataStaxCluster.java          |  4 ++
 .../core/datastax/TableDefinition.java          |  2 +
 .../core/datastax/impl/DataStaxClusterImpl.java | 42 ++++++++++++++++++
 .../core/datastax/impl/TableDefinitionImpl.java | 20 ++++++---
 .../impl/TableDefinitionStringImpl.java         |  9 +++-
 .../core/migration/schema/Migration.java        |  1 +
 .../migration/schema/MigrationManagerFig.java   |  4 ++
 .../migration/schema/MigrationManagerImpl.java  | 17 +++++---
 .../core/astyanax/ColumnNameIteratorTest.java   | 11 +++++
 .../MultiKeyColumnNameIteratorTest.java         | 11 +++++
 .../astyanax/MultiRowColumnIteratorTest.java    | 10 +++++
 .../persistence/core/datastax/CQLUtilsTest.java |  6 +--
 .../core/datastax/TableDefinitionTest.java      |  8 ++--
 .../core/guice/MigrationManagerRule.java        | 11 ++---
 .../map/impl/MapSerializationImpl.java          | 24 ++++++----
 stack/corepersistence/queue/pom.xml             |  3 ++
 .../usergrid/persistence/qakka/QakkaFig.java    |  2 +-
 .../persistence/qakka/core/CassandraClient.java |  5 ++-
 .../qakka/core/CassandraClientImpl.java         | 23 +++++++---
 .../MultiShardMessageIterator.java              |  2 +-
 .../impl/AuditLogSerializationImpl.java         | 12 +++--
 .../impl/MessageCounterSerializationImpl.java   | 12 +++--
 .../impl/QueueMessageSerializationImpl.java     | 28 ++++++++----
 .../queues/impl/QueueSerializationImpl.java     | 16 ++++---
 .../serialization/sharding/ShardIterator.java   |  2 +-
 .../impl/ShardCounterSerializationImpl.java     | 12 +++--
 .../sharding/impl/ShardSerializationImpl.java   | 19 +++++---
 .../impl/TransferLogSerializationImpl.java      | 16 ++++---
 .../persistence/qakka/AbstractTest.java         |  5 ++-
 .../persistence/qakka/KeyspaceDropper.java      | 20 ++++++---
 .../qakka/common/CassandraClientTest.java       |  4 +-
 .../qakka/core/QueueMessageManagerTest.java     | 14 +++---
 .../distributed/QueueActorServiceTest.java      |  2 -
 .../actors/QueueActorHelperTest.java            | 11 ++---
 .../distributed/actors/QueueReaderTest.java     |  1 -
 .../distributed/actors/QueueTimeouterTest.java  | 33 +++++++-------
 .../distributed/actors/ShardAllocatorTest.java  |  4 +-
 ...tiShardDatabaseQueueMessageIteratorTest.java | 23 +++++-----
 .../auditlogs/AuditLogSerializationTest.java    | 17 +++-----
 .../queues/DatabaseQueueSerializationTest.java  |  3 --
 .../sharding/ShardCounterSerializationTest.java | 17 ++++----
 .../sharding/ShardIteratorTest.java             | 20 +++++----
 .../sharding/ShardSerializationTest.java        | 15 ++++---
 .../sharding/ShardStrategyTest.java             |  7 ++-
 .../TransferLogSerializationTest.java           | 24 +++++-----
 .../queue/LegacyQueueManagerTest.java           |  5 ---
 .../queue/src/test/resources/qakka.properties   | 18 +++++---
 57 files changed, 477 insertions(+), 240 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/config/src/main/resources/usergrid-default.properties
----------------------------------------------------------------------
diff --git a/stack/config/src/main/resources/usergrid-default.properties b/stack/config/src/main/resources/usergrid-default.properties
index 34d46ad..5c7fca2 100644
--- a/stack/config/src/main/resources/usergrid-default.properties
+++ b/stack/config/src/main/resources/usergrid-default.properties
@@ -94,6 +94,8 @@ cassandra.keyspace.strategy=SimpleStrategy
 #
 cassandra.keyspace.replication=replication_factor:1
 
+cassandra.keyspace.local.replication=replication_factor:1
+
 # Tell Usergrid that Cassandra is not embedded.
 #
 cassandra.embedded=false

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/core/src/main/java/org/apache/usergrid/corepersistence/GuiceFactory.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/GuiceFactory.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/GuiceFactory.java
index a17ac48..b003c2f 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/GuiceFactory.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/GuiceFactory.java
@@ -115,6 +115,9 @@ public class GuiceFactory implements FactoryBean<Injector> {
             cpProps
                 .put( "collections.keyspace.strategy.class", getAndValidateProperty( "cassandra.keyspace.strategy" ) );
 
+            cpProps.put( "collections.keyspace.local.strategy.options",
+                getAndValidateProperty( "cassandra.keyspace.local.replication" ) );
+
             cpProps.put( "collections.keyspace.strategy.options",
                 getAndValidateProperty( "cassandra.keyspace.replication" ) );
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java b/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
index 7e4adb0..e2574c1 100644
--- a/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
+++ b/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
@@ -280,8 +280,14 @@ public class ScopedCacheSerializationImpl<K,V> implements ScopedCacheSerializati
     public Collection<TableDefinition> getTables() {
 
         final TableDefinition scopedCache =
-            new TableDefinitionImpl( SCOPED_CACHE_TABLE, SCOPED_CACHE_PARTITION_KEYS, SCOPED_CACHE_COLUMN_KEYS,
-                SCOPED_CACHE_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, SCOPED_CACHE_CLUSTERING_ORDER);
+            new TableDefinitionImpl(
+                cassandraConfig.getApplicationKeyspace(),
+                SCOPED_CACHE_TABLE,
+                SCOPED_CACHE_PARTITION_KEYS,
+                SCOPED_CACHE_COLUMN_KEYS,
+                SCOPED_CACHE_COLUMNS,
+                TableDefinitionImpl.CacheOption.KEYS,
+                SCOPED_CACHE_CLUSTERING_ORDER);
 
         return Collections.singletonList(scopedCache);
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
index 450c098..cf168cb 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
@@ -68,7 +68,7 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
 
 
     private final SerializationFig serializationFig;
-    private final CassandraFig cassandraFig;
+    protected final CassandraFig cassandraFig;
 
     private final Session session;
     private final CassandraConfig cassandraConfig;
@@ -90,8 +90,8 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
         this.session = session;
         this.cassandraConfig = cassandraConfig;
 
-        TABLE_UNIQUE_VALUES = getUniqueValuesTable().getTableName();
-        TABLE_UNIQUE_VALUES_LOG = getEntityUniqueLogTable().getTableName();
+        TABLE_UNIQUE_VALUES = getUniqueValuesTable( cassandraFig ).getTableName();
+        TABLE_UNIQUE_VALUES_LOG = getEntityUniqueLogTable( cassandraFig ).getTableName();
     }
 
     @Override
@@ -272,9 +272,11 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
 
         for ( Field field : fields ) {
 
-            //log.info(Bytes.toHexString(getPartitionKey(applicationId, type, field.getTypeName().toString(), field.getName(), field.getValue())));
+            //log.info(Bytes.toHexString(getPartitionKey(applicationId, type,
+            // field.getTypeName().toString(), field.getName(), field.getValue())));
 
-            //partitionKeys.add(getPartitionKey(applicationId, type, field.getTypeName().toString(), field.getName(), field.getValue()));
+            //partitionKeys.add(getPartitionKey(applicationId, type,
+            // field.getTypeName().toString(), field.getName(), field.getValue()));
 
             final Clause inKey = QueryBuilder.in("key", getPartitionKey(applicationId, type,
                 field.getTypeName().toString(), field.getName(), field.getValue()) );
@@ -492,7 +494,7 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     /**
      * Get the CQL table definition for the unique values log table
      */
-    protected abstract TableDefinition getUniqueValuesTable();
+    protected abstract TableDefinition getUniqueValuesTable( CassandraFig cassandraFig );
 
 
     protected abstract List<Object> deserializePartitionKey(ByteBuffer bb);
@@ -514,7 +516,7 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     /**
      * Get the CQL table definition for the unique values log table
      */
-    protected abstract TableDefinition getEntityUniqueLogTable();
+    protected abstract TableDefinition getEntityUniqueLogTable( CassandraFig cassandraFig );
 
 
     public class AllUniqueFieldsIterator implements Iterable<UniqueValue>, Iterator<UniqueValue> {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
index 4ee5b70..ba3fcb0 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
@@ -46,9 +46,8 @@ import com.google.inject.Singleton;
  * V1 impl with unique value serialization strategy with the collection scope
  */
 @Singleton
-public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializationStrategyImpl<CollectionPrefixedKey<Field>, CollectionPrefixedKey<Id>> {
-
-
+public class UniqueValueSerializationStrategyV1Impl  extends
+    UniqueValueSerializationStrategyImpl<CollectionPrefixedKey<Field>, CollectionPrefixedKey<Id>> {
 
     private static final String UNIQUE_VALUES_TABLE = CQLUtils.quote("Unique_Values");
     private static final Collection<String> UNIQUE_VALUES_PARTITION_KEYS = Collections.singletonList("key");
@@ -58,6 +57,7 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
             put( "key", DataType.Name.BLOB );
             put( "column1", DataType.Name.CUSTOM );
             put( "value", DataType.Name.BLOB ); }};
+
     private static final Map<String, String> UNIQUE_VALUES_CLUSTERING_ORDER =
         new HashMap<String, String>(){{ put( "column1", "ASC" );}};
 
@@ -70,18 +70,14 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
             put( "key", DataType.Name.BLOB );
             put( "column1", DataType.Name.CUSTOM );
             put( "value", DataType.Name.BLOB ); }};
+
     private static final Map<String, String> UNIQUE_VALUES_LOG_CLUSTERING_ORDER =
         new HashMap<String, String>(){{ put( "column1", "ASC" ); }};
 
 
-    private final static TableDefinition uniqueValues =
-        new TableDefinitionImpl( UNIQUE_VALUES_TABLE, UNIQUE_VALUES_PARTITION_KEYS, UNIQUE_VALUES_COLUMN_KEYS,
-            UNIQUE_VALUES_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, UNIQUE_VALUES_CLUSTERING_ORDER);
-
-    private final static TableDefinition uniqueValuesLog =
-        new TableDefinitionImpl( UNIQUE_VALUES_LOG_TABLE, UNIQUE_VALUES_LOG_PARTITION_KEYS, UNIQUE_VALUES_LOG_COLUMN_KEYS,
-            UNIQUE_VALUES_LOG_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, UNIQUE_VALUES_LOG_CLUSTERING_ORDER);
+    private TableDefinition uniqueValues;
 
+    private TableDefinition uniqueValuesLog;
 
 
     /**
@@ -95,7 +91,9 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
                                                    final SerializationFig serializationFig,
                                                    final Session session,
                                                    final CassandraConfig cassandraConfig) {
+
         super( cassandraFig, serializationFig, session, cassandraConfig );
+
     }
 
 
@@ -109,8 +107,8 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
     @Override
     public Collection<TableDefinition> getTables() {
 
-        final TableDefinition uniqueValues = getUniqueValuesTable();
-        final TableDefinition uniqueValuesLog = getEntityUniqueLogTable();
+        final TableDefinition uniqueValues = getUniqueValuesTable( cassandraFig );
+        final TableDefinition uniqueValuesLog = getEntityUniqueLogTable( cassandraFig );
 
         return Arrays.asList( uniqueValues, uniqueValuesLog );
 
@@ -119,15 +117,33 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
 
 
     @Override
-    protected TableDefinition getUniqueValuesTable(){
+    protected TableDefinition getUniqueValuesTable( CassandraFig cassandraFig ) {
+        if ( uniqueValues == null ) {
+
+            uniqueValues = new TableDefinitionImpl( cassandraFig.getApplicationKeyspace(),
+                UNIQUE_VALUES_TABLE,
+                UNIQUE_VALUES_PARTITION_KEYS,
+                UNIQUE_VALUES_COLUMN_KEYS,
+                UNIQUE_VALUES_COLUMNS,
+                TableDefinitionImpl.CacheOption.KEYS, UNIQUE_VALUES_CLUSTERING_ORDER);
 
+        }
         return uniqueValues;
     }
 
 
     @Override
-    protected TableDefinition getEntityUniqueLogTable(){
-
+    protected TableDefinition getEntityUniqueLogTable( CassandraFig cassandraFig ) {
+        if ( uniqueValuesLog == null ) {
+
+            uniqueValuesLog = new TableDefinitionImpl( cassandraFig.getApplicationKeyspace(),
+                UNIQUE_VALUES_LOG_TABLE,
+                UNIQUE_VALUES_LOG_PARTITION_KEYS,
+                UNIQUE_VALUES_LOG_COLUMN_KEYS,
+                UNIQUE_VALUES_LOG_COLUMNS,
+                TableDefinitionImpl.CacheOption.KEYS,
+                UNIQUE_VALUES_LOG_CLUSTERING_ORDER);
+        }
         return uniqueValuesLog;
 
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
index 522dad9..aeb1720 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
@@ -69,13 +69,9 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
     private static final Map<String, String> UNIQUE_VALUES_LOG_CLUSTERING_ORDER =
         new HashMap<String, String>(){{ put( "column1", "ASC" );}};
 
-    private final static TableDefinition uniqueValues =
-        new TableDefinitionImpl( UNIQUE_VALUES_TABLE, UNIQUE_VALUES_PARTITION_KEYS, UNIQUE_VALUES_COLUMN_KEYS,
-            UNIQUE_VALUES_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, UNIQUE_VALUES_CLUSTERING_ORDER);
+    private static TableDefinition uniqueValues;
 
-    private final static TableDefinition uniqueValuesLog =
-        new TableDefinitionImpl( UNIQUE_VALUES_LOG_TABLE, UNIQUE_VALUES_LOG_PARTITION_KEYS, UNIQUE_VALUES_LOG_COLUMN_KEYS,
-            UNIQUE_VALUES_LOG_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, UNIQUE_VALUES_LOG_CLUSTERING_ORDER);
+    private static TableDefinition uniqueValuesLog;
 
 
     /**
@@ -104,8 +100,8 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
     @Override
     public Collection<TableDefinition> getTables() {
 
-        final TableDefinition uniqueValues = getUniqueValuesTable();
-        final TableDefinition uniqueValuesLog = getEntityUniqueLogTable();
+        final TableDefinition uniqueValues = getUniqueValuesTable( cassandraFig );
+        final TableDefinition uniqueValuesLog = getEntityUniqueLogTable( cassandraFig );
 
         return Arrays.asList( uniqueValues, uniqueValuesLog );
 
@@ -113,13 +109,31 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
 
 
     @Override
-    protected TableDefinition getUniqueValuesTable(){
+    protected TableDefinition getUniqueValuesTable( CassandraFig cassandraFig ) {
+        if ( uniqueValues == null ) {
+            uniqueValues = new TableDefinitionImpl( cassandraFig.getApplicationKeyspace(),
+                UNIQUE_VALUES_TABLE,
+                UNIQUE_VALUES_PARTITION_KEYS,
+                UNIQUE_VALUES_COLUMN_KEYS,
+                UNIQUE_VALUES_COLUMNS,
+                TableDefinitionImpl.CacheOption.KEYS,
+                UNIQUE_VALUES_CLUSTERING_ORDER);
+        }
         return uniqueValues;
     }
 
 
     @Override
-    protected TableDefinition getEntityUniqueLogTable(){
+    protected TableDefinition getEntityUniqueLogTable( CassandraFig cassandraFig ){
+        if ( uniqueValuesLog == null ) {
+            uniqueValuesLog = new TableDefinitionImpl(  cassandraFig.getApplicationKeyspace(),
+                UNIQUE_VALUES_LOG_TABLE,
+                UNIQUE_VALUES_LOG_PARTITION_KEYS,
+                UNIQUE_VALUES_LOG_COLUMN_KEYS,
+                UNIQUE_VALUES_LOG_COLUMNS,
+                TableDefinitionImpl.CacheOption.KEYS,
+                UNIQUE_VALUES_LOG_CLUSTERING_ORDER);
+        }
         return uniqueValuesLog;
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfig.java
index 595b65f..f45ad43 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfig.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfig.java
@@ -74,4 +74,7 @@ public interface CassandraConfig {
     int[] getShardSettings();
 
 
+    String getApplicationKeyspace();
+
+    String getApplicationLocalKeyspace();
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfigImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfigImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfigImpl.java
index e87ebb8..729f5b2 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfigImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfigImpl.java
@@ -41,6 +41,9 @@ public class CassandraConfigImpl implements CassandraConfig {
     private int[] shardSettings;
     private ConsistencyLevel consistentCl;
 
+    private String applicationKeyspace;
+    private String applicationLocalKeyspace;
+
     // DataStax driver's CL
     private com.datastax.driver.core.ConsistencyLevel dataStaxReadCl;
     private com.datastax.driver.core.ConsistencyLevel dataStaxWriteCl;
@@ -65,6 +68,10 @@ public class CassandraConfigImpl implements CassandraConfig {
 
         this.dataStaxWriteCl = com.datastax.driver.core.ConsistencyLevel.valueOf( cassandraFig.getWriteCl() );
 
+        this.applicationKeyspace = cassandraFig.getApplicationKeyspace();
+
+        this.applicationLocalKeyspace = cassandraFig.getApplicationLocalKeyspace();
+
         //add the listeners to update the values
         cassandraFig.addPropertyChangeListener( new PropertyChangeListener() {
             @Override
@@ -133,4 +140,15 @@ public class CassandraConfigImpl implements CassandraConfig {
 
       return settings;
     }
+
+    @Override
+    public String getApplicationKeyspace() {
+        return applicationKeyspace;
+    }
+
+    @Override
+    public String getApplicationLocalKeyspace() {
+        return applicationLocalKeyspace;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
index 2996465..90f4ae8 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
@@ -87,6 +87,10 @@ public interface CassandraFig extends GuicyFig {
     @Default( "Usergrid_Applications" )
     String getApplicationKeyspace();
 
+    @Key( "cassandra.keyspace.application_local" )
+    @Default( "Usergrid_Applications_Local" )
+    String getApplicationLocalKeyspace();
+
     @Key( "cassandra.port" )
     @Default( "9160" )
     int getThriftPort();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
index 082f2d5..ed5c9e8 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
@@ -45,7 +45,8 @@ public class CQLUtils {
     }
 
 
-    public static String getFormattedReplication(String strategy, String strategyOptions) throws JsonProcessingException {
+    public static String getFormattedReplication(
+        String strategy, String strategyOptions) throws JsonProcessingException {
 
         Map<String, String> replicationSettings = new HashMap<>();
         replicationSettings.put("class", strategy);
@@ -86,7 +87,8 @@ public class CQLUtils {
     }
 
 
-    public static String getCachingOptions(CassandraFig cassandraFig, TableDefinitionImpl.CacheOption cacheOption) throws JsonProcessingException {
+    public static String getCachingOptions(
+        CassandraFig cassandraFig, TableDefinitionImpl.CacheOption cacheOption) throws JsonProcessingException {
 
         // Cassandra 2.0 and below has a different CQL syntax for caching
         if( Double.parseDouble( cassandraFig.getVersion() ) <= 2.0 ){

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
index ea76f92..5944b36 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
@@ -30,8 +30,12 @@ public interface DataStaxCluster {
 
     Session getApplicationSession();
 
+    Session getApplicationLocalSession();
+
     void createApplicationKeyspace() throws Exception;
 
+    void createApplicationLocalKeyspace() throws Exception;
+
     void waitForSchemaAgreement();
 
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
index 8178129..e1c5afb 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
@@ -28,6 +28,8 @@ public interface TableDefinition {
         CREATE, UPDATE
     }
 
+    String getKeyspace();
+
     String getTableName();
 
     String getTableCQL( CassandraFig cassandraFig, ACTION tableAction ) throws Exception;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
index f926d1e..fe9803d 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
@@ -39,6 +39,7 @@ public class DataStaxClusterImpl implements DataStaxCluster {
     private final CassandraFig cassandraFig;
     private Cluster cluster;
     private Session applicationSession;
+    private Session queueMessageSession;
     private Session clusterSession;
 
     @Inject
@@ -90,6 +91,17 @@ public class DataStaxClusterImpl implements DataStaxCluster {
     }
 
 
+    @Override
+    public Session getApplicationLocalSession(){
+
+        // always grab cluster from getCluster() in case it was prematurely closed
+        if ( queueMessageSession == null || queueMessageSession.isClosed() ){
+            queueMessageSession = getCluster().connect( CQLUtils.quote(cassandraFig.getApplicationLocalKeyspace() ) );
+        }
+        return queueMessageSession;
+    }
+
+
     /**
      * Execute CQL that will create the keyspace if it doesn't exist and alter it if it does.
      * @throws Exception
@@ -117,6 +129,36 @@ public class DataStaxClusterImpl implements DataStaxCluster {
 
     }
 
+
+
+    /**
+     * Execute CQL that will create the keyspace if it doesn't exist and alter it if it does.
+     * @throws Exception
+     */
+    @Override
+    public void createApplicationLocalKeyspace() throws Exception {
+
+        boolean exists = getClusterSession().getCluster().getMetadata()
+            .getKeyspace(CQLUtils.quote(cassandraFig.getApplicationLocalKeyspace())) != null;
+
+        if (exists) {
+            return;
+        }
+
+        final String createQueueMessageKeyspace = String.format(
+            "CREATE KEYSPACE IF NOT EXISTS %s WITH replication = %s",
+            CQLUtils.quote(cassandraFig.getApplicationLocalKeyspace()),
+            CQLUtils.getFormattedReplication(cassandraFig.getStrategy(), cassandraFig.getStrategyOptions())
+
+        );
+
+        getClusterSession().execute(createQueueMessageKeyspace);
+
+        logger.info("Created keyspace: {}", cassandraFig.getApplicationLocalKeyspace());
+
+    }
+
+
     /**
      * Wait until all Cassandra nodes agree on the schema.  Sleeps 100ms between checks.
      *

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionImpl.java
index a39c47e..f22c450 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionImpl.java
@@ -40,6 +40,7 @@ public class TableDefinitionImpl implements TableDefinition {
         ALL, KEYS, ROWS, NONE
     }
 
+    private final String keyspace;
     private final String tableName;
     private final Collection<String> partitionKeys;
     private final Collection<String> columnKeys;
@@ -71,16 +72,21 @@ public class TableDefinitionImpl implements TableDefinition {
     static String COMPOSITE_TYPE = "'org.apache.cassandra.db.marshal.DynamicCompositeType(a=>org.apache.cassandra.db.marshal.AsciiType,A=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.AsciiType),b=>org.apache.cassandra.db.marshal.BytesType,B=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.BytesType),i=>org.apache.cassandra.db.marshal.IntegerType,I=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.IntegerType),l=>org.apache.cassandra.db.marshal.LongType,L=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.LongType),s=>org.apache.cassandra.db.marshal.UTF8Type,S=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.UTF8Type),t=>org.apache.cassandra.db.marshal.TimeUUIDType,T=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.TimeUUIDType),u=>org.apache.cassandra.db.marshal.UUIDType,U=>org.apache.cassandra.db.marshal.Revers
 edType(org.apache.cassandra.db.marshal.UUIDType),x=>org.apache.cassandra.db.marshal.LexicalUUIDType,X=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.LexicalUUIDType))'";
 
 
-    public TableDefinitionImpl(final String tableName, final Collection<String> partitionKeys,
-                               final Collection<String> columnKeys, final Map<String, DataType.Name> columns,
-                               final CacheOption cacheOption, final Map<String, String> clusteringOrder){
+    public TableDefinitionImpl(
+        final String keyspace,
+        final String tableName,
+        final Collection<String> partitionKeys,
+        final Collection<String> columnKeys,
+        final Map<String, DataType.Name> columns,
+        final CacheOption cacheOption,
+        final Map<String, String> clusteringOrder) {
 
         Preconditions.checkNotNull(tableName, "Table name cannot be null");
         Preconditions.checkNotNull(partitionKeys, "Primary Key(s) cannot be null");
         Preconditions.checkNotNull(columns, "Columns cannot be null");
         Preconditions.checkNotNull(cacheOption, "CacheOption cannot be null");
 
-
+        this.keyspace = keyspace;
         this.tableName = tableName;
         this.partitionKeys = partitionKeys;
         this.columnKeys = columnKeys;
@@ -97,9 +103,11 @@ public class TableDefinitionImpl implements TableDefinition {
         this.compression = new HashMap<>(1);
         compression.put("sstable_compression", "LZ4Compressor");
         this.gcGraceSeconds = "864000";
+    }
 
-
-
+    @Override
+    public String getKeyspace() {
+        return keyspace;
     }
 
     public String getTableName() {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionStringImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionStringImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionStringImpl.java
index 8e7d854..f4a58f8 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionStringImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionStringImpl.java
@@ -25,17 +25,24 @@ import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 
 public class TableDefinitionStringImpl implements TableDefinition {
 
+    private String keyspace;
     private String tableName;
     private String cql;
 
 
-    public TableDefinitionStringImpl( String tableName, String cql ) {
+    public TableDefinitionStringImpl( String keyspace, String tableName, String cql ) {
+        this.keyspace = keyspace;
         this.tableName = tableName;
         this.cql = cql;
     }
 
 
     @Override
+    public String getKeyspace() {
+        return keyspace;
+    }
+
+    @Override
     public String getTableName() {
         return tableName;
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
index b2ab031..2b3e7fa 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
@@ -19,6 +19,7 @@
 package org.apache.usergrid.persistence.core.migration.schema;
 
 
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerFig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerFig.java
index d8f3d1f..be2866a 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerFig.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerFig.java
@@ -38,4 +38,8 @@ public interface MigrationManagerFig extends GuicyFig {
     @Default("replication_factor:1")
     String getStrategyOptions();
 
+    @Key( "collections.keyspace.strategy.options" )
+    @Default("replication_factor:1")
+    String getLocalStrategyOptions();
+
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
index f5ec8ac..9178bde 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
@@ -73,6 +73,8 @@ public class MigrationManagerImpl implements MigrationManager {
 
             dataStaxCluster.createApplicationKeyspace();
 
+            dataStaxCluster.createApplicationLocalKeyspace();
+
             for ( Migration migration : migrations ) {
 
                 final Collection<MultiTenantColumnFamilyDefinition> columnFamilies = migration.getColumnFamilies();
@@ -143,10 +145,10 @@ public class MigrationManagerImpl implements MigrationManager {
     private void createTable(TableDefinition tableDefinition ) throws Exception {
 
         KeyspaceMetadata keyspaceMetadata = dataStaxCluster.getClusterSession().getCluster().getMetadata()
-            .getKeyspace(CQLUtils.quote(cassandraFig.getApplicationKeyspace()));
+            .getKeyspace(CQLUtils.quote( tableDefinition.getKeyspace() ) );
 
         boolean exists =  keyspaceMetadata != null
-            && keyspaceMetadata.getTable(tableDefinition.getTableName()) != null;
+            && keyspaceMetadata.getTable( tableDefinition.getTableName() ) != null;
 
         if( exists ){
             return;
@@ -156,10 +158,15 @@ public class MigrationManagerImpl implements MigrationManager {
         if (logger.isDebugEnabled()) {
             logger.debug(CQL);
         }
-        dataStaxCluster.getApplicationSession()
-            .execute(CQL);
 
-        logger.info("Created table: {}", tableDefinition.getTableName());
+        if ( tableDefinition.getKeyspace().equals( cassandraFig.getApplicationKeyspace() )) {
+            dataStaxCluster.getApplicationSession().execute( CQL );
+        } else {
+            dataStaxCluster.getApplicationLocalSession().execute( CQL );
+        }
+
+        logger.info("Created table: {} in keyspace {}",
+            tableDefinition.getTableName(), tableDefinition.getKeyspace());
 
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
index caa6294..c45fdd1 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
@@ -115,6 +115,17 @@ public class ColumnNameIteratorTest {
             public int[] getShardSettings() {
                 return new int[]{20};
             }
+
+            @Override
+            public String getApplicationKeyspace() {
+                return cassandraFig.getApplicationKeyspace();
+            }
+
+            @Override
+            public String getApplicationLocalKeyspace() {
+                return cassandraFig.getApplicationLocalKeyspace();
+            }
+
         };
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
index b31fa2f..5cdf0e1 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
@@ -118,6 +118,17 @@ public class MultiKeyColumnNameIteratorTest {
             public int[] getShardSettings() {
                 return new int[]{20};
             }
+
+            @Override
+            public String getApplicationKeyspace() {
+                return cassandraFig.getApplicationKeyspace();
+            }
+
+            @Override
+            public String getApplicationLocalKeyspace() {
+                return cassandraFig.getApplicationLocalKeyspace();
+            }
+
         };
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
index ea5359e..6331941 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
@@ -122,6 +122,16 @@ public class MultiRowColumnIteratorTest {
             public int[] getShardSettings() {
                 return new int[]{20};
             }
+
+            @Override
+            public String getApplicationKeyspace() {
+                return cassandraFig.getApplicationKeyspace();
+            }
+
+            @Override
+            public String getApplicationLocalKeyspace() {
+                return cassandraFig.getApplicationLocalKeyspace();
+            }
         };
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
index 37311ba..8531bfd 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
@@ -70,7 +70,7 @@ public class CQLUtilsTest {
 
 
 
-        TableDefinitionImpl table1 = new TableDefinitionImpl(
+        TableDefinitionImpl table1 = new TableDefinitionImpl( cassandraFig.getApplicationKeyspace(),
             CQLUtils.quote("table1"),
             partitionKeys,
             columnKeys,
@@ -122,7 +122,7 @@ public class CQLUtilsTest {
 
 
 
-        TableDefinitionImpl table1 = new TableDefinitionImpl(
+        TableDefinitionImpl table1 = new TableDefinitionImpl( cassandraFig.getApplicationKeyspace(),
             CQLUtils.quote("table1"),
             partitionKeys,
             columnKeys,
@@ -165,7 +165,7 @@ public class CQLUtilsTest {
 
 
 
-        TableDefinitionImpl table1 = new TableDefinitionImpl(
+        TableDefinitionImpl table1 = new TableDefinitionImpl( cassandraFig.getApplicationKeyspace(),
             CQLUtils.quote("table1"),
             partitionKeys,
             columnKeys,

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
index b5f98d9..ac9167b 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
@@ -33,7 +33,7 @@ public class TableDefinitionTest {
     public void testNullTableName(){
 
         try{
-            TableDefinitionImpl table1 = new TableDefinitionImpl(null, null, null, null, null, null);
+            TableDefinitionImpl table1 = new TableDefinitionImpl(null, null, null, null, null, null, null);
         } catch (NullPointerException npe){
             assertEquals("Table name cannot be null", npe.getMessage());
         }
@@ -45,7 +45,7 @@ public class TableDefinitionTest {
     public void testNullPrimaryKeys(){
 
         try{
-            TableDefinitionImpl table1 = new TableDefinitionImpl("table1", null, null, null, null, null);
+            TableDefinitionImpl table1 = new TableDefinitionImpl(null, "table1", null, null, null, null, null);
         } catch (NullPointerException npe){
             assertEquals("Primary Key(s) cannot be null", npe.getMessage());
         }
@@ -57,7 +57,7 @@ public class TableDefinitionTest {
     public void testNullColumns(){
 
         try{
-            TableDefinitionImpl table1 = new TableDefinitionImpl("table1",
+            TableDefinitionImpl table1 = new TableDefinitionImpl(null, "table1",
                 new ArrayList<>(), null, null, null, null);
         } catch (NullPointerException npe){
             assertEquals("Columns cannot be null", npe.getMessage());
@@ -70,7 +70,7 @@ public class TableDefinitionTest {
     public void testNullCacheOption(){
 
         try{
-            TableDefinitionImpl table1 = new TableDefinitionImpl("table1",
+            TableDefinitionImpl table1 = new TableDefinitionImpl(null, "table1",
                 new ArrayList<>(),
                 new ArrayList<>(), new HashMap<>(), null, null);
         } catch (NullPointerException npe){

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/guice/MigrationManagerRule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/guice/MigrationManagerRule.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/guice/MigrationManagerRule.java
index 7e02a8e..4e5ac49 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/guice/MigrationManagerRule.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/guice/MigrationManagerRule.java
@@ -31,8 +31,6 @@ import com.google.inject.Inject;
 import com.google.inject.Singleton;
 
 
-/**
- */
 @Singleton
 public class MigrationManagerRule extends ExternalResource {
     private static final Logger logger = LoggerFactory.getLogger( MigrationManagerRule.class );
@@ -47,11 +45,10 @@ public class MigrationManagerRule extends ExternalResource {
         this.migrationManager = migrationManager;
 
         try {
-                   this.migrationManager.migrate();
-               }
-               catch ( MigrationException e ) {
-                   throw new RuntimeException(e);
-               }
+            this.migrationManager.migrate();
+        } catch ( MigrationException e ) {
+            throw new RuntimeException(e);
+        }
     }
 
     @Inject

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
index 6e50c75..ab6087d 100644
--- a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
+++ b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
@@ -309,15 +309,21 @@ public class MapSerializationImpl implements MapSerialization {
     @Override
     public Collection<TableDefinition> getTables() {
 
-        final TableDefinition mapEntries =
-            new TableDefinitionImpl( MAP_ENTRIES_TABLE, MAP_ENTRIES_PARTITION_KEYS, MAP_ENTRIES_COLUMN_KEYS,
-                MAP_ENTRIES_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, MAP_ENTRIES_CLUSTERING_ORDER);
-
-        final TableDefinition mapKeys =
-            new TableDefinitionImpl( MAP_KEYS_TABLE, MAP_KEYS_PARTITION_KEYS, MAP_KEYS_COLUMN_KEYS,
-                MAP_KEYS_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, MAP_KEYS_CLUSTERING_ORDER);
-
-
+        final TableDefinition mapEntries = new TableDefinitionImpl( cassandraConfig.getApplicationKeyspace(),
+            MAP_ENTRIES_TABLE,
+            MAP_ENTRIES_PARTITION_KEYS,
+            MAP_ENTRIES_COLUMN_KEYS,
+            MAP_ENTRIES_COLUMNS,
+            TableDefinitionImpl.CacheOption.KEYS,
+            MAP_ENTRIES_CLUSTERING_ORDER);
+
+        final TableDefinition mapKeys = new TableDefinitionImpl( cassandraConfig.getApplicationKeyspace(),
+            MAP_KEYS_TABLE,
+            MAP_KEYS_PARTITION_KEYS,
+            MAP_KEYS_COLUMN_KEYS,
+            MAP_KEYS_COLUMNS,
+            TableDefinitionImpl.CacheOption.KEYS,
+            MAP_KEYS_CLUSTERING_ORDER);
 
         return Arrays.asList( mapEntries, mapKeys );
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/pom.xml b/stack/corepersistence/queue/pom.xml
index 488d9f2..153ed4b 100644
--- a/stack/corepersistence/queue/pom.xml
+++ b/stack/corepersistence/queue/pom.xml
@@ -66,6 +66,9 @@
                     <configuration>
                         <forkCount>0</forkCount>
                         <threadCount>0</threadCount>
+                        <argLine>
+                        -Xms2G -Xmx4G -Dlog4j.configuration=file:${basedir}/src/test/resources/log4j.properties
+                        </argLine>
                     </configuration>
                 </plugin>
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaFig.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaFig.java
index 6f3df11..3b901b2 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaFig.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaFig.java
@@ -38,7 +38,7 @@ public interface QakkaFig extends GuicyFig, Serializable {
 
     String QUEUE_TIMEOUT_SECONDS                  = "queue.timeout.seconds";
 
-    String QUEUE_REFRESH_MILLISECONDS             = "queue.refresh.milliseconds";
+    String QUEUE_REFRESH_MILLISECONDS             = "queue.refresh.millis";
 
     String QUEUE_INMEMORY_SIZE                    = "queue.inmemory.size";
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClient.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClient.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClient.java
index 9f40b51..d611feb 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClient.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClient.java
@@ -25,5 +25,8 @@ import com.datastax.driver.core.Session;
  * Created by Dave Johnson (snoopdave@apache.org) on 9/9/16.
  */
 public interface CassandraClient {
-    Session getSession();
+
+    Session getApplicationSession();
+
+    Session getQueueMessageSession();
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClientImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClientImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClientImpl.java
index ed665c2..d1ad442 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClientImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/core/CassandraClientImpl.java
@@ -31,19 +31,32 @@ import org.slf4j.LoggerFactory;
 public class CassandraClientImpl implements CassandraClient {
     private static final Logger logger = LoggerFactory.getLogger( CassandraClientImpl.class );
 
-    private final Session session;
+    private final DataStaxCluster dataStaxCluster;
+    private Session applicationSession = null;
+    private Session queueMessageSession = null;
+
 
     @Inject
     public CassandraClientImpl( DataStaxCluster dataStaxCluster) {
-
         logger.info("Constructing Cassandra client");
+        this.dataStaxCluster = dataStaxCluster;
+    }
 
-        this.session = dataStaxCluster.getApplicationSession();
+
+    @Override
+    public Session getApplicationSession() {
+        if ( applicationSession == null ) {
+            applicationSession = dataStaxCluster.getApplicationSession();
+        }
+        return applicationSession;
     }
 
 
     @Override
-    public Session getSession() {
-        return session;
+    public Session getQueueMessageSession() {
+        if ( queueMessageSession == null ) {
+            queueMessageSession = dataStaxCluster.getApplicationLocalSession();
+        }
+        return queueMessageSession;
     }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardMessageIterator.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardMessageIterator.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardMessageIterator.java
index 42557e6..6ec0774 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardMessageIterator.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardMessageIterator.java
@@ -143,7 +143,7 @@ public class MultiShardMessageIterator implements Iterator<DatabaseQueueMessage>
                     .limit(PAGE_SIZE);
         }
 
-        List<Row> rows = cassandraClient.getSession().execute(query).all();
+        List<Row> rows = cassandraClient.getQueueMessageSession().execute(query).all();
 
         if ( (rows == null || rows.size() == 0) && shardIterator.hasNext()) {
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/impl/AuditLogSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/impl/AuditLogSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/impl/AuditLogSerializationImpl.java
index d9dbab6..ddbd345 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/impl/AuditLogSerializationImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/impl/AuditLogSerializationImpl.java
@@ -24,6 +24,7 @@ import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Statement;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.google.inject.Inject;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl;
@@ -46,6 +47,7 @@ public class AuditLogSerializationImpl implements AuditLogSerialization {
     private static final Logger logger = LoggerFactory.getLogger( AuditLogSerializationImpl.class );
 
     private final CassandraClient cassandraClient;
+    private final CassandraFig cassandraFig;
 
     public final static String TABLE_AUDIT_LOG   = "audit_log";
 
@@ -75,7 +77,8 @@ public class AuditLogSerializationImpl implements AuditLogSerialization {
 
 
     @Inject
-    public AuditLogSerializationImpl( CassandraClient cassandraClient ) {
+    public AuditLogSerializationImpl( CassandraFig cassandraFig, CassandraClient cassandraClient ) {
+        this.cassandraFig = cassandraFig;
         this.cassandraClient = cassandraClient;
     }
 
@@ -97,7 +100,7 @@ public class AuditLogSerializationImpl implements AuditLogSerialization {
                 .value(COLUMN_MESSAGE_ID, messageId )
                 .value(COLUMN_QUEUE_MESSAGE_ID, queueMessageId )
                 .value(COLUMN_TRANSFER_TIME, System.currentTimeMillis() );
-        cassandraClient.getSession().execute(insert);
+        cassandraClient.getApplicationSession().execute(insert);
     }
 
 
@@ -107,7 +110,7 @@ public class AuditLogSerializationImpl implements AuditLogSerialization {
         Statement query = QueryBuilder.select().all().from(TABLE_AUDIT_LOG)
             .where( QueryBuilder.eq( COLUMN_MESSAGE_ID, messageId ) );
 
-        ResultSet rs = cassandraClient.getSession().execute( query );
+        ResultSet rs = cassandraClient.getApplicationSession().execute( query );
 
         final List<AuditLog> auditLogs = rs.all().stream().map( row ->
             new AuditLog(
@@ -143,6 +146,7 @@ public class AuditLogSerializationImpl implements AuditLogSerialization {
 
     @Override
     public Collection<TableDefinition> getTables() {
-        return Collections.singletonList( new TableDefinitionStringImpl( TABLE_AUDIT_LOG, CQL ) );
+        return Collections.singletonList(
+            new TableDefinitionStringImpl( cassandraFig.getApplicationKeyspace(), TABLE_AUDIT_LOG, CQL ) );
     }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/MessageCounterSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/MessageCounterSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/MessageCounterSerializationImpl.java
index 65ffc47..5206ec7 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/MessageCounterSerializationImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/MessageCounterSerializationImpl.java
@@ -24,6 +24,7 @@ import com.datastax.driver.core.Statement;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl;
@@ -50,6 +51,7 @@ public class MessageCounterSerializationImpl implements ShardCounterSerializatio
     private static final Logger logger = LoggerFactory.getLogger( MessageCounterSerializationImpl.class );
 
     private final CassandraClient cassandraClient;
+    private final CassandraFig cassandraFig;
 
     final static String TABLE_SHARD_COUNTERS       = "counters";
     final static String COLUMN_QUEUE_NAME    = "queue_name";
@@ -93,7 +95,8 @@ public class MessageCounterSerializationImpl implements ShardCounterSerializatio
 
 
     @Inject
-    public MessageCounterSerializationImpl(QakkaFig qakkaFig, CassandraClient cassandraClient ) {
+    public MessageCounterSerializationImpl( CassandraFig cassandraFig, QakkaFig qakkaFig, CassandraClient cassandraClient ) {
+        this.cassandraFig = cassandraFig;
         this.maxInMemoryIncrement = qakkaFig.getMaxInMemoryShardCounter();
         this.cassandraClient = cassandraClient;
     }
@@ -166,7 +169,7 @@ public class MessageCounterSerializationImpl implements ShardCounterSerializatio
                 .and(   QueryBuilder.eq(   COLUMN_SHARD_TYPE, type.toString() ) )
                 .and(   QueryBuilder.eq(   COLUMN_SHARD_ID, shardId ) )
                 .with(  QueryBuilder.incr( COLUMN_COUNTER_VALUE, increment ) );
-        cassandraClient.getSession().execute( update );
+        cassandraClient.getQueueMessageSession().execute( update );
     }
 
 
@@ -177,7 +180,7 @@ public class MessageCounterSerializationImpl implements ShardCounterSerializatio
                 .and( QueryBuilder.eq( COLUMN_SHARD_TYPE, type.toString()) )
                 .and( QueryBuilder.eq( COLUMN_SHARD_ID, shardId ) );
 
-        ResultSet resultSet = cassandraClient.getSession().execute( query );
+        ResultSet resultSet = cassandraClient.getQueueMessageSession().execute( query );
         List<Row> all = resultSet.all();
 
         if ( all.size() > 1 ) {
@@ -198,7 +201,8 @@ public class MessageCounterSerializationImpl implements ShardCounterSerializatio
 
     @Override
     public Collection<TableDefinition> getTables() {
-        return Collections.singletonList( new TableDefinitionStringImpl( TABLE_SHARD_COUNTERS, CQL ) );
+        return Collections.singletonList(
+            new TableDefinitionStringImpl( cassandraFig.getApplicationLocalKeyspace(), TABLE_SHARD_COUNTERS, CQL ) );
     }
 
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/QueueMessageSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/QueueMessageSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/QueueMessageSerializationImpl.java
index f55b936..99ff783 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/QueueMessageSerializationImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/QueueMessageSerializationImpl.java
@@ -28,6 +28,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl;
@@ -52,6 +53,7 @@ public class QueueMessageSerializationImpl implements QueueMessageSerialization
     private static final Logger logger = LoggerFactory.getLogger( QueueMessageSerializationImpl.class );
 
     private final CassandraClient cassandraClient;
+    private final CassandraFig cassandraFig;
 
     private final ActorSystemFig            actorSystemFig;
     private final ShardStrategy             shardStrategy;
@@ -107,11 +109,13 @@ public class QueueMessageSerializationImpl implements QueueMessageSerialization
 
     @Inject
     public QueueMessageSerializationImpl(
+            CassandraFig              cassandraFig,
             ActorSystemFig            actorSystemFig,
             ShardStrategy             shardStrategy,
             ShardCounterSerialization shardCounterSerialization,
             CassandraClient           cassandraClient
         ) {
+        this.cassandraFig              = cassandraFig;
         this.actorSystemFig            = actorSystemFig;
         this.shardStrategy             = shardStrategy;
         this.shardCounterSerialization = shardCounterSerialization;
@@ -149,7 +153,7 @@ public class QueueMessageSerializationImpl implements QueueMessageSerialization
                 .value( COLUMN_INFLIGHT_AT,      inflightAt )
                 .value( COLUMN_QUEUED_AT,        queuedAt);
 
-        cassandraClient.getSession().execute(insert);
+        cassandraClient.getQueueMessageSession().execute(insert);
 
         shardCounterSerialization.incrementCounter( message.getQueueName(), shardType, message.getShardId(), 1 );
 
@@ -191,7 +195,7 @@ public class QueueMessageSerializationImpl implements QueueMessageSerialization
                 .and(shardIdClause)
                 .and(queueMessageIdClause);
 
-        Row row = cassandraClient.getSession().execute(select).one();
+        Row row = cassandraClient.getQueueMessageSession().execute(select).one();
 
         if (row == null) {
             return null;
@@ -240,7 +244,7 @@ public class QueueMessageSerializationImpl implements QueueMessageSerialization
                 .and(shardIdClause)
                 .and(queueMessageIdClause);
 
-        ResultSet resultSet = cassandraClient.getSession().execute( delete );
+        ResultSet resultSet = cassandraClient.getQueueMessageSession().execute( delete );
 
         String s = "s";
     }
@@ -253,7 +257,7 @@ public class QueueMessageSerializationImpl implements QueueMessageSerialization
 
         Statement select = QueryBuilder.select().from( TABLE_MESSAGE_DATA).where(messageIdClause);
 
-        Row row = cassandraClient.getSession().execute(select).one();
+        Row row = cassandraClient.getApplicationSession().execute(select).one();
         if ( row == null ) {
             return null;
         }
@@ -273,7 +277,7 @@ public class QueueMessageSerializationImpl implements QueueMessageSerialization
                 .value( COLUMN_MESSAGE_DATA, messageBody.getBlob())
                 .value( COLUMN_CONTENT_TYPE, messageBody.getContentType());
 
-        cassandraClient.getSession().execute(insert);
+        cassandraClient.getApplicationSession().execute(insert);
     }
 
 
@@ -285,7 +289,7 @@ public class QueueMessageSerializationImpl implements QueueMessageSerialization
         Statement delete = QueryBuilder.delete().from(TABLE_MESSAGE_DATA)
                 .where(messageIdClause);
 
-        cassandraClient.getSession().execute(delete);
+        cassandraClient.getApplicationSession().execute(delete);
     }
 
 
@@ -311,9 +315,15 @@ public class QueueMessageSerializationImpl implements QueueMessageSerialization
     @Override
     public Collection<TableDefinition> getTables() {
         return Lists.newArrayList(
-                new TableDefinitionStringImpl( TABLE_MESSAGES_AVAILABLE, MESSAGES_AVAILABLE ),
-                new TableDefinitionStringImpl( TABLE_MESSAGES_INFLIGHT, MESSAGES_INFLIGHT ),
-                new TableDefinitionStringImpl( TABLE_MESSAGE_DATA, MESSAGE_DATA )
+
+            new TableDefinitionStringImpl( cassandraFig.getApplicationLocalKeyspace(),
+                TABLE_MESSAGES_AVAILABLE, MESSAGES_AVAILABLE ),
+
+            new TableDefinitionStringImpl( cassandraFig.getApplicationLocalKeyspace(),
+                TABLE_MESSAGES_INFLIGHT, MESSAGES_INFLIGHT ),
+
+            new TableDefinitionStringImpl( cassandraFig.getApplicationKeyspace(),
+                TABLE_MESSAGE_DATA, MESSAGE_DATA )
         );
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/impl/QueueSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/impl/QueueSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/impl/QueueSerializationImpl.java
index 932097a..07a201c 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/impl/QueueSerializationImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/impl/QueueSerializationImpl.java
@@ -26,6 +26,7 @@ import com.datastax.driver.core.Statement;
 import com.datastax.driver.core.querybuilder.Clause;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.google.inject.Inject;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl;
@@ -46,6 +47,7 @@ public class QueueSerializationImpl implements QueueSerialization {
     private static final Logger logger = LoggerFactory.getLogger( QueueMessageSerializationImpl.class );
 
     private final CassandraClient cassandraClient;
+    private final CassandraFig cassandraFig;
 
     public final static String COLUMN_QUEUE_NAME = "queue_name";
     public final static String COLUMN_REGIONS = "regions";
@@ -72,7 +74,8 @@ public class QueueSerializationImpl implements QueueSerialization {
 
 
     @Inject
-    public QueueSerializationImpl( CassandraClient cassandraClient ) {
+    public QueueSerializationImpl( CassandraFig cassandraFig,  CassandraClient cassandraClient ) {
+        this.cassandraFig = cassandraFig;
         this.cassandraClient = cassandraClient;
     }
 
@@ -90,7 +93,7 @@ public class QueueSerializationImpl implements QueueSerialization {
                 .value(COLUMN_DEAD_LETTER_QUEUE, queue.getDeadLetterQueue());
 
 
-        cassandraClient.getSession().execute(insert);
+        cassandraClient.getApplicationSession().execute(insert);
 
     }
 
@@ -102,7 +105,7 @@ public class QueueSerializationImpl implements QueueSerialization {
         Statement query = QueryBuilder.select().all().from(TABLE_QUEUES)
                 .where(queueNameClause);
 
-        Row row = cassandraClient.getSession().execute(query).one();
+        Row row = cassandraClient.getApplicationSession().execute(query).one();
 
         if(row == null){
             return null;
@@ -129,14 +132,14 @@ public class QueueSerializationImpl implements QueueSerialization {
         Statement delete = QueryBuilder.delete().from(TABLE_QUEUES)
                 .where(queueNameClause);
 
-        cassandraClient.getSession().execute(delete);
+        cassandraClient.getApplicationSession().execute(delete);
     }
 
     @Override
     public List<String> getListOfQueues() {
 
         Statement select = QueryBuilder.select().all().from( TABLE_QUEUES );
-        ResultSet rs = cassandraClient.getSession().execute( select );
+        ResultSet rs = cassandraClient.getApplicationSession().execute( select );
 
         return rs.all().stream()
                 .map( row -> row.getString( COLUMN_QUEUE_NAME ))
@@ -151,7 +154,8 @@ public class QueueSerializationImpl implements QueueSerialization {
 
     @Override
     public Collection<TableDefinition> getTables() {
-        return Collections.singletonList( new TableDefinitionStringImpl( "queues", CQL ) );
+        return Collections.singletonList(
+            new TableDefinitionStringImpl( cassandraFig.getApplicationKeyspace(), "queues", CQL ) );
     }
 
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIterator.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIterator.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIterator.java
index 31e31ce..402d429 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIterator.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIterator.java
@@ -108,7 +108,7 @@ public class ShardIterator implements Iterator<Shard> {
                 .and(shardIdClause)
                 .limit(PAGE_SIZE);
 
-        List<Row> rows = cassandraClient.getSession().execute(query).all();
+        List<Row> rows = cassandraClient.getQueueMessageSession().execute(query).all();
 
 
         currentIterator = getIteratorFromRows(rows);

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardCounterSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardCounterSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardCounterSerializationImpl.java
index 9158412..f14d234 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardCounterSerializationImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardCounterSerializationImpl.java
@@ -24,6 +24,7 @@ import com.datastax.driver.core.Statement;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl;
@@ -50,6 +51,7 @@ public class ShardCounterSerializationImpl implements ShardCounterSerialization
     private static final Logger logger = LoggerFactory.getLogger( ShardCounterSerializationImpl.class );
 
     private final CassandraClient cassandraClient;
+    private final CassandraFig cassandraFig;
 
     final static String TABLE_COUNTERS       = "shard_counters";
     final static String COLUMN_QUEUE_NAME    = "queue_name";
@@ -89,7 +91,8 @@ public class ShardCounterSerializationImpl implements ShardCounterSerialization
 
 
     @Inject
-    public ShardCounterSerializationImpl(QakkaFig qakkaFig, CassandraClient cassandraClient ) {
+    public ShardCounterSerializationImpl( CassandraFig cassandraFig, QakkaFig qakkaFig, CassandraClient cassandraClient ) {
+        this.cassandraFig = cassandraFig;
         this.maxInMemoryIncrement = qakkaFig.getMaxInMemoryShardCounter();
         this.cassandraClient = cassandraClient;
     }
@@ -162,7 +165,7 @@ public class ShardCounterSerializationImpl implements ShardCounterSerialization
                 .and(   QueryBuilder.eq(   COLUMN_SHARD_TYPE, type.toString() ) )
                 .and(   QueryBuilder.eq(   COLUMN_SHARD_ID, shardId ) )
                 .with(  QueryBuilder.incr( COLUMN_COUNTER_VALUE, increment ) );
-        cassandraClient.getSession().execute( update );
+        cassandraClient.getQueueMessageSession().execute( update );
     }
 
 
@@ -173,7 +176,7 @@ public class ShardCounterSerializationImpl implements ShardCounterSerialization
                 .and( QueryBuilder.eq( COLUMN_SHARD_TYPE, type.toString()) )
                 .and( QueryBuilder.eq( COLUMN_SHARD_ID, shardId ) );
 
-        ResultSet resultSet = cassandraClient.getSession().execute( query );
+        ResultSet resultSet = cassandraClient.getQueueMessageSession().execute( query );
         List<Row> all = resultSet.all();
 
         if ( all.size() > 1 ) {
@@ -193,6 +196,7 @@ public class ShardCounterSerializationImpl implements ShardCounterSerialization
 
     @Override
     public Collection<TableDefinition> getTables() {
-        return Collections.singletonList( new TableDefinitionStringImpl( "shard_counters", CQL ) );
+        return Collections.singletonList(
+            new TableDefinitionStringImpl( cassandraFig.getApplicationLocalKeyspace(), "shard_counters", CQL ) );
     }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/483ca0f5/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardSerializationImpl.java
index 7b9fd8e..989622b 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardSerializationImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/ShardSerializationImpl.java
@@ -26,6 +26,7 @@ import com.datastax.driver.core.querybuilder.Clause;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl;
@@ -45,6 +46,7 @@ public class ShardSerializationImpl implements ShardSerialization {
     private static final Logger logger = LoggerFactory.getLogger( ShardSerializationImpl.class );
 
     private final CassandraClient cassandraClient;
+    private final CassandraFig cassandraFig;
 
     public final static String COLUMN_QUEUE_NAME = "queue_name";
     public final static String COLUMN_REGION = "region";
@@ -80,7 +82,8 @@ public class ShardSerializationImpl implements ShardSerialization {
 
 
     @Inject
-    public ShardSerializationImpl( CassandraClient cassandraClient ) {
+    public ShardSerializationImpl( CassandraFig cassandraFig,  CassandraClient cassandraClient ) {
+        this.cassandraFig = cassandraFig;
         this.cassandraClient = cassandraClient;
     }
 
@@ -93,7 +96,7 @@ public class ShardSerializationImpl implements ShardSerialization {
                 .value(COLUMN_ACTIVE, 1)
                 .value(COLUMN_POINTER, shard.getPointer());
 
-        cassandraClient.getSession().execute(insert);
+        cassandraClient.getQueueMessageSession().execute(insert);
 
     }
 
@@ -112,7 +115,7 @@ public class ShardSerializationImpl implements ShardSerialization {
                 .and(activeClause)
                 .and(shardIdClause);
 
-        Row row = cassandraClient.getSession().execute(select).one();
+        Row row = cassandraClient.getQueueMessageSession().execute(select).one();
 
         if (row == null){
             return null;
@@ -145,7 +148,7 @@ public class ShardSerializationImpl implements ShardSerialization {
                 .and(activeClause)
                 .and(shardIdClause);
 
-        cassandraClient.getSession().execute(delete);
+        cassandraClient.getQueueMessageSession().execute(delete);
 
     }
 
@@ -165,7 +168,7 @@ public class ShardSerializationImpl implements ShardSerialization {
                 .and(activeClause)
                 .and(shardIdClause);
 
-        cassandraClient.getSession().execute(update);
+        cassandraClient.getQueueMessageSession().execute(update);
 
     }
 
@@ -192,8 +195,10 @@ public class ShardSerializationImpl implements ShardSerialization {
     @Override
     public Collection<TableDefinition> getTables() {
         return Lists.newArrayList(
-                new TableDefinitionStringImpl( TABLE_SHARDS_MESSAGES_AVAILABLE, SHARDS_MESSAGES_AVAILABLE ),
-                new TableDefinitionStringImpl( TABLE_SHARDS_MESSAGES_INFLIGHT, SHARDS_MESSAGES_AVAILABLE_INFLIGHT )
+                new TableDefinitionStringImpl( cassandraFig.getApplicationLocalKeyspace(),
+                    TABLE_SHARDS_MESSAGES_AVAILABLE, SHARDS_MESSAGES_AVAILABLE ),
+                new TableDefinitionStringImpl( cassandraFig.getApplicationLocalKeyspace(),
+                    TABLE_SHARDS_MESSAGES_INFLIGHT, SHARDS_MESSAGES_AVAILABLE_INFLIGHT )
         );
     }
 


[04/25] usergrid git commit: Make TableDefinition into an interface, move to cassandra-all 2.1.14

Posted by sn...@apache.org.
Make TableDefinition into an interface, move to cassandra-all 2.1.14


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

Branch: refs/heads/usergrid-1318-queue
Commit: 1574b3af4765777f8693c79b6c1bea836812e6bc
Parents: a8cd381
Author: Dave Johnson <sn...@apache.org>
Authored: Fri Sep 9 16:35:38 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Fri Sep 9 16:35:38 2016 -0400

----------------------------------------------------------------------
 .../impl/ScopedCacheSerializationImpl.java      |  5 ++--
 .../MvccEntitySerializationStrategyImpl.java    |  4 +--
 ...vccEntitySerializationStrategyProxyImpl.java |  4 +--
 .../MvccEntitySerializationStrategyV3Impl.java  |  4 +--
 .../MvccLogEntrySerializationProxyImpl.java     |  4 +--
 ...MvccLogEntrySerializationStrategyV1Impl.java |  4 +--
 ...MvccLogEntrySerializationStrategyV2Impl.java |  4 +--
 .../UniqueValueSerializationStrategyImpl.java   | 16 +++---------
 ...iqueValueSerializationStrategyProxyImpl.java |  4 +--
 .../UniqueValueSerializationStrategyV1Impl.java | 15 ++++++-----
 .../UniqueValueSerializationStrategyV2Impl.java | 15 ++++++-----
 .../persistence/core/datastax/CQLUtils.java     |  4 ++-
 .../core/datastax/impl/TableDefinitionImpl.java |  6 ++---
 .../data/MigrationInfoSerializationImpl.java    |  4 +--
 .../migration/schema/MigrationManagerImpl.java  | 27 +++++++++-----------
 .../EdgeMetadataSerializationProxyImpl.java     |  4 +--
 .../impl/EdgeMetadataSerializationV1Impl.java   |  4 +--
 .../impl/EdgeMetadataSerializationV2Impl.java   |  4 +--
 .../impl/NodeSerializationImpl.java             |  4 +--
 .../shard/impl/EdgeShardSerializationImpl.java  |  4 +--
 .../shard/impl/SizebasedEdgeColumnFamilies.java |  4 +--
 .../map/impl/MapSerializationImpl.java          | 10 +++++---
 stack/corepersistence/pom.xml                   |  2 +-
 .../persistence/queue/QueueManager.java         |  2 +-
 24 files changed, 76 insertions(+), 82 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java b/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
index 29503fa..7e4adb0 100644
--- a/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
+++ b/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
@@ -32,6 +32,7 @@ import org.apache.usergrid.persistence.cache.CacheScope;
 import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.astyanax.*;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
 import org.apache.usergrid.persistence.core.shard.ExpandingShardLocator;
 import org.apache.usergrid.persistence.core.shard.StringHashUtils;
@@ -276,9 +277,9 @@ public class ScopedCacheSerializationImpl<K,V> implements ScopedCacheSerializati
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
-        final TableDefinitionImpl scopedCache =
+        final TableDefinition scopedCache =
             new TableDefinitionImpl( SCOPED_CACHE_TABLE, SCOPED_CACHE_PARTITION_KEYS, SCOPED_CACHE_COLUMN_KEYS,
                 SCOPED_CACHE_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, SCOPED_CACHE_CLUSTERING_ORDER);
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
index 5f37491..2d7892a 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
@@ -25,7 +25,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.UUID;
 
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -344,7 +344,7 @@ public abstract class MvccEntitySerializationStrategyImpl implements MvccEntityS
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
         return Collections.emptyList();
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyProxyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyProxyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyProxyImpl.java
index 395ed97..19735cc 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyProxyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyProxyImpl.java
@@ -27,7 +27,7 @@ import org.apache.usergrid.persistence.collection.MvccEntity;
 import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.impl.migration.CollectionMigrationPlugin;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.migration.data.MigrationInfoCache;
 import org.apache.usergrid.persistence.core.migration.data.MigrationRelationship;
 import org.apache.usergrid.persistence.core.migration.data.VersionedMigrationSet;
@@ -188,7 +188,7 @@ public class MvccEntitySerializationStrategyProxyImpl implements MvccEntitySeria
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
         return Collections.emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
index 140d953..ecd0f5c 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
@@ -16,7 +16,7 @@ import com.fasterxml.jackson.core.JsonFactory;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.netflix.astyanax.serializers.StringSerializer;
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -306,7 +306,7 @@ public class MvccEntitySerializationStrategyV3Impl implements MvccEntitySerializ
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
         return Collections.emptyList();
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationProxyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationProxyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationProxyImpl.java
index 4e87f6d..b27651d 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationProxyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationProxyImpl.java
@@ -30,7 +30,7 @@ import org.apache.usergrid.persistence.collection.VersionSet;
 import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.impl.migration.CollectionMigrationPlugin;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.migration.data.MigrationInfoCache;
 import org.apache.usergrid.persistence.core.migration.data.MigrationRelationship;
 import org.apache.usergrid.persistence.core.migration.data.VersionedMigrationSet;
@@ -148,7 +148,7 @@ public class MvccLogEntrySerializationProxyImpl implements MvccLogEntrySerializa
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables(){
+    public Collection<TableDefinition> getTables(){
         return Collections.emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV1Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV1Impl.java
index 0bf48d7..62c35bb 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV1Impl.java
@@ -35,7 +35,7 @@ import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.model.entity.Id;
 
 import com.google.inject.Inject;
@@ -118,7 +118,7 @@ public class MvccLogEntrySerializationStrategyV1Impl
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
         return Collections.emptyList();
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV2Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV2Impl.java
index 28e0723..325762d 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV2Impl.java
@@ -35,7 +35,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.model.entity.Id;
 
 import com.google.inject.Inject;
@@ -106,7 +106,7 @@ public class MvccLogEntrySerializationStrategyV2Impl extends MvccLogEntrySeriali
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
         return Collections.emptyList();
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
index 14639cf..450c098 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
@@ -29,7 +29,7 @@ import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.datastax.driver.core.querybuilder.Using;
 import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.model.entity.SimpleId;
 import org.apache.usergrid.persistence.model.field.*;
 
@@ -62,10 +62,6 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     private final String TABLE_UNIQUE_VALUES;
     private final String TABLE_UNIQUE_VALUES_LOG;
 
-    private final Map COLUMNS_UNIQUE_VALUES;
-    private final Map COLUMNS_UNIQUE_VALUES_LOG;
-
-
     public static final int COL_VALUE = 0x0;
 
     private final Comparator<UniqueValue> uniqueValueComparator = new UniqueValueComparator();
@@ -96,10 +92,6 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
 
         TABLE_UNIQUE_VALUES = getUniqueValuesTable().getTableName();
         TABLE_UNIQUE_VALUES_LOG = getEntityUniqueLogTable().getTableName();
-
-        COLUMNS_UNIQUE_VALUES = getUniqueValuesTable().getColumns();
-        COLUMNS_UNIQUE_VALUES_LOG = getEntityUniqueLogTable().getColumns();
-
     }
 
     @Override
@@ -495,12 +487,12 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     public abstract Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies();
 
     @Override
-    public abstract Collection<TableDefinitionImpl> getTables();
+    public abstract Collection<TableDefinition> getTables();
 
     /**
      * Get the CQL table definition for the unique values log table
      */
-    protected abstract TableDefinitionImpl getUniqueValuesTable();
+    protected abstract TableDefinition getUniqueValuesTable();
 
 
     protected abstract List<Object> deserializePartitionKey(ByteBuffer bb);
@@ -522,7 +514,7 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     /**
      * Get the CQL table definition for the unique values log table
      */
-    protected abstract TableDefinitionImpl getEntityUniqueLogTable();
+    protected abstract TableDefinition getEntityUniqueLogTable();
 
 
     public class AllUniqueFieldsIterator implements Iterable<UniqueValue>, Iterator<UniqueValue> {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
index 6bb03ac..61f0f80 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
@@ -31,7 +31,7 @@ import org.apache.usergrid.persistence.collection.serialization.UniqueValueSeria
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSet;
 import org.apache.usergrid.persistence.collection.serialization.impl.migration.CollectionMigrationPlugin;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.migration.data.MigrationInfoCache;
 import org.apache.usergrid.persistence.core.migration.data.MigrationRelationship;
 import org.apache.usergrid.persistence.core.migration.data.VersionedMigrationSet;
@@ -164,7 +164,7 @@ public class UniqueValueSerializationStrategyProxyImpl implements UniqueValueSer
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
         return Collections.emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
index 9f59906..4ee5b70 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
@@ -33,6 +33,7 @@ import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.field.Field;
@@ -73,11 +74,11 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
         new HashMap<String, String>(){{ put( "column1", "ASC" ); }};
 
 
-    private final static TableDefinitionImpl uniqueValues =
+    private final static TableDefinition uniqueValues =
         new TableDefinitionImpl( UNIQUE_VALUES_TABLE, UNIQUE_VALUES_PARTITION_KEYS, UNIQUE_VALUES_COLUMN_KEYS,
             UNIQUE_VALUES_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, UNIQUE_VALUES_CLUSTERING_ORDER);
 
-    private final static TableDefinitionImpl uniqueValuesLog =
+    private final static TableDefinition uniqueValuesLog =
         new TableDefinitionImpl( UNIQUE_VALUES_LOG_TABLE, UNIQUE_VALUES_LOG_PARTITION_KEYS, UNIQUE_VALUES_LOG_COLUMN_KEYS,
             UNIQUE_VALUES_LOG_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, UNIQUE_VALUES_LOG_CLUSTERING_ORDER);
 
@@ -106,10 +107,10 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
-        final TableDefinitionImpl uniqueValues = getUniqueValuesTable();
-        final TableDefinitionImpl uniqueValuesLog = getEntityUniqueLogTable();
+        final TableDefinition uniqueValues = getUniqueValuesTable();
+        final TableDefinition uniqueValuesLog = getEntityUniqueLogTable();
 
         return Arrays.asList( uniqueValues, uniqueValuesLog );
 
@@ -118,14 +119,14 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
 
 
     @Override
-    protected TableDefinitionImpl getUniqueValuesTable(){
+    protected TableDefinition getUniqueValuesTable(){
 
         return uniqueValues;
     }
 
 
     @Override
-    protected TableDefinitionImpl getEntityUniqueLogTable(){
+    protected TableDefinition getEntityUniqueLogTable(){
 
         return uniqueValuesLog;
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
index 1af4846..522dad9 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
@@ -32,6 +32,7 @@ import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
 import org.apache.usergrid.persistence.model.entity.Id;
 
@@ -68,11 +69,11 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
     private static final Map<String, String> UNIQUE_VALUES_LOG_CLUSTERING_ORDER =
         new HashMap<String, String>(){{ put( "column1", "ASC" );}};
 
-    private final static TableDefinitionImpl uniqueValues =
+    private final static TableDefinition uniqueValues =
         new TableDefinitionImpl( UNIQUE_VALUES_TABLE, UNIQUE_VALUES_PARTITION_KEYS, UNIQUE_VALUES_COLUMN_KEYS,
             UNIQUE_VALUES_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, UNIQUE_VALUES_CLUSTERING_ORDER);
 
-    private final static TableDefinitionImpl uniqueValuesLog =
+    private final static TableDefinition uniqueValuesLog =
         new TableDefinitionImpl( UNIQUE_VALUES_LOG_TABLE, UNIQUE_VALUES_LOG_PARTITION_KEYS, UNIQUE_VALUES_LOG_COLUMN_KEYS,
             UNIQUE_VALUES_LOG_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, UNIQUE_VALUES_LOG_CLUSTERING_ORDER);
 
@@ -101,10 +102,10 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
-        final TableDefinitionImpl uniqueValues = getUniqueValuesTable();
-        final TableDefinitionImpl uniqueValuesLog = getEntityUniqueLogTable();
+        final TableDefinition uniqueValues = getUniqueValuesTable();
+        final TableDefinition uniqueValuesLog = getEntityUniqueLogTable();
 
         return Arrays.asList( uniqueValues, uniqueValuesLog );
 
@@ -112,13 +113,13 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
 
 
     @Override
-    protected TableDefinitionImpl getUniqueValuesTable(){
+    protected TableDefinition getUniqueValuesTable(){
         return uniqueValues;
     }
 
 
     @Override
-    protected TableDefinitionImpl getEntityUniqueLogTable(){
+    protected TableDefinition getEntityUniqueLogTable(){
         return uniqueValuesLog;
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
index 698915b..082f2d5 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
@@ -26,7 +26,9 @@ import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
 
 import java.nio.ByteBuffer;
-import java.util.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringJoiner;
 
 public class CQLUtils {
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionImpl.java
index a5a92e2..a39c47e 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/TableDefinitionImpl.java
@@ -23,7 +23,6 @@ package org.apache.usergrid.persistence.core.datastax.impl;
 import com.datastax.driver.core.DataType;
 import com.google.common.base.Preconditions;
 import org.apache.usergrid.persistence.core.CassandraFig;
-import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.util.StringUtils;
 
@@ -32,9 +31,8 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.StringJoiner;
 
-import static org.apache.usergrid.persistence.core.datastax.CQLUtils.getCachingOptions;
-import static org.apache.usergrid.persistence.core.datastax.CQLUtils.getMapAsCQLString;
-import static org.apache.usergrid.persistence.core.datastax.CQLUtils.spaceSeparatedKeyValue;
+import static org.apache.usergrid.persistence.core.datastax.CQLUtils.*;
+
 
 public class TableDefinitionImpl implements TableDefinition {
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/MigrationInfoSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/MigrationInfoSerializationImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/MigrationInfoSerializationImpl.java
index 2fe24a9..ee04293 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/MigrationInfoSerializationImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/MigrationInfoSerializationImpl.java
@@ -27,7 +27,7 @@ import org.apache.cassandra.db.marshal.BytesType;
 import org.apache.cassandra.db.marshal.UTF8Type;
 
 import org.apache.usergrid.persistence.core.astyanax.*;
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.migration.util.AstyanaxUtils;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.entity.SimpleId;
@@ -208,7 +208,7 @@ public class MigrationInfoSerializationImpl implements MigrationInfoSerializatio
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
         return Collections.emptyList();
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
index 71b35e0..f5ec8ac 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
@@ -19,26 +19,23 @@
 package org.apache.usergrid.persistence.core.migration.schema;
 
 
-import java.util.Collection;
-import java.util.Set;
-
 import com.datastax.driver.core.KeyspaceMetadata;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.netflix.astyanax.Keyspace;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+import com.netflix.astyanax.ddl.ColumnFamilyDefinition;
+import com.netflix.astyanax.ddl.KeyspaceDefinition;
 import org.apache.usergrid.persistence.core.CassandraFig;
+import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.netflix.astyanax.Keyspace;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.ddl.ColumnFamilyDefinition;
-import com.netflix.astyanax.ddl.KeyspaceDefinition;
+import java.util.Collection;
+import java.util.Set;
 
 
 /**
@@ -80,7 +77,7 @@ public class MigrationManagerImpl implements MigrationManager {
 
                 final Collection<MultiTenantColumnFamilyDefinition> columnFamilies = migration.getColumnFamilies();
 
-                final Collection<TableDefinitionImpl> tables = migration.getTables();
+                final Collection<TableDefinition> tables = migration.getTables();
 
 
                 if ((columnFamilies == null || columnFamilies.size() == 0) &&
@@ -101,7 +98,7 @@ public class MigrationManagerImpl implements MigrationManager {
 
 
                 if ( tables != null && !tables.isEmpty() ) {
-                    for (TableDefinitionImpl tableDefinition : tables) {
+                    for (TableDefinition tableDefinition : tables) {
 
                         createTable(tableDefinition);
 
@@ -143,7 +140,7 @@ public class MigrationManagerImpl implements MigrationManager {
 
     }
 
-    private void createTable(TableDefinitionImpl tableDefinition ) throws Exception {
+    private void createTable(TableDefinition tableDefinition ) throws Exception {
 
         KeyspaceMetadata keyspaceMetadata = dataStaxCluster.getClusterSession().getCluster().getMetadata()
             .getKeyspace(CQLUtils.quote(cassandraFig.getApplicationKeyspace()));

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationProxyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationProxyImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationProxyImpl.java
index 5e90d8f..46acd1c 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationProxyImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationProxyImpl.java
@@ -26,7 +26,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -290,7 +290,7 @@ public class EdgeMetadataSerializationProxyImpl implements EdgeMetadataSerializa
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
         return Collections.emptyList();
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
index b1049f2..d7a5c80 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
@@ -37,7 +37,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefi
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
 import org.apache.usergrid.persistence.core.astyanax.StringColumnParser;
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.migration.schema.Migration;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.util.ValidationUtils;
@@ -379,7 +379,7 @@ public class EdgeMetadataSerializationV1Impl implements EdgeMetadataSerializatio
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
         return Collections.emptyList();
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
index 34cb1d2..1f81864 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
@@ -37,7 +37,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiRowColumnIterator;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.StringColumnParser;
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.migration.schema.Migration;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.shard.ExpandingShardLocator;
@@ -467,7 +467,7 @@ public class EdgeMetadataSerializationV2Impl implements EdgeMetadataSerializatio
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
         return Collections.emptyList();
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
index 12e9237..2429d5a 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
@@ -38,7 +38,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.migration.schema.Migration;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.util.ValidationUtils;
@@ -112,7 +112,7 @@ public class NodeSerializationImpl implements NodeSerialization, Migration {
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
         return Collections.emptyList();
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
index 764536e..098c152 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
@@ -34,7 +34,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.util.ValidationUtils;
 import org.apache.usergrid.persistence.graph.GraphFig;
@@ -188,7 +188,7 @@ public class EdgeShardSerializationImpl implements EdgeShardSerialization {
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
         return Collections.emptyList();
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/SizebasedEdgeColumnFamilies.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/SizebasedEdgeColumnFamilies.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/SizebasedEdgeColumnFamilies.java
index 9d0b157..f4e19d6 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/SizebasedEdgeColumnFamilies.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/SizebasedEdgeColumnFamilies.java
@@ -33,7 +33,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
-import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.DirectedEdge;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.EdgeColumnFamilies;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.EdgeRowKey;
@@ -146,7 +146,7 @@ public class SizebasedEdgeColumnFamilies implements EdgeColumnFamilies {
     }
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
         return Collections.emptyList();
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
index 6253cec..6e50c75 100644
--- a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
+++ b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
@@ -31,6 +31,7 @@ import com.datastax.driver.core.querybuilder.Using;
 import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
 import org.apache.usergrid.persistence.core.shard.ExpandingShardLocator;
 import org.apache.usergrid.persistence.core.shard.StringHashUtils;
@@ -306,13 +307,13 @@ public class MapSerializationImpl implements MapSerialization {
 
 
     @Override
-    public Collection<TableDefinitionImpl> getTables() {
+    public Collection<TableDefinition> getTables() {
 
-        final TableDefinitionImpl mapEntries =
+        final TableDefinition mapEntries =
             new TableDefinitionImpl( MAP_ENTRIES_TABLE, MAP_ENTRIES_PARTITION_KEYS, MAP_ENTRIES_COLUMN_KEYS,
                 MAP_ENTRIES_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, MAP_ENTRIES_CLUSTERING_ORDER);
 
-        final TableDefinitionImpl mapKeys =
+        final TableDefinition mapKeys =
             new TableDefinitionImpl( MAP_KEYS_TABLE, MAP_KEYS_PARTITION_KEYS, MAP_KEYS_COLUMN_KEYS,
                 MAP_KEYS_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, MAP_KEYS_CLUSTERING_ORDER);
 
@@ -381,7 +382,8 @@ public class MapSerializationImpl implements MapSerialization {
 
 
 
-    private <T> T getValuesCQL( final MapScope scope, final Collection<String> keys, final ResultsBuilderCQL<T> builder ) {
+    private <T> T getValuesCQL(
+        final MapScope scope, final Collection<String> keys, final ResultsBuilderCQL<T> builder ) {
 
         final List<ByteBuffer> serializedKeys = new ArrayList<>();
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/pom.xml b/stack/corepersistence/pom.xml
index fe976bc..b67f307 100644
--- a/stack/corepersistence/pom.xml
+++ b/stack/corepersistence/pom.xml
@@ -74,7 +74,7 @@ limitations under the License.
         <antlr.version>3.5.2</antlr.version>
         <archaius.version>0.5.12</archaius.version>
         <astyanax.version>3.9.0</astyanax.version>
-        <cassandra.version>1.2.18</cassandra.version>
+        <cassandra.version>2.1.14</cassandra.version>
         <!--        <chop.version>1.0</chop.version>-->
         <commons.codec.version>1.6</commons.codec.version>
         <commons.collections.version>3.2.1</commons.collections.version>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1574b3af/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManager.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManager.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManager.java
index 18909e4..d2e29cb 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManager.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManager.java
@@ -21,7 +21,7 @@ import java.io.IOException;
 import java.io.Serializable;
 import java.util.List;
 
-/**
+/**ctor
  * Manages queues for usergrid.  Current implementation is sqs based.
  */
 public interface QueueManager {


[06/25] usergrid git commit: Move under org.apache.usergrid.persistence package in preparation for integration into Usergrid.

Posted by sn...@apache.org.
Move under org.apache.usergrid.persistence package in preparation for integration into Usergrid.


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

Branch: refs/heads/usergrid-1318-queue
Commit: 9016fd290e80b88ba3199c0020fca7722b82d780
Parents: 1574b3a
Author: Dave Johnson <sn...@apache.org>
Authored: Fri Sep 9 17:31:44 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Fri Sep 9 17:31:44 2016 -0400

----------------------------------------------------------------------
 .../asyncevents/AsyncEventServiceImpl.java      |  58 +++----
 .../asyncevents/AsyncIndexProvider.java         |  12 +-
 .../index/AsyncEventServiceImplTest.java        |   8 +-
 .../usergrid/mq/LegacyQueuePathsTest.java       |  48 ++++++
 .../org/apache/usergrid/mq/QueuePathsTest.java  |  48 ------
 .../usergrid/persistence/queue/LegacyQueue.java |  35 +++++
 .../persistence/queue/LegacyQueueFig.java       | 106 +++++++++++++
 .../persistence/queue/LegacyQueueManager.java   |  79 ++++++++++
 .../queue/LegacyQueueManagerFactory.java        |  23 +++
 .../LegacyQueueManagerInternalFactory.java      |  28 ++++
 .../persistence/queue/LegacyQueueMessage.java   |  70 +++++++++
 .../persistence/queue/LegacyQueueScope.java     |  45 ++++++
 .../persistence/queue/LocalQueueManager.java    |  18 +--
 .../usergrid/persistence/queue/Queue.java       |  35 -----
 .../usergrid/persistence/queue/QueueFig.java    | 106 -------------
 .../persistence/queue/QueueManager.java         |  79 ----------
 .../persistence/queue/QueueManagerFactory.java  |  23 ---
 .../queue/QueueManagerInternalFactory.java      |  28 ----
 .../persistence/queue/QueueMessage.java         |  70 ---------
 .../usergrid/persistence/queue/QueueScope.java  |  45 ------
 .../persistence/queue/guice/QueueModule.java    |  16 +-
 .../queue/impl/LegacyQueueScopeImpl.java        |  67 ++++++++
 .../queue/impl/QueueManagerFactoryImpl.java     |  20 +--
 .../persistence/queue/impl/QueueScopeImpl.java  |  68 --------
 .../queue/impl/SNSQueueManagerImpl.java         |  48 +++---
 .../queue/util/AmazonNotificationUtils.java     |   4 +-
 .../queue/LegacyQueueManagerTest.java           | 156 +++++++++++++++++++
 .../persistence/queue/QueueManagerTest.java     | 156 -------------------
 .../notifications/ApplicationQueueManager.java  |   4 +-
 .../ApplicationQueueManagerCache.java           |   6 +-
 .../notifications/NotificationsService.java     |  19 ++-
 .../services/notifications/QueueJob.java        |   1 -
 .../services/notifications/QueueListener.java   |  29 ++--
 .../impl/ApplicationQueueManagerImpl.java       |  18 +--
 .../services/queues/ImportQueueListener.java    |   8 +-
 .../services/queues/ImportQueueManager.java     |  12 +-
 .../usergrid/services/queues/QueueListener.java |  18 +--
 37 files changed, 803 insertions(+), 811 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncEventServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncEventServiceImpl.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncEventServiceImpl.java
index 0bff887..6add88c 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncEventServiceImpl.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncEventServiceImpl.java
@@ -57,12 +57,12 @@ import org.apache.usergrid.persistence.map.impl.MapScopeImpl;
 import org.apache.usergrid.persistence.model.entity.Entity;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-import org.apache.usergrid.persistence.queue.QueueFig;
-import org.apache.usergrid.persistence.queue.QueueManager;
-import org.apache.usergrid.persistence.queue.QueueManagerFactory;
-import org.apache.usergrid.persistence.queue.QueueMessage;
-import org.apache.usergrid.persistence.queue.QueueScope;
-import org.apache.usergrid.persistence.queue.impl.QueueScopeImpl;
+import org.apache.usergrid.persistence.queue.LegacyQueueFig;
+import org.apache.usergrid.persistence.queue.LegacyQueueManager;
+import org.apache.usergrid.persistence.queue.LegacyQueueManagerFactory;
+import org.apache.usergrid.persistence.queue.LegacyQueueMessage;
+import org.apache.usergrid.persistence.queue.LegacyQueueScope;
+import org.apache.usergrid.persistence.queue.impl.LegacyQueueScopeImpl;
 
 import com.codahale.metrics.Counter;
 import com.codahale.metrics.Gauge;
@@ -104,9 +104,9 @@ public class AsyncEventServiceImpl implements AsyncEventService {
     public int MAX_TAKE = 10;
     public static final String QUEUE_NAME = "index"; //keep this short as AWS limits queue name size to 80 chars
 
-    private final QueueManager queue;
+    private final LegacyQueueManager queue;
     private final IndexProcessorFig indexProcessorFig;
-    private final QueueFig queueFig;
+    private final LegacyQueueFig queueFig;
     private final IndexProducer indexProducer;
     private final EntityCollectionManagerFactory entityCollectionManagerFactory;
     private final IndexLocationStrategyFactory indexLocationStrategyFactory;
@@ -134,7 +134,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
 
 
     @Inject
-    public AsyncEventServiceImpl(final QueueManagerFactory queueManagerFactory,
+    public AsyncEventServiceImpl(final LegacyQueueManagerFactory queueManagerFactory,
                                  final IndexProcessorFig indexProcessorFig,
                                  final IndexProducer indexProducer,
                                  final MetricsFactory metricsFactory,
@@ -143,7 +143,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
                                  final EntityIndexFactory entityIndexFactory,
                                  final EventBuilder eventBuilder,
                                  final MapManagerFactory mapManagerFactory,
-                                 final QueueFig queueFig,
+                                 final LegacyQueueFig queueFig,
                                  @EventExecutionScheduler
                                     final RxTaskScheduler rxTaskScheduler ) {
         this.indexProducer = indexProducer;
@@ -159,7 +159,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
 
         this.rxTaskScheduler = rxTaskScheduler;
 
-        QueueScope queueScope = new QueueScopeImpl(QUEUE_NAME, QueueScope.RegionImplementation.ALL);
+        LegacyQueueScope queueScope = new LegacyQueueScopeImpl(QUEUE_NAME, LegacyQueueScope.RegionImplementation.ALL);
         this.queue = queueManagerFactory.getQueueManager(queueScope);
 
         this.indexProcessorFig = indexProcessorFig;
@@ -233,7 +233,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
     /**
      * Take message from SQS
      */
-    private List<QueueMessage> take() {
+    private List<LegacyQueueMessage> take() {
 
         final Timer.Context timer = this.readTimer.time();
 
@@ -251,7 +251,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
     /**
      * Ack message in SQS
      */
-    public void ack(final List<QueueMessage> messages) {
+    public void ack(final List<LegacyQueueMessage> messages) {
 
         final Timer.Context timer = this.ackTimer.time();
 
@@ -275,7 +275,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
      * @param messages
      * @return
      */
-    private List<IndexEventResult> callEventHandlers(final List<QueueMessage> messages) {
+    private List<IndexEventResult> callEventHandlers(final List<LegacyQueueMessage> messages) {
 
         if (logger.isDebugEnabled()) {
             logger.debug("callEventHandlers with {} message(s)", messages.size());
@@ -422,7 +422,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
 
     }
 
-    private IndexOperationMessage handleEntityIndexUpdate(final QueueMessage message) {
+    private IndexOperationMessage handleEntityIndexUpdate(final LegacyQueueMessage message) {
 
         Preconditions.checkNotNull( message, "Queue Message cannot be null for handleEntityIndexUpdate" );
 
@@ -457,7 +457,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
 
     }
 
-    private IndexOperationMessage handleEdgeIndex(final QueueMessage message) {
+    private IndexOperationMessage handleEdgeIndex(final LegacyQueueMessage message) {
 
         Preconditions.checkNotNull( message, "Queue Message cannot be null for handleEdgeIndex" );
 
@@ -486,7 +486,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
         offer( new EdgeDeleteEvent( queueFig.getPrimaryRegion(), applicationScope, edge ) );
     }
 
-    private IndexOperationMessage  handleEdgeDelete(final QueueMessage message) {
+    private IndexOperationMessage  handleEdgeDelete(final LegacyQueueMessage message) {
 
         Preconditions.checkNotNull( message, "Queue Message cannot be null for handleEdgeDelete" );
 
@@ -668,7 +668,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
         offer( new EntityDeleteEvent(queueFig.getPrimaryRegion(), new EntityIdScope( applicationScope, entityId ) ) );
     }
 
-    private IndexOperationMessage handleEntityDelete(final QueueMessage message) {
+    private IndexOperationMessage handleEntityDelete(final LegacyQueueMessage message) {
 
         Preconditions.checkNotNull(message, "Queue Message cannot be null for handleEntityDelete");
 
@@ -700,7 +700,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
     }
 
 
-    private void handleInitializeApplicationIndex(final AsyncEvent event, final QueueMessage message) {
+    private void handleInitializeApplicationIndex(final AsyncEvent event, final LegacyQueueMessage message) {
         Preconditions.checkNotNull(message, "Queue Message cannot be null for handleInitializeApplicationIndex");
         Preconditions.checkArgument(event instanceof InitializeApplicationIndexEvent, String.format("Event Type for handleInitializeApplicationIndex must be APPLICATION_INDEX, got %s", event.getClass()));
 
@@ -741,15 +741,15 @@ public class AsyncEventServiceImpl implements AsyncEventService {
     private void startWorker() {
         synchronized (mutex) {
 
-            Observable<List<QueueMessage>> consumer =
-                    Observable.create( new Observable.OnSubscribe<List<QueueMessage>>() {
+            Observable<List<LegacyQueueMessage>> consumer =
+                    Observable.create( new Observable.OnSubscribe<List<LegacyQueueMessage>>() {
                         @Override
-                        public void call( final Subscriber<? super List<QueueMessage>> subscriber ) {
+                        public void call( final Subscriber<? super List<LegacyQueueMessage>> subscriber ) {
 
                             //name our thread so it's easy to see
                             Thread.currentThread().setName( "QueueConsumer_" + counter.incrementAndGet() );
 
-                            List<QueueMessage> drainList = null;
+                            List<LegacyQueueMessage> drainList = null;
 
                             do {
                                 try {
@@ -799,7 +799,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
                                                      List<IndexEventResult> indexEventResults = callEventHandlers( messages );
 
                                                      // submit the processed messages to index producer
-                                                     List<QueueMessage> messagesToAck = submitToIndex( indexEventResults );
+                                                     List<LegacyQueueMessage> messagesToAck = submitToIndex( indexEventResults );
 
                                                      if ( messagesToAck.size() < messages.size() ) {
                                                          logger.warn( "Missing {} message(s) from index processing",
@@ -834,7 +834,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
      * Submit results to index and return the queue messages to be ack'd
      *
      */
-    private List<QueueMessage> submitToIndex(List<IndexEventResult> indexEventResults) {
+    private List<LegacyQueueMessage> submitToIndex(List<IndexEventResult> indexEventResults) {
 
         // if nothing came back then return empty list
         if(indexEventResults==null){
@@ -842,7 +842,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
         }
 
         IndexOperationMessage combined = new IndexOperationMessage();
-        List<QueueMessage> queueMessages = indexEventResults.stream()
+        List<LegacyQueueMessage> queueMessages = indexEventResults.stream()
 
             // filter out messages that are not present, they were not processed and put into the results
             .filter( result -> result.getQueueMessage().isPresent() )
@@ -898,10 +898,10 @@ public class AsyncEventServiceImpl implements AsyncEventService {
 
     public class IndexEventResult{
         private final Optional<IndexOperationMessage> indexOperationMessage;
-        private final Optional<QueueMessage> queueMessage;
+        private final Optional<LegacyQueueMessage> queueMessage;
         private final long creationTime;
 
-        public IndexEventResult(Optional<IndexOperationMessage> indexOperationMessage, Optional<QueueMessage> queueMessage, long creationTime){
+        public IndexEventResult(Optional<IndexOperationMessage> indexOperationMessage, Optional<LegacyQueueMessage> queueMessage, long creationTime){
 
             this.queueMessage = queueMessage;
             this.creationTime = creationTime;
@@ -912,7 +912,7 @@ public class AsyncEventServiceImpl implements AsyncEventService {
             return indexOperationMessage;
         }
 
-        public Optional<QueueMessage> getQueueMessage() {
+        public Optional<LegacyQueueMessage> getQueueMessage() {
             return queueMessage;
         }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncIndexProvider.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncIndexProvider.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncIndexProvider.java
index abd4ce1..aac0e66 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncIndexProvider.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncIndexProvider.java
@@ -29,8 +29,8 @@ import org.apache.usergrid.persistence.index.EntityIndexFactory;
 import org.apache.usergrid.persistence.index.impl.IndexProducer;
 import org.apache.usergrid.persistence.queue.LocalQueueManager;
 import org.apache.usergrid.persistence.map.MapManagerFactory;
-import org.apache.usergrid.persistence.queue.QueueFig;
-import org.apache.usergrid.persistence.queue.QueueManagerFactory;
+import org.apache.usergrid.persistence.queue.LegacyQueueFig;
+import org.apache.usergrid.persistence.queue.LegacyQueueManagerFactory;
 
 import com.google.inject.Inject;
 import com.google.inject.Provider;
@@ -45,7 +45,7 @@ public class AsyncIndexProvider implements Provider<AsyncEventService> {
 
     private final IndexProcessorFig indexProcessorFig;
 
-    private final QueueManagerFactory queueManagerFactory;
+    private final LegacyQueueManagerFactory queueManagerFactory;
     private final MetricsFactory metricsFactory;
     private final RxTaskScheduler rxTaskScheduler;
     private final EntityCollectionManagerFactory entityCollectionManagerFactory;
@@ -54,14 +54,14 @@ public class AsyncIndexProvider implements Provider<AsyncEventService> {
     private final EntityIndexFactory entityIndexFactory;
     private final IndexProducer indexProducer;
     private final MapManagerFactory mapManagerFactory;
-    private final QueueFig queueFig;
+    private final LegacyQueueFig queueFig;
 
     private AsyncEventService asyncEventService;
 
 
     @Inject
     public AsyncIndexProvider(final IndexProcessorFig indexProcessorFig,
-                              final QueueManagerFactory queueManagerFactory,
+                              final LegacyQueueManagerFactory queueManagerFactory,
                               final MetricsFactory metricsFactory,
                               @EventExecutionScheduler final RxTaskScheduler rxTaskScheduler,
                               final EntityCollectionManagerFactory entityCollectionManagerFactory,
@@ -70,7 +70,7 @@ public class AsyncIndexProvider implements Provider<AsyncEventService> {
                               final EntityIndexFactory entityIndexFactory,
                               final IndexProducer indexProducer,
                               final MapManagerFactory mapManagerFactory,
-                              final QueueFig queueFig) {
+                              final LegacyQueueFig queueFig) {
 
         this.indexProcessorFig = indexProcessorFig;
         this.queueManagerFactory = queueManagerFactory;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/AsyncEventServiceImplTest.java
----------------------------------------------------------------------
diff --git a/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/AsyncEventServiceImplTest.java b/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/AsyncEventServiceImplTest.java
index 4c0058b..92b5983 100644
--- a/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/AsyncEventServiceImplTest.java
+++ b/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/AsyncEventServiceImplTest.java
@@ -34,8 +34,8 @@ import org.apache.usergrid.persistence.index.EntityIndexFactory;
 import org.apache.usergrid.persistence.index.impl.EsRunner;
 import org.apache.usergrid.persistence.index.impl.IndexProducer;
 import org.apache.usergrid.persistence.map.MapManagerFactory;
-import org.apache.usergrid.persistence.queue.QueueFig;
-import org.apache.usergrid.persistence.queue.QueueManagerFactory;
+import org.apache.usergrid.persistence.queue.LegacyQueueFig;
+import org.apache.usergrid.persistence.queue.LegacyQueueManagerFactory;
 import org.junit.Rule;
 import org.junit.runner.RunWith;
 
@@ -53,13 +53,13 @@ public class AsyncEventServiceImplTest extends AsyncIndexServiceTest {
 
 
     @Inject
-    public QueueManagerFactory queueManagerFactory;
+    public LegacyQueueManagerFactory queueManagerFactory;
 
     @Inject
     public IndexProcessorFig indexProcessorFig;
 
     @Inject
-    public QueueFig queueFig;
+    public LegacyQueueFig queueFig;
 
 
     @Inject

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/core/src/test/java/org/apache/usergrid/mq/LegacyQueuePathsTest.java
----------------------------------------------------------------------
diff --git a/stack/core/src/test/java/org/apache/usergrid/mq/LegacyQueuePathsTest.java b/stack/core/src/test/java/org/apache/usergrid/mq/LegacyQueuePathsTest.java
new file mode 100644
index 0000000..5ffa553
--- /dev/null
+++ b/stack/core/src/test/java/org/apache/usergrid/mq/LegacyQueuePathsTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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.mq;
+
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.usergrid.mq.Queue.getQueueParentPaths;
+import static org.apache.usergrid.mq.Queue.normalizeQueuePath;
+import static org.apache.usergrid.utils.JsonUtils.mapToFormattedJsonString;
+
+
+
+public class LegacyQueuePathsTest {
+    private static final Logger logger = LoggerFactory.getLogger( LegacyQueuePathsTest.class );
+
+
+    @Test
+    // TODO - why does this test case not have assertions to test results?
+    // tests should not be written like this: what's the point? If it's
+    // code coverage this is still bad.
+    public void testPaths() throws Exception {
+        logger.info( normalizeQueuePath( "a/b/c" ) );
+        logger.info( normalizeQueuePath( "a/b/c/" ) );
+        logger.info( normalizeQueuePath( "/a/b/c" ) );
+        logger.info( normalizeQueuePath( "/////a/b/c" ) );
+        logger.info( normalizeQueuePath( "/" ) );
+
+        logger.info( mapToFormattedJsonString( getQueueParentPaths( "/a/b/c" ) ) );
+        logger.info( mapToFormattedJsonString( getQueueParentPaths( "/" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/core/src/test/java/org/apache/usergrid/mq/QueuePathsTest.java
----------------------------------------------------------------------
diff --git a/stack/core/src/test/java/org/apache/usergrid/mq/QueuePathsTest.java b/stack/core/src/test/java/org/apache/usergrid/mq/QueuePathsTest.java
deleted file mode 100644
index 86dc8bc..0000000
--- a/stack/core/src/test/java/org/apache/usergrid/mq/QueuePathsTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.mq;
-
-
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.apache.usergrid.mq.Queue.getQueueParentPaths;
-import static org.apache.usergrid.mq.Queue.normalizeQueuePath;
-import static org.apache.usergrid.utils.JsonUtils.mapToFormattedJsonString;
-
-
-
-public class QueuePathsTest {
-    private static final Logger logger = LoggerFactory.getLogger( QueuePathsTest.class );
-
-
-    @Test
-    // TODO - why does this test case not have assertions to test results?
-    // tests should not be written like this: what's the point? If it's
-    // code coverage this is still bad.
-    public void testPaths() throws Exception {
-        logger.info( normalizeQueuePath( "a/b/c" ) );
-        logger.info( normalizeQueuePath( "a/b/c/" ) );
-        logger.info( normalizeQueuePath( "/a/b/c" ) );
-        logger.info( normalizeQueuePath( "/////a/b/c" ) );
-        logger.info( normalizeQueuePath( "/" ) );
-
-        logger.info( mapToFormattedJsonString( getQueueParentPaths( "/a/b/c" ) ) );
-        logger.info( mapToFormattedJsonString( getQueueParentPaths( "/" ) ) );
-    }
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueue.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueue.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueue.java
new file mode 100644
index 0000000..c12dc41
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueue.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+package org.apache.usergrid.persistence.queue;
+
+
+public class LegacyQueue {
+    private final String url;
+
+    public LegacyQueue(String url) {
+        this.url = url;
+    }
+
+    public String getUrl(){
+        return url;
+    }
+
+    public boolean isEmpty(){
+        return url == null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueFig.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueFig.java
new file mode 100644
index 0000000..907eec2
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueFig.java
@@ -0,0 +1,106 @@
+package org.apache.usergrid.persistence.queue;
+
+import org.safehaus.guicyfig.Default;
+import org.safehaus.guicyfig.FigSingleton;
+import org.safehaus.guicyfig.GuicyFig;
+import org.safehaus.guicyfig.Key;
+
+@FigSingleton
+public interface LegacyQueueFig extends GuicyFig {
+
+    /**
+     * Any region value string must exactly match the region names specified on this page:
+     *
+     * http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html*
+     */
+
+
+    /**
+     * Primary region to use for Amazon queues.
+     */
+    @Key( "usergrid.queue.region" )
+    @Default("us-east-1")
+    String getPrimaryRegion();
+
+    /**
+     * Flag to determine if Usergrid should use a multi-region Amazon queue
+     * implementation.
+     */
+    @Key( "usergrid.queue.multiregion" )
+    @Default("false")
+    boolean isMultiRegion();
+
+    /**
+     * Comma-separated list of one or more Amazon regions to use if multiregion
+     * is set to true.
+     */
+    @Key( "usergrid.queue.regionList" )
+    @Default("us-east-1")
+    String getRegionList();
+
+
+    /**
+     * Set the amount of time (in minutes) to retain messages in a queue.
+     * 1209600 = 14 days (maximum retention period)
+     */
+    @Key( "usergrid.queue.retention" )
+    @Default("1209600")
+    String getRetentionPeriod();
+
+    /**
+     * Set the amount of time (in minutes) to retain messages in a dead letter queue.
+     * 1209600 = 14 days (maximum retention period)
+     */
+    @Key( "usergrid.queue.deadletter.retention" )
+    @Default("1209600")
+    String getDeadletterRetentionPeriod();
+
+    /**
+     * The maximum number of attempts to attempt to deliver before failing into the DLQ
+     */
+    @Key( "usergrid.queue.deliveryLimit" )
+    @Default("10")
+    String getQueueDeliveryLimit();
+
+    @Key("usergrid.use.default.queue")
+    @Default("false")
+    boolean overrideQueueForDefault();
+
+    @Key("usergrid.queue.publish.threads")
+    @Default("100")
+    int getAsyncMaxThreads();
+
+    // current msg size 1.2kb * 850000 = 1.02 GB (let this default be the most we'll queue in heap)
+    @Key("usergrid.queue.publish.queuesize")
+    @Default("250000")
+    int getAsyncQueueSize();
+
+    /**
+     * Set the visibility timeout (in milliseconds) for faster retries
+     * @return
+     */
+    @Key( "usergrid.queue.visibilityTimeout" )
+    @Default("5000") // 5 seconds
+    int getVisibilityTimeout();
+
+    @Key( "usergrid.queue.localquorum.timeout")
+    @Default("30000") // 30 seconds
+    int getLocalQuorumTimeout();
+
+    @Key( "usergrid.queue.client.connection.timeout")
+    @Default( "5000" ) // 5 seconds
+    int getQueueClientConnectionTimeout();
+
+    @Key( "usergrid.queue.client.socket.timeout")
+    @Default( "50000" ) // 50 seconds
+    int getQueueClientSocketTimeout();
+
+    @Key( "usergrid.queue.poll.timeout")
+    @Default( "10000" ) // 10 seconds
+    int getQueuePollTimeout();
+
+    @Key( "usergrid.queue.quorum.fallback")
+    @Default("false") // 30 seconds
+    boolean getQuorumFallback();
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueManager.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueManager.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueManager.java
new file mode 100644
index 0000000..053dd36
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueManager.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+package org.apache.usergrid.persistence.queue;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.List;
+
+/**ctor
+ * Manages queues for usergrid.  Current implementation is sqs based.
+ */
+public interface LegacyQueueManager {
+
+    /**
+     * Read messages from queue
+     * @param limit
+     * @param klass class to cast the return from
+     * @return List of Queue Messages
+     */
+    List<LegacyQueueMessage> getMessages(int limit, Class klass);
+
+    /**
+     * get the queue depth
+     * @return
+     */
+    long getQueueDepth();
+
+    /**
+     * Commit the transaction
+     * @param queueMessage
+     */
+    void commitMessage( LegacyQueueMessage queueMessage);
+
+    /**
+     * commit multiple messages
+     * @param queueMessages
+     */
+    void commitMessages( List<LegacyQueueMessage> queueMessages);
+
+    /**
+     * send messages to queue
+     * @param bodies body objects must be serializable
+     * @throws IOException
+     */
+    void sendMessages(List bodies) throws IOException;
+
+    /**
+     * send a message to queue
+     * @param body
+     * @throws IOException
+     */
+    <T extends Serializable> void sendMessage(T body)throws IOException;
+
+    /**
+     * Send a messae to the topic to be sent to other queues
+     * @param body
+     */
+    <T extends Serializable> void sendMessageToTopic(T body) throws IOException;
+
+    /**
+     * purge messages
+     */
+    void deleteQueue();
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerFactory.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerFactory.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerFactory.java
new file mode 100644
index 0000000..53afc22
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerFactory.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+package org.apache.usergrid.persistence.queue;
+
+public interface LegacyQueueManagerFactory {
+    public LegacyQueueManager getQueueManager(final LegacyQueueScope scope );
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerInternalFactory.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerInternalFactory.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerInternalFactory.java
new file mode 100644
index 0000000..986f211
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerInternalFactory.java
@@ -0,0 +1,28 @@
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  *  contributor license agreements.  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.  For additional information regarding
+ *  * copyright in this work, please see the NOTICE file in the top level
+ *  * directory of this distribution.
+ *
+ */
+package org.apache.usergrid.persistence.queue;
+
+/**
+ * QueueManagerInternal guice factory
+ */
+public interface LegacyQueueManagerInternalFactory {
+    LegacyQueueManager getQueueManager(final LegacyQueueScope scope );
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueMessage.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueMessage.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueMessage.java
new file mode 100644
index 0000000..939443d
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueMessage.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+package org.apache.usergrid.persistence.queue;
+
+public class LegacyQueueMessage {
+    private final Object body;
+    private final String messageId;
+    private final String handle;
+    private final String type;
+    private String stringBody;
+    private int receiveCount;
+
+
+    public LegacyQueueMessage(String messageId, String handle, Object body, String type) {
+        this.body = body;
+        this.messageId = messageId;
+        this.handle = handle;
+        this.type = type;
+        this.stringBody = "";
+        this.receiveCount = 1; // we'll always receive once if we're taking it off the in mem or AWS queue
+    }
+
+    public String getHandle() {
+        return handle;
+    }
+
+    public Object getBody(){
+        return body;
+    }
+
+    public String getMessageId() {
+        return messageId;
+    }
+
+
+    public String getType() {
+        return type;
+    }
+
+    public void setStringBody(String stringBody) {
+        this.stringBody = stringBody;
+    }
+
+    public String getStringBody() {
+        return stringBody;
+    }
+
+    public void setReceiveCount(int receiveCount){
+        this.receiveCount = receiveCount;
+    }
+
+    public int getReceiveCount(){
+        return receiveCount;
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueScope.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueScope.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueScope.java
new file mode 100644
index 0000000..1f932b2
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LegacyQueueScope.java
@@ -0,0 +1,45 @@
+/*
+ * 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.queue;
+
+import org.apache.usergrid.persistence.core.scope.ApplicationScope;
+
+
+public interface LegacyQueueScope {
+
+    /**
+     * LOCAL will create a SNS topic with a queue subscription in a single AWS region.
+     * ALL will create SNS topics and queue subscriptions  in ALL AWS regions.
+     */
+    enum RegionImplementation {
+        LOCAL,
+        ALL
+    }
+
+    /**
+     * Get the name of the the map
+     * @return
+     */
+    public String getName();
+
+    /**
+     * Get the Usergrid region enum
+     */
+    public RegionImplementation getRegionImplementation();
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LocalQueueManager.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LocalQueueManager.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LocalQueueManager.java
index 1f4261a..630c2e7 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LocalQueueManager.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/LocalQueueManager.java
@@ -34,17 +34,17 @@ import java.util.concurrent.TimeUnit;
 /**
  * Default queue manager implementation, uses in memory linked queue
  */
-public class LocalQueueManager implements QueueManager {
+public class LocalQueueManager implements LegacyQueueManager {
 
     private static final Logger logger = LoggerFactory.getLogger(LocalQueueManager.class);
 
-    public ArrayBlockingQueue<QueueMessage> queue = new ArrayBlockingQueue<>(10000);
+    public ArrayBlockingQueue<LegacyQueueMessage> queue = new ArrayBlockingQueue<>(10000);
 
     @Override
-    public    List<QueueMessage> getMessages(int limit, Class klass) {
-        List<QueueMessage> returnQueue = new ArrayList<>();
+    public    List<LegacyQueueMessage> getMessages(int limit, Class klass) {
+        List<LegacyQueueMessage> returnQueue = new ArrayList<>();
         try {
-            QueueMessage message=null;
+            LegacyQueueMessage message=null;
             int count = 5;
             do {
                 message = queue.poll(100, TimeUnit.MILLISECONDS);
@@ -64,11 +64,11 @@ public class LocalQueueManager implements QueueManager {
     }
 
     @Override
-    public void commitMessage(QueueMessage queueMessage) {
+    public void commitMessage(LegacyQueueMessage queueMessage) {
     }
 
     @Override
-    public void commitMessages(List<QueueMessage> queueMessages) {
+    public void commitMessages(List<LegacyQueueMessage> queueMessages) {
     }
 
     @Override
@@ -76,7 +76,7 @@ public class LocalQueueManager implements QueueManager {
         for(Object body : bodies){
             String uuid = UUID.randomUUID().toString();
             try {
-                queue.put(new QueueMessage(uuid, "handle_" + uuid, body, "put type here"));
+                queue.put(new LegacyQueueMessage(uuid, "handle_" + uuid, body, "put type here"));
             }catch (InterruptedException ie){
                 throw new RuntimeException(ie);
             }
@@ -88,7 +88,7 @@ public class LocalQueueManager implements QueueManager {
     public <T extends Serializable> void sendMessage( final T body ) throws IOException {
         String uuid = UUID.randomUUID().toString();
         try {
-            queue.offer(new QueueMessage(uuid, "handle_" + uuid, body, "put type here"),5000,TimeUnit.MILLISECONDS);
+            queue.offer(new LegacyQueueMessage(uuid, "handle_" + uuid, body, "put type here"),5000,TimeUnit.MILLISECONDS);
         }catch (InterruptedException ie){
             throw new RuntimeException(ie);
         }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/Queue.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/Queue.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/Queue.java
deleted file mode 100644
index 24070d0..0000000
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/Queue.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  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.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- */
-package org.apache.usergrid.persistence.queue;
-
-
-public class Queue {
-    private final String url;
-
-    public Queue(String url) {
-        this.url = url;
-    }
-
-    public String getUrl(){
-        return url;
-    }
-
-    public boolean isEmpty(){
-        return url == null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueFig.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueFig.java
deleted file mode 100644
index 74912ae..0000000
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueFig.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package org.apache.usergrid.persistence.queue;
-
-import org.safehaus.guicyfig.Default;
-import org.safehaus.guicyfig.FigSingleton;
-import org.safehaus.guicyfig.GuicyFig;
-import org.safehaus.guicyfig.Key;
-
-@FigSingleton
-public interface QueueFig extends GuicyFig {
-
-    /**
-     * Any region value string must exactly match the region names specified on this page:
-     *
-     * http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html*
-     */
-
-
-    /**
-     * Primary region to use for Amazon queues.
-     */
-    @Key( "usergrid.queue.region" )
-    @Default("us-east-1")
-    String getPrimaryRegion();
-
-    /**
-     * Flag to determine if Usergrid should use a multi-region Amazon queue
-     * implementation.
-     */
-    @Key( "usergrid.queue.multiregion" )
-    @Default("false")
-    boolean isMultiRegion();
-
-    /**
-     * Comma-separated list of one or more Amazon regions to use if multiregion
-     * is set to true.
-     */
-    @Key( "usergrid.queue.regionList" )
-    @Default("us-east-1")
-    String getRegionList();
-
-
-    /**
-     * Set the amount of time (in minutes) to retain messages in a queue.
-     * 1209600 = 14 days (maximum retention period)
-     */
-    @Key( "usergrid.queue.retention" )
-    @Default("1209600")
-    String getRetentionPeriod();
-
-    /**
-     * Set the amount of time (in minutes) to retain messages in a dead letter queue.
-     * 1209600 = 14 days (maximum retention period)
-     */
-    @Key( "usergrid.queue.deadletter.retention" )
-    @Default("1209600")
-    String getDeadletterRetentionPeriod();
-
-    /**
-     * The maximum number of attempts to attempt to deliver before failing into the DLQ
-     */
-    @Key( "usergrid.queue.deliveryLimit" )
-    @Default("10")
-    String getQueueDeliveryLimit();
-
-    @Key("usergrid.use.default.queue")
-    @Default("false")
-    boolean overrideQueueForDefault();
-
-    @Key("usergrid.queue.publish.threads")
-    @Default("100")
-    int getAsyncMaxThreads();
-
-    // current msg size 1.2kb * 850000 = 1.02 GB (let this default be the most we'll queue in heap)
-    @Key("usergrid.queue.publish.queuesize")
-    @Default("250000")
-    int getAsyncQueueSize();
-
-    /**
-     * Set the visibility timeout (in milliseconds) for faster retries
-     * @return
-     */
-    @Key( "usergrid.queue.visibilityTimeout" )
-    @Default("5000") // 5 seconds
-    int getVisibilityTimeout();
-
-    @Key( "usergrid.queue.localquorum.timeout")
-    @Default("30000") // 30 seconds
-    int getLocalQuorumTimeout();
-
-    @Key( "usergrid.queue.client.connection.timeout")
-    @Default( "5000" ) // 5 seconds
-    int getQueueClientConnectionTimeout();
-
-    @Key( "usergrid.queue.client.socket.timeout")
-    @Default( "50000" ) // 50 seconds
-    int getQueueClientSocketTimeout();
-
-    @Key( "usergrid.queue.poll.timeout")
-    @Default( "10000" ) // 10 seconds
-    int getQueuePollTimeout();
-
-    @Key( "usergrid.queue.quorum.fallback")
-    @Default("false") // 30 seconds
-    boolean getQuorumFallback();
-
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManager.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManager.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManager.java
deleted file mode 100644
index d2e29cb..0000000
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManager.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  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.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- */
-package org.apache.usergrid.persistence.queue;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.List;
-
-/**ctor
- * Manages queues for usergrid.  Current implementation is sqs based.
- */
-public interface QueueManager {
-
-    /**
-     * Read messages from queue
-     * @param limit
-     * @param klass class to cast the return from
-     * @return List of Queue Messages
-     */
-    List<QueueMessage> getMessages(int limit, Class klass);
-
-    /**
-     * get the queue depth
-     * @return
-     */
-    long getQueueDepth();
-
-    /**
-     * Commit the transaction
-     * @param queueMessage
-     */
-    void commitMessage( QueueMessage queueMessage);
-
-    /**
-     * commit multiple messages
-     * @param queueMessages
-     */
-    void commitMessages( List<QueueMessage> queueMessages);
-
-    /**
-     * send messages to queue
-     * @param bodies body objects must be serializable
-     * @throws IOException
-     */
-    void sendMessages(List bodies) throws IOException;
-
-    /**
-     * send a message to queue
-     * @param body
-     * @throws IOException
-     */
-    <T extends Serializable> void sendMessage(T body)throws IOException;
-
-    /**
-     * Send a messae to the topic to be sent to other queues
-     * @param body
-     */
-    <T extends Serializable> void sendMessageToTopic(T body) throws IOException;
-
-    /**
-     * purge messages
-     */
-    void deleteQueue();
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManagerFactory.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManagerFactory.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManagerFactory.java
deleted file mode 100644
index 4cdb5e2..0000000
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManagerFactory.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  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.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- */
-package org.apache.usergrid.persistence.queue;
-
-public interface QueueManagerFactory {
-    public QueueManager getQueueManager( final QueueScope scope );
-
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManagerInternalFactory.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManagerInternalFactory.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManagerInternalFactory.java
deleted file mode 100644
index 119c064..0000000
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueManagerInternalFactory.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *
- *  * Licensed to the Apache Software Foundation (ASF) under one or more
- *  *  contributor license agreements.  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.  For additional information regarding
- *  * copyright in this work, please see the NOTICE file in the top level
- *  * directory of this distribution.
- *
- */
-package org.apache.usergrid.persistence.queue;
-
-/**
- * QueueManagerInternal guice factory
- */
-public interface QueueManagerInternalFactory {
-    QueueManager getQueueManager( final QueueScope scope );
-
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueMessage.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueMessage.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueMessage.java
deleted file mode 100644
index f8ce6ef..0000000
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueMessage.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  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.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- */
-package org.apache.usergrid.persistence.queue;
-
-public class QueueMessage {
-    private final Object body;
-    private final String messageId;
-    private final String handle;
-    private final String type;
-    private String stringBody;
-    private int receiveCount;
-
-
-    public QueueMessage(String messageId, String handle, Object body,String type) {
-        this.body = body;
-        this.messageId = messageId;
-        this.handle = handle;
-        this.type = type;
-        this.stringBody = "";
-        this.receiveCount = 1; // we'll always receive once if we're taking it off the in mem or AWS queue
-    }
-
-    public String getHandle() {
-        return handle;
-    }
-
-    public Object getBody(){
-        return body;
-    }
-
-    public String getMessageId() {
-        return messageId;
-    }
-
-
-    public String getType() {
-        return type;
-    }
-
-    public void setStringBody(String stringBody) {
-        this.stringBody = stringBody;
-    }
-
-    public String getStringBody() {
-        return stringBody;
-    }
-
-    public void setReceiveCount(int receiveCount){
-        this.receiveCount = receiveCount;
-    }
-
-    public int getReceiveCount(){
-        return receiveCount;
-    }
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueScope.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueScope.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueScope.java
deleted file mode 100644
index f58584f..0000000
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/QueueScope.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.queue;
-
-import org.apache.usergrid.persistence.core.scope.ApplicationScope;
-
-
-public interface QueueScope  {
-
-    /**
-     * LOCAL will create a SNS topic with a queue subscription in a single AWS region.
-     * ALL will create SNS topics and queue subscriptions  in ALL AWS regions.
-     */
-    enum RegionImplementation {
-        LOCAL,
-        ALL
-    }
-
-    /**
-     * Get the name of the the map
-     * @return
-     */
-    public String getName();
-
-    /**
-     * Get the Usergrid region enum
-     */
-    public RegionImplementation getRegionImplementation();
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
index caf61bf..6d62da0 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
@@ -18,14 +18,14 @@
 package org.apache.usergrid.persistence.queue.guice;
 
 
-import org.apache.usergrid.persistence.queue.QueueManagerInternalFactory;
+import org.apache.usergrid.persistence.queue.LegacyQueueManagerInternalFactory;
 import org.apache.usergrid.persistence.queue.impl.QueueManagerFactoryImpl;
 import org.apache.usergrid.persistence.queue.impl.SNSQueueManagerImpl;
 import org.safehaus.guicyfig.GuicyFigModule;
 
-import org.apache.usergrid.persistence.queue.QueueFig;
-import org.apache.usergrid.persistence.queue.QueueManager;
-import org.apache.usergrid.persistence.queue.QueueManagerFactory;
+import org.apache.usergrid.persistence.queue.LegacyQueueFig;
+import org.apache.usergrid.persistence.queue.LegacyQueueManager;
+import org.apache.usergrid.persistence.queue.LegacyQueueManagerFactory;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.assistedinject.FactoryModuleBuilder;
@@ -42,11 +42,11 @@ public class QueueModule extends AbstractModule {
     @Override
     protected void configure() {
 
-        install(new GuicyFigModule(QueueFig.class));
+        install(new GuicyFigModule(LegacyQueueFig.class));
 
-        bind(QueueManagerFactory.class).to(QueueManagerFactoryImpl.class);
-        install(new FactoryModuleBuilder().implement(QueueManager.class, SNSQueueManagerImpl.class)
-            .build(QueueManagerInternalFactory.class));
+        bind(LegacyQueueManagerFactory.class).to(QueueManagerFactoryImpl.class);
+        install(new FactoryModuleBuilder().implement(LegacyQueueManager.class, SNSQueueManagerImpl.class)
+            .build(LegacyQueueManagerInternalFactory.class));
 
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/LegacyQueueScopeImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/LegacyQueueScopeImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/LegacyQueueScopeImpl.java
new file mode 100644
index 0000000..51d6c03
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/LegacyQueueScopeImpl.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+package org.apache.usergrid.persistence.queue.impl;
+
+import org.apache.usergrid.persistence.queue.LegacyQueueScope;
+
+public class LegacyQueueScopeImpl implements LegacyQueueScope {
+
+    private final String name;
+    private final RegionImplementation regionImpl;
+
+    public LegacyQueueScopeImpl(final String name, final RegionImplementation regionImpl) {
+        this.name = name;
+        this.regionImpl = regionImpl;
+    }
+
+
+
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public RegionImplementation getRegionImplementation() {return regionImpl;}
+
+    @Override
+    public boolean equals( final Object o ) {
+        if ( this == o ) {
+            return true;
+        }
+        if ( !( o instanceof LegacyQueueScopeImpl) ) {
+            return false;
+        }
+
+        final LegacyQueueScopeImpl queueScope = (LegacyQueueScopeImpl) o;
+
+        if ( !name.equals( queueScope.name ) ) {
+            return false;
+        }
+
+
+        return true;
+    }
+
+
+    @Override
+    public int hashCode() {
+        return name.hashCode();
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QueueManagerFactoryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QueueManagerFactoryImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QueueManagerFactoryImpl.java
index 93b2fb2..2d51903 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QueueManagerFactoryImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QueueManagerFactoryImpl.java
@@ -33,26 +33,26 @@ import java.util.concurrent.ExecutionException;
  * manages whether we take in an external in memory override for queues.
  */
 @Singleton
-public class QueueManagerFactoryImpl implements QueueManagerFactory {
+public class QueueManagerFactoryImpl implements LegacyQueueManagerFactory {
 
     private static final Logger logger = LoggerFactory.getLogger( QueueManagerFactoryImpl.class );
 
-    private final QueueFig queueFig;
-    private final QueueManagerInternalFactory queuemanagerInternalFactory;
-    private final Map<String,QueueManager> defaultManager;
-    private final LoadingCache<QueueScope, QueueManager> queueManager =
+    private final LegacyQueueFig queueFig;
+    private final LegacyQueueManagerInternalFactory queuemanagerInternalFactory;
+    private final Map<String,LegacyQueueManager> defaultManager;
+    private final LoadingCache<LegacyQueueScope, LegacyQueueManager> queueManager =
         CacheBuilder
             .newBuilder()
             .initialCapacity(5)
             .maximumSize(100)
-            .build(new CacheLoader<QueueScope, QueueManager>() {
+            .build(new CacheLoader<LegacyQueueScope, LegacyQueueManager>() {
 
                 @Override
-                public QueueManager load( QueueScope scope ) throws Exception {
+                public LegacyQueueManager load(LegacyQueueScope scope ) throws Exception {
 
                     if ( queueFig.overrideQueueForDefault() ){
 
-                        QueueManager manager = defaultManager.get( scope.getName() );
+                        LegacyQueueManager manager = defaultManager.get( scope.getName() );
                         if ( manager == null ) {
                             manager = new LocalQueueManager();
                             defaultManager.put( scope.getName(), manager );
@@ -67,14 +67,14 @@ public class QueueManagerFactoryImpl implements QueueManagerFactory {
             });
 
     @Inject
-    public QueueManagerFactoryImpl(final QueueFig queueFig, final QueueManagerInternalFactory queuemanagerInternalFactory){
+    public QueueManagerFactoryImpl(final LegacyQueueFig queueFig, final LegacyQueueManagerInternalFactory queuemanagerInternalFactory){
         this.queueFig = queueFig;
         this.queuemanagerInternalFactory = queuemanagerInternalFactory;
         this.defaultManager = new HashMap<>(10);
     }
 
     @Override
-    public QueueManager getQueueManager(QueueScope scope) {
+    public LegacyQueueManager getQueueManager(LegacyQueueScope scope) {
 
         try {
             return queueManager.get(scope);

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QueueScopeImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QueueScopeImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QueueScopeImpl.java
deleted file mode 100644
index fa50b49..0000000
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/QueueScopeImpl.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  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.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- */
-package org.apache.usergrid.persistence.queue.impl;
-
-import org.apache.usergrid.persistence.model.entity.Id;
-import org.apache.usergrid.persistence.queue.QueueScope;
-
-public class QueueScopeImpl implements QueueScope {
-
-    private final String name;
-    private final RegionImplementation regionImpl;
-
-    public QueueScopeImpl(  final String name, final RegionImplementation regionImpl) {
-        this.name = name;
-        this.regionImpl = regionImpl;
-    }
-
-
-
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public RegionImplementation getRegionImplementation() {return regionImpl;}
-
-    @Override
-    public boolean equals( final Object o ) {
-        if ( this == o ) {
-            return true;
-        }
-        if ( !( o instanceof QueueScopeImpl ) ) {
-            return false;
-        }
-
-        final QueueScopeImpl queueScope = ( QueueScopeImpl ) o;
-
-        if ( !name.equals( queueScope.name ) ) {
-            return false;
-        }
-
-
-        return true;
-    }
-
-
-    @Override
-    public int hashCode() {
-        return name.hashCode();
-    }
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/SNSQueueManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/SNSQueueManagerImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/SNSQueueManagerImpl.java
index ae11517..6d4e0c4 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/SNSQueueManagerImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/SNSQueueManagerImpl.java
@@ -35,11 +35,11 @@ import org.slf4j.LoggerFactory;
 import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.executor.TaskExecutorFactory;
 import org.apache.usergrid.persistence.core.guicyfig.ClusterFig;
-import org.apache.usergrid.persistence.queue.Queue;
-import org.apache.usergrid.persistence.queue.QueueFig;
-import org.apache.usergrid.persistence.queue.QueueManager;
-import org.apache.usergrid.persistence.queue.QueueMessage;
-import org.apache.usergrid.persistence.queue.QueueScope;
+import org.apache.usergrid.persistence.queue.LegacyQueue;
+import org.apache.usergrid.persistence.queue.LegacyQueueFig;
+import org.apache.usergrid.persistence.queue.LegacyQueueManager;
+import org.apache.usergrid.persistence.queue.LegacyQueueMessage;
+import org.apache.usergrid.persistence.queue.LegacyQueueScope;
 import org.apache.usergrid.persistence.queue.util.AmazonNotificationUtils;
 
 import com.amazonaws.AmazonServiceException;
@@ -80,12 +80,12 @@ import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 
 
-public class SNSQueueManagerImpl implements QueueManager {
+public class SNSQueueManagerImpl implements LegacyQueueManager {
 
     private static final Logger logger = LoggerFactory.getLogger( SNSQueueManagerImpl.class );
 
-    private final QueueScope scope;
-    private final QueueFig fig;
+    private final LegacyQueueScope scope;
+    private final LegacyQueueFig fig;
     private final ClusterFig clusterFig;
     private final CassandraFig cassandraFig;
     private final ClientConfiguration clientConfiguration;
@@ -121,16 +121,16 @@ public class SNSQueueManagerImpl implements QueueManager {
             }
         } );
 
-    private final LoadingCache<String, Queue> readQueueUrlMap =
-        CacheBuilder.newBuilder().maximumSize( 1000 ).build( new CacheLoader<String, Queue>() {
+    private final LoadingCache<String, LegacyQueue> readQueueUrlMap =
+        CacheBuilder.newBuilder().maximumSize( 1000 ).build( new CacheLoader<String, LegacyQueue>() {
             @Override
-            public Queue load( String queueName ) throws Exception {
+            public LegacyQueue load(String queueName ) throws Exception {
 
-                Queue queue = null;
+                LegacyQueue queue = null;
 
                 try {
                     GetQueueUrlResult result = sqs.getQueueUrl( queueName );
-                    queue = new Queue( result.getQueueUrl() );
+                    queue = new LegacyQueue( result.getQueueUrl() );
                 }
                 catch ( QueueDoesNotExistException queueDoesNotExistException ) {
                     logger.error( "Queue {} does not exist, will create", queueName );
@@ -142,7 +142,7 @@ public class SNSQueueManagerImpl implements QueueManager {
 
                 if ( queue == null ) {
                     String url = AmazonNotificationUtils.createQueue( sqs, queueName, fig );
-                    queue = new Queue( url );
+                    queue = new LegacyQueue( url );
                 }
 
                 setupTopics( queueName );
@@ -153,8 +153,8 @@ public class SNSQueueManagerImpl implements QueueManager {
 
 
     @Inject
-    public SNSQueueManagerImpl( @Assisted QueueScope scope, QueueFig fig, ClusterFig clusterFig,
-                                CassandraFig cassandraFig, QueueFig queueFig ) {
+    public SNSQueueManagerImpl(@Assisted LegacyQueueScope scope, LegacyQueueFig fig, ClusterFig clusterFig,
+                               CassandraFig cassandraFig, LegacyQueueFig queueFig ) {
         this.scope = scope;
         this.fig = fig;
         this.clusterFig = clusterFig;
@@ -232,7 +232,7 @@ public class SNSQueueManagerImpl implements QueueManager {
                 "Unable to subscribe PRIMARY queue=[{}] to topic=[{}]", queueUrl, primaryTopicArn, e );
         }
 
-        if ( fig.isMultiRegion() && scope.getRegionImplementation() == QueueScope.RegionImplementation.ALL ) {
+        if ( fig.isMultiRegion() && scope.getRegionImplementation() == LegacyQueueScope.RegionImplementation.ALL ) {
 
             String multiRegion = fig.getRegionList();
 
@@ -391,7 +391,7 @@ public class SNSQueueManagerImpl implements QueueManager {
     }
 
 
-    public Queue getReadQueue() {
+    public LegacyQueue getReadQueue() {
         String queueName = getName();
 
         try {
@@ -414,7 +414,7 @@ public class SNSQueueManagerImpl implements QueueManager {
 
 
     @Override
-    public List<QueueMessage> getMessages(final int limit, final Class klass) {
+    public List<LegacyQueueMessage> getMessages(final int limit, final Class klass) {
 
         if ( sqs == null ) {
             logger.error( "SQS is null - was not initialized properly" );
@@ -457,7 +457,7 @@ public class SNSQueueManagerImpl implements QueueManager {
                 logger.trace( "Received {} messages from {}", messages.size(), url );
             }
 
-            List<QueueMessage> queueMessages = new ArrayList<>( messages.size() );
+            List<LegacyQueueMessage> queueMessages = new ArrayList<>( messages.size() );
 
             for ( Message message : messages ) {
 
@@ -487,7 +487,7 @@ public class SNSQueueManagerImpl implements QueueManager {
                     throw new RuntimeException( e );
                 }
 
-                QueueMessage queueMessage = new QueueMessage( message.getMessageId(), message.getReceiptHandle(), payload,
+                LegacyQueueMessage queueMessage = new LegacyQueueMessage( message.getMessageId(), message.getReceiptHandle(), payload,
                     message.getAttributes().get( "type" ) );
                 queueMessage.setStringBody( originalBody );
                 int receiveCount = Integer.valueOf(message.getAttributes().get("ApproximateReceiveCount"));
@@ -634,7 +634,7 @@ public class SNSQueueManagerImpl implements QueueManager {
 
 
     @Override
-    public void commitMessage( final QueueMessage queueMessage ) {
+    public void commitMessage( final LegacyQueueMessage queueMessage ) {
         String url = getReadQueue().getUrl();
         if ( logger.isTraceEnabled() ) {
             logger.trace( "Commit message {} to queue {}", queueMessage.getMessageId(), url );
@@ -646,7 +646,7 @@ public class SNSQueueManagerImpl implements QueueManager {
 
 
     @Override
-    public void commitMessages( final List<QueueMessage> queueMessages ) {
+    public void commitMessages( final List<LegacyQueueMessage> queueMessages ) {
         String url = getReadQueue().getUrl();
 
         if ( logger.isTraceEnabled() ) {
@@ -655,7 +655,7 @@ public class SNSQueueManagerImpl implements QueueManager {
 
         List<DeleteMessageBatchRequestEntry> entries = new ArrayList<>();
 
-        for ( QueueMessage message : queueMessages ) {
+        for ( LegacyQueueMessage message : queueMessages ) {
             entries.add( new DeleteMessageBatchRequestEntry( message.getMessageId(), message.getHandle() ) );
         }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/util/AmazonNotificationUtils.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/util/AmazonNotificationUtils.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/util/AmazonNotificationUtils.java
index b6b1aaa..56bef91 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/util/AmazonNotificationUtils.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/util/AmazonNotificationUtils.java
@@ -9,7 +9,7 @@ import java.util.Map;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.usergrid.persistence.queue.QueueFig;
+import org.apache.usergrid.persistence.queue.LegacyQueueFig;
 
 import com.amazonaws.auth.policy.Condition;
 import com.amazonaws.auth.policy.Policy;
@@ -40,7 +40,7 @@ public class AmazonNotificationUtils {
     private static final Logger logger = LoggerFactory.getLogger( AmazonNotificationUtils.class );
 
 
-    public static String createQueue( final AmazonSQSClient sqs, final String queueName, final QueueFig fig )
+    public static String createQueue( final AmazonSQSClient sqs, final String queueName, final LegacyQueueFig fig )
         throws Exception {
 
         final String deadletterQueueName = String.format( "%s_dead", queueName );

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
new file mode 100644
index 0000000..69655e5
--- /dev/null
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
@@ -0,0 +1,156 @@
+/*
+ * 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.queue;
+
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.apache.usergrid.persistence.core.aws.NoAWSCredsRule;
+import org.apache.usergrid.persistence.core.test.ITRunner;
+import org.apache.usergrid.persistence.core.test.UseModules;
+import org.apache.usergrid.persistence.queue.guice.TestQueueModule;
+import org.apache.usergrid.persistence.queue.impl.LegacyQueueScopeImpl;
+
+import com.google.inject.Inject;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+
+@RunWith( ITRunner.class )
+@UseModules( { TestQueueModule.class } )
+public class LegacyQueueManagerTest {
+
+    @Inject
+    protected LegacyQueueFig queueFig;
+    @Inject
+    protected LegacyQueueManagerFactory qmf;
+
+    /**
+     * Mark tests as ignored if no AWS creds are present
+     */
+    @Rule
+    public NoAWSCredsRule awsCredsRule = new NoAWSCredsRule();
+
+
+    protected LegacyQueueScope scope;
+    private LegacyQueueManager qm;
+
+    public static long queueSeed = System.currentTimeMillis();
+
+
+    @Before
+    public void mockApp() {
+
+        this.scope = new LegacyQueueScopeImpl( "testQueue"+queueSeed++, LegacyQueueScope.RegionImplementation.LOCAL);
+        qm = qmf.getQueueManager(scope);
+    }
+
+    @org.junit.After
+    public void cleanup(){
+        qm.deleteQueue();
+    }
+
+
+    @Test
+    public void send() throws Exception{
+        String value = "bodytest";
+        qm.sendMessage(value);
+        List<LegacyQueueMessage> messageList = qm.getMessages(1, String.class);
+        assertTrue(messageList.size() >= 1);
+        for(LegacyQueueMessage message : messageList){
+            assertTrue(message.getBody().equals(value));
+            qm.commitMessage(message);
+        }
+
+        messageList = qm.getMessages(1, String.class);
+        assertTrue(messageList.size() <= 0);
+
+    }
+
+    @Test
+    public void sendMore() throws Exception{
+        HashMap<String,String> values = new HashMap<>();
+        values.put("test","Test");
+
+        List<Map<String,String>> bodies = new ArrayList<>();
+        bodies.add(values);
+        qm.sendMessages(bodies);
+        List<LegacyQueueMessage> messageList = qm.getMessages(1, values.getClass());
+        assertTrue(messageList.size() >= 1);
+        for(LegacyQueueMessage message : messageList){
+            assertTrue(message.getBody().equals(values));
+        }
+        qm.commitMessages(messageList);
+
+        messageList = qm.getMessages(1, values.getClass());
+        assertTrue(messageList.size() <= 0);
+
+    }
+
+    @Test
+    public void queueSize() throws Exception{
+        HashMap<String,String> values = new HashMap<>();
+        values.put("test", "Test");
+
+        List<Map<String,String>> bodies = new ArrayList<>();
+        bodies.add(values);
+        long initialDepth = qm.getQueueDepth();
+        qm.sendMessages(bodies);
+        long depth = 0;
+        for(int i=0; i<10;i++){
+             depth = qm.getQueueDepth();
+            if(depth>0){
+                break;
+            }
+            Thread.sleep(1000);
+        }
+        assertTrue(depth>0);
+
+        List<LegacyQueueMessage> messageList = qm.getMessages(10, values.getClass());
+        assertTrue(messageList.size() <= 500);
+        for(LegacyQueueMessage message : messageList){
+            assertTrue(message.getBody().equals(values));
+        }
+        if(messageList.size()>0) {
+            qm.commitMessages(messageList);
+        }
+        for(int i=0; i<10;i++){
+            depth = qm.getQueueDepth();
+            if(depth==initialDepth){
+                break;
+            }
+            Thread.sleep(1000);
+        }
+        assertEquals(initialDepth, depth);
+    }
+
+
+
+}


[03/25] usergrid git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/usergrid

Posted by sn...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/usergrid

* 'master' of https://git-wip-us.apache.org/repos/asf/usergrid: (50 commits)
  Fix reactivateTest and handle re-activation differently from auto-activation with confirmation requirements.
  Fix issue with admin user confirmation flag not working when trying to disable emails.
  Moving older SDKs to a difference location and updating main README to link to new SDK locations.
  Removing the old Java SDK.
  Moving the Android SDK to https://github.com/apache/usergrid-android
  Moving the .NET SDK to https://github.com/apache/usergrid-dotnet
  Moving the Java SDK to https://github.com/apache/usergrid-java
  Moving the Javascript SDK to https://github.com/apache/usergrid-javascript.
  Moving the Node.js SDK to https://github.com/apache/usergrid-nodejs.
  Moving Python SDK to https://github.com/apache/usergrid-python
  Fix UniqueValueManager tool to work with datastax driver in the unique value serialization strategy.
  Moving Swift SDK to https://github.com/apache/usergrid-swift.
  Update test for collection level authoritative region setting.
  Rename the cluster authoritative region parameters/methods to be more specific.
  Set non-clustered unique value verification loading back to the non-consistent read consistency level.
  Use StringUtils.isEmpty() to determine if region is not set.
  Move shard logging statement to TRACE level.
  Don't shut down full actor system when the JVM exists ( this affects actors running on other hosts ).
  fix duplicate user test to use random usernames in case DB cleanup not done correctly
  Allow GET /management/me with local UG tokens when External SSO is enabled.
  ...


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

Branch: refs/heads/usergrid-1318-queue
Commit: a8cd381d5dd1c3b66639fe2f8f883927d2e897fc
Parents: 461076c efb5bfb
Author: Dave Johnson <sn...@apache.org>
Authored: Wed Sep 7 15:46:05 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Wed Sep 7 15:46:05 2016 -0400

----------------------------------------------------------------------
 README.md                                       |    2 +-
 UsergridSDK.podspec                             |   18 -
 sdks/android/.gitignore                         |   20 -
 sdks/android/LICENSE                            |  202 -
 sdks/android/NOTICE                             |   12 -
 sdks/android/README.md                          |   34 +-
 sdks/android/README.txt                         |   13 -
 sdks/android/assembly.xml                       |   55 -
 sdks/android/build_release_zip.sh               |   10 -
 sdks/android/pom.xml                            |  106 -
 .../usergrid/android/sdk/CounterIncrement.java  |   72 -
 .../sdk/DefaultURLConnectionFactory.java        |   36 -
 .../apache/usergrid/android/sdk/UGClient.java   | 3181 -----------
 .../android/sdk/URLConnectionFactory.java       |   30 -
 .../sdk/callbacks/ApiResponseCallback.java      |   31 -
 .../android/sdk/callbacks/ClientAsyncTask.java  |   66 -
 .../android/sdk/callbacks/ClientCallback.java   |   31 -
 .../sdk/callbacks/GroupsRetrievedCallback.java  |   35 -
 .../sdk/callbacks/QueryResultsCallback.java     |   33 -
 .../usergrid/android/sdk/entities/Activity.java | 1019 ----
 .../android/sdk/entities/Collection.java        |  338 --
 .../usergrid/android/sdk/entities/Device.java   |  122 -
 .../usergrid/android/sdk/entities/Entity.java   |  552 --
 .../usergrid/android/sdk/entities/Group.java    |  151 -
 .../usergrid/android/sdk/entities/Message.java  |  159 -
 .../usergrid/android/sdk/entities/User.java     |  315 --
 .../android/sdk/exception/ClientException.java  |   43 -
 .../android/sdk/response/AggregateCounter.java  |   58 -
 .../sdk/response/AggregateCounterSet.java       |  117 -
 .../android/sdk/response/ApiResponse.java       |  774 ---
 .../sdk/response/ClientCredentialsInfo.java     |   64 -
 .../android/sdk/response/QueueInfo.java         |   47 -
 .../android/sdk/utils/DeviceUuidFactory.java    |  173 -
 .../usergrid/android/sdk/utils/JsonUtils.java   |  185 -
 .../usergrid/android/sdk/utils/MapUtils.java    |   42 -
 .../usergrid/android/sdk/utils/ObjectUtils.java |   39 -
 .../usergrid/android/sdk/utils/UrlUtils.java    |  127 -
 sdks/dotnet/.gitattributes                      |   22 -
 sdks/dotnet/.gitignore                          |  149 -
 sdks/dotnet/LICENSE                             |  202 -
 sdks/dotnet/NOTICE                              |   56 -
 sdks/dotnet/README.md                           |  316 +-
 .../ActivitiesTests.cs                          |  174 -
 .../Usergrid.Sdk.IntegrationTests/BaseTest.cs   |  163 -
 .../ConnectionTests.cs                          |  199 -
 .../DeviceTests.cs                              |   63 -
 .../EntityCrudTests.cs                          |  153 -
 .../EntityPagingTests.cs                        |   83 -
 .../Usergrid.Sdk.IntegrationTests/Friend.cs     |   23 -
 .../Usergrid.Sdk.IntegrationTests/GroupTests.cs |   91 -
 .../Usergrid.Sdk.IntegrationTests/LoginTests.cs |   96 -
 .../NotificationTests.cs                        |  133 -
 .../Properties/AssemblyInfo.cs                  |   55 -
 .../UserManagementTests.cs                      |   96 -
 .../Usergrid.Sdk.IntegrationTests.csproj        |  109 -
 .../Usergrid.Sdk.IntegrationTests.dll.config    |   33 -
 .../UsergridFriend.cs                           |   23 -
 .../packages.config                             |   24 -
 .../AuthenticationManagerTests.cs               |  135 -
 .../ClientTests/ActivityTests.cs                |   86 -
 .../ClientTests/ConnectionTests.cs              |   88 -
 .../ClientTests/DeviceTests.cs                  |  143 -
 .../ClientTests/EntityTests.cs                  |  210 -
 .../Usergrid.Sdk.Tests/ClientTests/FeedTests.cs |   65 -
 .../ClientTests/GroupTests.cs                   |  199 -
 .../ClientTests/LoginTests.cs                   |   67 -
 .../ClientTests/NotificationTests.cs            |  149 -
 .../Usergrid.Sdk.Tests/ClientTests/UserTests.cs |  153 -
 .../ConnectionManagerTests.cs                   |  240 -
 .../Usergrid.Sdk.Tests/EntityManagerTests.cs    |  440 --
 sdks/dotnet/Usergrid.Sdk.Tests/Friend.cs        |   35 -
 sdks/dotnet/Usergrid.Sdk.Tests/Helpers.cs       |   94 -
 .../Model/NotificationRecipientsTests.cs        |  147 -
 .../Model/NotificationTests.cs                  |   55 -
 .../NotificationsManagerTests.cs                |  118 -
 .../Properties/AssemblyInfo.cs                  |   57 -
 .../Usergrid.Sdk.Tests.csproj                   |  110 -
 .../Usergrid.Sdk.Tests/UsergridRequestTests.cs  |  140 -
 sdks/dotnet/Usergrid.Sdk.Tests/packages.config  |   24 -
 sdks/dotnet/Usergrid.Sdk/Client.cs              |  262 -
 sdks/dotnet/Usergrid.Sdk/IClient.cs             |   73 -
 sdks/dotnet/Usergrid.Sdk/IUsergridRequest.cs    |   28 -
 .../Manager/AuthenticationManager.cs            |   74 -
 .../Usergrid.Sdk/Manager/ConnectionManager.cs   |   99 -
 .../Usergrid.Sdk/Manager/EntityManager.cs       |  177 -
 .../Manager/IAuthenticationManager.cs           |   25 -
 .../Usergrid.Sdk/Manager/IConnectionManager.cs  |   26 -
 .../Usergrid.Sdk/Manager/IEntityManager.cs      |   30 -
 .../Manager/INotificationsManager.cs            |   27 -
 sdks/dotnet/Usergrid.Sdk/Manager/ManagerBase.cs |   42 -
 .../Manager/NotificationsManager.cs             |   77 -
 .../Usergrid.Sdk/Model/AndroidNotification.cs   |   37 -
 .../Usergrid.Sdk/Model/AppleNotification.cs     |   49 -
 sdks/dotnet/Usergrid.Sdk/Model/AuthType.cs      |   25 -
 sdks/dotnet/Usergrid.Sdk/Model/Connection.cs    |   24 -
 .../Model/INotificationRecipients.cs            |   32 -
 sdks/dotnet/Usergrid.Sdk/Model/Notification.cs  |   31 -
 .../Model/NotificationRecipients.cs             |  137 -
 .../Model/NotificationSchedulerSettings.cs      |   35 -
 .../Usergrid.Sdk/Model/UnixDateTimeHelper.cs    |   53 -
 .../dotnet/Usergrid.Sdk/Model/UserGridEntity.cs |   45 -
 .../Usergrid.Sdk/Model/UsergridActivity.cs      |   50 -
 sdks/dotnet/Usergrid.Sdk/Model/UsergridActor.cs |   29 -
 .../Usergrid.Sdk/Model/UsergridCollection.cs    |   30 -
 .../dotnet/Usergrid.Sdk/Model/UsergridDevice.cs |   22 -
 .../Model/UsergridEntitySerializer.cs           |   51 -
 sdks/dotnet/Usergrid.Sdk/Model/UsergridError.cs |   31 -
 .../Usergrid.Sdk/Model/UsergridException.cs     |   30 -
 sdks/dotnet/Usergrid.Sdk/Model/UsergridGroup.cs |   24 -
 sdks/dotnet/Usergrid.Sdk/Model/UsergridImage.cs |   28 -
 .../Usergrid.Sdk/Model/UsergridNotifier.cs      |   23 -
 sdks/dotnet/Usergrid.Sdk/Model/UsergridUser.cs  |   27 -
 .../Payload/AndroidNotifierPayload.cs           |   29 -
 .../Payload/CancelNotificationPayload.cs        |   25 -
 .../Payload/ChangePasswordPayload.cs            |   28 -
 .../Payload/ClientIdLoginPayload.cs             |   34 -
 .../Usergrid.Sdk/Payload/LoginResponse.cs       |   25 -
 .../Usergrid.Sdk/Payload/NotificationPayload.cs |   38 -
 .../Usergrid.Sdk/Payload/UserLoginPayload.cs    |   34 -
 .../Usergrid.Sdk/Payload/UsergridGetResponse.cs |   28 -
 .../Usergrid.Sdk/Properties/AssemblyInfo.cs     |   51 -
 .../Usergrid.Sdk/RestSharpJsonSerializer.cs     |   38 -
 sdks/dotnet/Usergrid.Sdk/Usergrid.Sdk.csproj    |  124 -
 sdks/dotnet/Usergrid.Sdk/UsergridRequest.cs     |   91 -
 sdks/dotnet/Usergrid.Sdk/packages.config        |   22 -
 sdks/dotnet/Usergrid.sln                        |   49 -
 .../new-project-template.sln                    |   37 -
 .../new-project-template/App.config             |   22 -
 .../new-project-template/Program.cs             |   91 -
 .../Properties/AssemblyInfo.cs                  |   51 -
 .../new-project-template.csproj                 |   84 -
 .../packages/NSubstitute.1.6.0.0/LICENSE.txt    |   27 -
 .../NSubstitute.1.6.0.0.nuspec                  |   19 -
 .../NSubstitute.1.6.0.0/acknowledgements.txt    |   63 -
 .../packages/NUnit.2.6.2/NUnit.2.6.2.nuspec     |   31 -
 sdks/dotnet/packages/NUnit.2.6.2/license.txt    |   15 -
 .../packages/Newtonsoft.Json.4.5.11/LICENSE.txt |   21 -
 .../Newtonsoft.Json.4.5.11.nuspec               |   19 -
 .../dotnet/packages/RestSharp.104.1/LICENSE.txt |  202 -
 .../RestSharp.104.1/RestSharp.104.1.nuspec      |   24 -
 sdks/dotnet/packages/repositories.config        |   22 -
 sdks/dotnet/samples/README.md                   |    1 -
 .../locationSample/LocationDotNetSample.sln     |   36 -
 .../LocationDotNetSample/App.config             |   22 -
 .../LocationDotNetSample/Form1.Designer.cs      |  269 -
 .../LocationDotNetSample/Form1.cs               |  148 -
 .../LocationDotNetSample/Form1.resx             |  137 -
 .../LocationDotNetSample.csproj                 |  129 -
 .../LocationDotNetSample/Program.cs             |   37 -
 .../Properties/AssemblyInfo.cs                  |   51 -
 .../Properties/Resources.Designer.cs            |   86 -
 .../Properties/Resources.resx                   |  133 -
 .../Properties/Settings.Designer.cs             |   45 -
 .../Properties/Settings.settings                |   23 -
 .../LocationDotNetSample/Store.cs               |   45 -
 .../LocationDotNetSample/packages.config        |   21 -
 sdks/dotnet/samples/locationSample/ReadMe.md    |   20 -
 .../Geocoder.0.1.0.0/Geocoder.0.1.0.0.nupkg     |  Bin 5053 -> 0 bytes
 .../Geocoder.0.1.0.0/Geocoder.0.1.0.0.nuspec    |   32 -
 .../packages/Geocoder.0.1.0.0/README.txt        |    3 -
 .../Geocoder.0.1.0.0/lib/net45/Geocoder.dll     |  Bin 6144 -> 0 bytes
 .../locationSample/packages/repositories.config |   20 -
 sdks/dotnet/samples/locationSample/stores.json  |    1 -
 .../loginAndCollectionSample/BooksApp.sln       |   36 -
 .../BooksApp2/AddBook.Designer.vb               |  109 -
 .../BooksApp2/AddBook.resx                      |  136 -
 .../BooksApp2/AddBook.vb                        |   33 -
 .../BooksApp2/App.config                        |   23 -
 .../loginAndCollectionSample/BooksApp2/Book.vb  |   21 -
 .../BooksApp2/BooksApp.vbproj                   |  174 -
 .../BooksApp2/MainWindow.Designer.vb            |  147 -
 .../BooksApp2/MainWindow.resx                   |  146 -
 .../BooksApp2/MainWindow.vb                     |   70 -
 .../My Project/Application.Designer.vb          |   53 -
 .../BooksApp2/My Project/Application.myapp      |   27 -
 .../BooksApp2/My Project/AssemblyInfo.vb        |   50 -
 .../BooksApp2/My Project/Resources.Designer.vb  |   78 -
 .../BooksApp2/My Project/Resources.resx         |  134 -
 .../BooksApp2/My Project/Settings.Designer.vb   |   88 -
 .../BooksApp2/My Project/Settings.settings      |   24 -
 .../BooksApp2/Settings.vb                       |   22 -
 .../BooksApp2/SettingsForm.Designer.vb          |  164 -
 .../BooksApp2/SettingsForm.resx                 |  137 -
 .../BooksApp2/SettingsForm.vb                   |   44 -
 .../samples/loginAndCollectionSample/Readme.md  |   17 -
 .../samples/messageeTutorial/Messagee.sln       |   36 -
 .../messageeTutorial/Messagee/App.config        |   23 -
 .../messageeTutorial/Messagee/Globals.vb        |   22 -
 .../Messagee/MainForm.Designer.vb               |  260 -
 .../messageeTutorial/Messagee/MainForm.resx     |  143 -
 .../messageeTutorial/Messagee/MainForm.vb       |   97 -
 .../messageeTutorial/Messagee/Messagee.vbproj   |  173 -
 .../Messagee/My Project/Application.Designer.vb |   53 -
 .../Messagee/My Project/Application.myapp       |   27 -
 .../Messagee/My Project/AssemblyInfo.vb         |   50 -
 .../Messagee/My Project/Resources.Designer.vb   |   77 -
 .../Messagee/My Project/Resources.resx          |  134 -
 .../Messagee/My Project/Settings.Designer.vb    |   88 -
 .../Messagee/My Project/Settings.settings       |   24 -
 .../Messagee/Settings.Designer.vb               |  159 -
 .../messageeTutorial/Messagee/Settings.resx     |  137 -
 .../messageeTutorial/Messagee/Settings.vb       |   28 -
 .../Messagee/UserSettings.Designer.vb           |  191 -
 .../messageeTutorial/Messagee/UserSettings.resx |  137 -
 .../messageeTutorial/Messagee/UserSettings.vb   |   96 -
 .../samples/messageeTutorial/Messagee/Utils.vb  |   82 -
 sdks/dotnet/samples/messageeTutorial/README.md  |   15 -
 .../Usergrid.Notifications/App.xaml             |   27 -
 .../Usergrid.Notifications/App.xaml.cs          |  150 -
 .../Assets/Logo.scale-240.png                   |  Bin 2516 -> 0 bytes
 .../Assets/SmallLogo.scale-240.png              |  Bin 753 -> 0 bytes
 .../Assets/SplashScreen.scale-240.png           |  Bin 14715 -> 0 bytes
 .../Assets/Square71x71Logo.scale-240.png        |  Bin 1122 -> 0 bytes
 .../Assets/StoreLogo.scale-240.png              |  Bin 2200 -> 0 bytes
 .../Assets/WideLogo.scale-240.png               |  Bin 4530 -> 0 bytes
 .../Usergrid.Notifications/BackgroundTask.cs    |   57 -
 .../Client/EntityResponse.cs                    |   80 -
 .../Client/IUsergridClient.cs                   |  123 -
 .../Usergrid.Notifications/Client/PushClient.cs |  185 -
 .../Usergrid.Notifications/Client/Usergrid.cs   |  122 -
 .../Usergrid.Notifications/MainPage.xaml        |   39 -
 .../Usergrid.Notifications/MainPage.xaml.cs     |  143 -
 .../Usergrid.Notifications/MyBackgroundTask.cs  |   18 -
 .../Package.StoreAssociation.xml                |  194 -
 .../Usergrid.Notifications/Package.appxmanifest |   61 -
 .../Properties/AssemblyInfo.cs                  |   29 -
 .../Usergrid.Notifications.csproj               |  143 -
 .../Usergrid.Notifications.sln                  |   40 -
 .../Usergrid.Notifications/packages.config      |   25 -
 .../notifications/packages/repositories.config  |    4 -
 sdks/html5-javascript/Gruntfile.js              |  139 -
 sdks/html5-javascript/LICENSE                   |  202 -
 sdks/html5-javascript/README.md                 |  885 +--
 sdks/html5-javascript/changelog.md              |   76 -
 .../examples/all-calls/all-calls.html           |  176 -
 sdks/html5-javascript/examples/all-calls/app.js |  236 -
 sdks/html5-javascript/examples/dogs/app.js      |  194 -
 sdks/html5-javascript/examples/dogs/dogs.html   |   74 -
 sdks/html5-javascript/examples/facebook/app.js  |  129 -
 .../examples/facebook/facebook.html             |   73 -
 .../examples/facebook/guide.html                |   63 -
 .../examples/persistence/test.html              |   54 -
 .../examples/persistence/test.js                |  130 -
 .../resources/css/bootstrap-combined.min.css    |   18 -
 .../examples/resources/css/styles.css           |   91 -
 .../examples/resources/images/apigee.png        |  Bin 6010 -> 0 bytes
 .../examples/resources/js/json2.js              |  486 --
 sdks/html5-javascript/examples/test/test.html   |   54 -
 sdks/html5-javascript/examples/test/test.js     |  978 ----
 .../extensions/usergrid.validation.js           |  267 -
 sdks/html5-javascript/index.html                |   70 -
 sdks/html5-javascript/lib/Module.js             |   49 -
 sdks/html5-javascript/lib/Usergrid.js           |  323 --
 sdks/html5-javascript/lib/modules/Asset.js      |  248 -
 sdks/html5-javascript/lib/modules/Client.js     |  883 ---
 sdks/html5-javascript/lib/modules/Collection.js |  483 --
 sdks/html5-javascript/lib/modules/Counter.js    |  196 -
 sdks/html5-javascript/lib/modules/Entity.js     |  767 ---
 sdks/html5-javascript/lib/modules/Error.js      |  155 -
 sdks/html5-javascript/lib/modules/Folder.js     |  190 -
 sdks/html5-javascript/lib/modules/Group.js      |  231 -
 sdks/html5-javascript/lib/modules/util/Ajax.js  |   99 -
 sdks/html5-javascript/lib/modules/util/Event.js |   33 -
 .../html5-javascript/lib/modules/util/Logger.js |   89 -
 .../lib/modules/util/Promise.js                 |  101 -
 sdks/html5-javascript/package.json              |   22 -
 sdks/html5-javascript/tests/mocha/index.html    |   60 -
 sdks/html5-javascript/tests/mocha/test.js       | 1078 ----
 .../tests/qunit/apigee_test.html                |   31 -
 sdks/html5-javascript/tests/qunit/tests.js      |   20 -
 .../resources/css/bootstrap-combined.min.css    |   18 -
 .../tests/resources/css/mocha.css               |  270 -
 .../tests/resources/css/styles.css              |   91 -
 .../tests/resources/images/apigee.png           |  Bin 6010 -> 0 bytes
 .../tests/resources/js/blanket_mocha.min.js     |    1 -
 .../tests/resources/js/json2.js                 |  486 --
 .../tests/resources/js/mocha.js                 | 5341 ------------------
 sdks/html5-javascript/tests/test.html           |   54 -
 sdks/html5-javascript/tests/test.js             |  927 ---
 sdks/html5-javascript/usergrid.js               | 3286 -----------
 sdks/html5-javascript/usergrid.min.js           |   20 -
 sdks/ios/.gitignore                             |    9 -
 sdks/ios/.travis.yml                            |    7 -
 sdks/ios/Default-568h@2x.png                    |  Bin 18594 -> 0 bytes
 sdks/ios/LICENSE                                |  202 -
 sdks/ios/Nukefile                               |   46 -
 sdks/ios/README.md                              |   80 -
 sdks/ios/UGAPI/SBJson/NSObject+SBJson.h         |   79 -
 sdks/ios/UGAPI/SBJson/NSObject+SBJson.m         |   72 -
 sdks/ios/UGAPI/SBJson/SBJson.h                  |   84 -
 sdks/ios/UGAPI/SBJson/SBJsonParser.h            |  101 -
 sdks/ios/UGAPI/SBJson/SBJsonParser.m            |  100 -
 sdks/ios/UGAPI/SBJson/SBJsonStreamParser.h      |  161 -
 sdks/ios/UGAPI/SBJson/SBJsonStreamParser.m      |  255 -
 .../SBJson/SBJsonStreamParserAccumulator.h      |   37 -
 .../SBJson/SBJsonStreamParserAccumulator.m      |   47 -
 .../UGAPI/SBJson/SBJsonStreamParserAdapter.h    |  148 -
 .../UGAPI/SBJson/SBJsonStreamParserAdapter.m    |  164 -
 sdks/ios/UGAPI/SBJson/SBJsonStreamParserState.h |   83 -
 sdks/ios/UGAPI/SBJson/SBJsonStreamParserState.m |  355 --
 sdks/ios/UGAPI/SBJson/SBJsonStreamWriter.h      |  195 -
 sdks/ios/UGAPI/SBJson/SBJsonStreamWriter.m      |  374 --
 .../SBJson/SBJsonStreamWriterAccumulator.h      |   36 -
 .../SBJson/SBJsonStreamWriterAccumulator.m      |   52 -
 sdks/ios/UGAPI/SBJson/SBJsonStreamWriterState.h |   69 -
 sdks/ios/UGAPI/SBJson/SBJsonStreamWriterState.m |  139 -
 sdks/ios/UGAPI/SBJson/SBJsonTokeniser.h         |   67 -
 sdks/ios/UGAPI/SBJson/SBJsonTokeniser.m         |  453 --
 sdks/ios/UGAPI/SBJson/SBJsonUTF8Stream.h        |   58 -
 sdks/ios/UGAPI/SBJson/SBJsonUTF8Stream.m        |  141 -
 sdks/ios/UGAPI/SBJson/SBJsonWriter.h            |  117 -
 sdks/ios/UGAPI/SBJson/SBJsonWriter.m            |  112 -
 sdks/ios/UGAPI/SSKeychain.h                     |  357 --
 sdks/ios/UGAPI/SSKeychain.m                     |  262 -
 sdks/ios/UGAPI/UGActivity.h                     |   64 -
 sdks/ios/UGAPI/UGActivity.m                     |  263 -
 sdks/ios/UGAPI/UGClient.h                       |  328 --
 sdks/ios/UGAPI/UGClient.m                       | 1252 ----
 sdks/ios/UGAPI/UGClientDelegate.h               |   35 -
 sdks/ios/UGAPI/UGClientResponse.h               |   59 -
 sdks/ios/UGAPI/UGClientResponse.m               |   40 -
 sdks/ios/UGAPI/UGHTTPManager.h                  |   74 -
 sdks/ios/UGAPI/UGHTTPManager.m                  |  328 --
 sdks/ios/UGAPI/UGMultiStepAction.h              |   58 -
 sdks/ios/UGAPI/UGMultiStepAction.m              |   40 -
 sdks/ios/UGAPI/UGQuery.h                        |  104 -
 sdks/ios/UGAPI/UGQuery.m                        |  277 -
 sdks/ios/UGAPI/UGUser.h                         |   27 -
 sdks/ios/UGAPI/UGUser.m                         |   27 -
 sdks/ios/UGAPI/v2/UGConnection.h                |  289 -
 sdks/ios/UGAPI/v2/UGConnection.m                |  938 ---
 sdks/ios/UGAPI/v2/UGHTTPClient.h                |   45 -
 sdks/ios/UGAPI/v2/UGHTTPClient.m                |  161 -
 sdks/ios/UGAPI/v2/UGHTTPHelpers.h               |   40 -
 sdks/ios/UGAPI/v2/UGHTTPHelpers.m               |  162 -
 sdks/ios/UGAPI/v2/UGHTTPResult.h                |   34 -
 sdks/ios/UGAPI/v2/UGHTTPResult.m                |   46 -
 sdks/ios/UGAPIApp.xcodeproj/project.pbxproj     |  653 ---
 .../contents.xcworkspacedata                    |    7 -
 sdks/ios/UGAPIApp/UGAPIApp-Info.plist           |   49 -
 sdks/ios/UGAPIApp/UGAPIApp-Prefix.pch           |   31 -
 sdks/ios/UGAPIApp/UGAppAppDelegate.h            |   25 -
 sdks/ios/UGAPIApp/UGAppAppDelegate.m            |  139 -
 sdks/ios/UGAPIApp/UGAppViewController.h         |   22 -
 sdks/ios/UGAPIApp/UGAppViewController.m         |   47 -
 sdks/ios/UGAPIApp/en.lproj/InfoPlist.strings    |    2 -
 .../en.lproj/MainStoryboard_iPad.storyboard     |   27 -
 .../en.lproj/MainStoryboard_iPhone.storyboard   |   27 -
 sdks/ios/UGAPIApp/main.m                        |   27 -
 sdks/ios/UGAPIAppTests/UGAPIAppTests-Info.plist |   22 -
 sdks/ios/UGAPIAppTests/UGAPIAppTests.h          |   22 -
 sdks/ios/UGAPIAppTests/UGAPIAppTests.m          |   41 -
 .../UGAPIAppTests/en.lproj/InfoPlist.strings    |    2 -
 sdks/ios/changelog.md                           |   11 -
 .../Books/books.xcodeproj/project.pbxproj       |  342 --
 .../samples/Books/books/AddBookViewController.h |   41 -
 .../samples/Books/books/AddBookViewController.m |  169 -
 sdks/ios/samples/Books/books/AppDelegate.h      |   43 -
 sdks/ios/samples/Books/books/AppDelegate.m      |   43 -
 .../samples/Books/books/BooksViewController.h   |   41 -
 .../samples/Books/books/BooksViewController.m   |  154 -
 .../ios/samples/Books/books/Default-568h@2x.png |  Bin 18594 -> 0 bytes
 sdks/ios/samples/Books/books/Default.png        |  Bin 6540 -> 0 bytes
 sdks/ios/samples/Books/books/Default@2x.png     |  Bin 16107 -> 0 bytes
 .../Books/books/UGSignInViewController.h        |   23 -
 .../Books/books/UGSignInViewController.m        |  184 -
 sdks/ios/samples/Books/books/books-Info.plist   |   63 -
 sdks/ios/samples/Books/books/books-Prefix.pch   |   31 -
 .../Books/books/en.lproj/InfoPlist.strings      |   21 -
 sdks/ios/samples/Books/books/main.m             |   32 -
 .../Browser/browser.xcodeproj/project.pbxproj   |  487 --
 .../samples/Browser/browser/Default-568h@2x.png |  Bin 18594 -> 0 bytes
 sdks/ios/samples/Browser/browser/Default.png    |  Bin 6540 -> 0 bytes
 sdks/ios/samples/Browser/browser/Default@2x.png |  Bin 16107 -> 0 bytes
 .../ios/samples/Browser/browser/UGAppDelegate.h |   24 -
 .../ios/samples/Browser/browser/UGAppDelegate.m |   39 -
 .../Browser/browser/UGAppViewController.h       |   27 -
 .../Browser/browser/UGAppViewController.m       |  143 -
 .../browser/UGCollectionViewController.h        |   23 -
 .../browser/UGCollectionViewController.m        |  115 -
 .../Browser/browser/UGEntityViewController.h    |   22 -
 .../Browser/browser/UGEntityViewController.m    |   86 -
 .../Browser/browser/UGSignInViewController.h    |   24 -
 .../Browser/browser/UGSignInViewController.m    |  185 -
 .../Browser/browser/UGTextViewController.h      |   23 -
 .../Browser/browser/UGTextViewController.m      |   43 -
 .../samples/Browser/browser/browser-Info.plist  |   63 -
 .../samples/Browser/browser/browser-Prefix.pch  |   14 -
 .../Browser/browser/en.lproj/InfoPlist.strings  |    2 -
 sdks/ios/samples/Browser/browser/main.m         |   30 -
 sdks/ios/samples/parties/Icon.ai                | 4620 ---------------
 .../parties/parties.xcodeproj/project.pbxproj   |  481 --
 sdks/ios/samples/parties/parties/AppDelegate.h  |   26 -
 sdks/ios/samples/parties/parties/AppDelegate.m  |   73 -
 .../samples/parties/parties/Default-568h@2x.png |  Bin 18594 -> 0 bytes
 sdks/ios/samples/parties/parties/Default.png    |  Bin 6540 -> 0 bytes
 sdks/ios/samples/parties/parties/Default@2x.png |  Bin 16107 -> 0 bytes
 sdks/ios/samples/parties/parties/Icon.png       |  Bin 7725 -> 0 bytes
 .../parties/parties/PartiesViewController.h     |   24 -
 .../parties/parties/PartiesViewController.m     |  241 -
 .../parties/parties/PartyViewController.h       |   24 -
 .../parties/parties/PartyViewController.m       |  166 -
 .../parties/parties/en.lproj/InfoPlist.strings  |    2 -
 sdks/ios/samples/parties/parties/main.m         |   35 -
 .../samples/parties/parties/parties-Info.plist  |   63 -
 .../samples/parties/parties/parties-Prefix.pch  |   15 -
 sdks/ios/test/test_client.nu                    |   50 -
 sdks/ios/test/test_connection.nu                |  119 -
 sdks/java/LICENSE                               |  202 -
 sdks/java/README.md                             |  580 +-
 sdks/java/pom.xml                               |  127 -
 .../apache/usergrid/java/client/Usergrid.java   |  285 -
 .../usergrid/java/client/UsergridClient.java    |  429 --
 .../java/client/UsergridClientConfig.java       |   60 -
 .../usergrid/java/client/UsergridEnums.java     |  170 -
 .../usergrid/java/client/UsergridRequest.java   |  205 -
 .../java/client/UsergridRequestManager.java     |   97 -
 .../java/client/auth/UsergridAppAuth.java       |   55 -
 .../usergrid/java/client/auth/UsergridAuth.java |   76 -
 .../java/client/auth/UsergridUserAuth.java      |   68 -
 .../client/exception/UsergridException.java     |   50 -
 .../java/client/model/UsergridDevice.java       |   60 -
 .../java/client/model/UsergridEntity.java       |  487 --
 .../java/client/model/UsergridUser.java         |  198 -
 .../java/client/query/UsergridQuery.java        |  431 --
 .../java/client/response/UsergridResponse.java  |  230 -
 .../client/response/UsergridResponseError.java  |   98 -
 .../usergrid/java/client/utils/JsonUtils.java   |  152 -
 .../usergrid/java/client/utils/MapUtils.java    |   36 -
 .../usergrid/java/client/utils/ObjectUtils.java |   38 -
 .../utils/UsergridEntityDeserializer.java       |   41 -
 .../client/ClientAuthFallBackTestCase.java      |   72 -
 .../usergrid/client/ClientAuthTestCase.java     |   85 -
 .../client/ClientConnectionsTestCase.java       |  171 -
 .../usergrid/client/ClientRestTestCase.java     |   90 -
 .../apache/usergrid/client/EntityTestCase.java  |  676 ---
 .../apache/usergrid/client/QueryTestCase.java   |  194 -
 .../usergrid/client/SDKTestConfiguration.java   |   38 -
 .../apache/usergrid/client/SDKTestUtils.java    |  108 -
 .../client/UsergridClientAuthTestCase.java      |   73 -
 .../usergrid/client/UsergridInitTestCase.java   |   48 -
 .../client/UsergridResponseErrorTestCase.java   |   62 -
 .../client/UsergridResponseTestCase.java        |   85 -
 .../usergrid/client/UsergridTestCase.java       |   30 -
 sdks/java/usergrid-java-client-2.1.0.jar        |  Bin 1992232 -> 0 bytes
 sdks/nodejs/LICENSE                             |   20 -
 sdks/nodejs/changelog.md                        |   43 -
 sdks/nodejs/lib/usergrid.js                     | 2584 ---------
 sdks/nodejs/package.json                        |   43 -
 sdks/nodejs/readme.md                           |  745 +--
 sdks/nodejs/test.js                             | 1077 ----
 sdks/nodejs/test/client.js                      |  183 -
 sdks/nodejs/test/collection.js                  |  259 -
 sdks/nodejs/test/entity.js                      |   59 -
 sdks/other/README.md                            |    5 +
 sdks/other/ios/.gitignore                       |    9 +
 sdks/other/ios/.travis.yml                      |    7 +
 sdks/other/ios/Default-568h@2x.png              |  Bin 0 -> 18594 bytes
 sdks/other/ios/LICENSE                          |  202 +
 sdks/other/ios/Nukefile                         |   46 +
 sdks/other/ios/README.md                        |   80 +
 sdks/other/ios/UGAPI/SBJson/NSObject+SBJson.h   |   79 +
 sdks/other/ios/UGAPI/SBJson/NSObject+SBJson.m   |   72 +
 sdks/other/ios/UGAPI/SBJson/SBJson.h            |   84 +
 sdks/other/ios/UGAPI/SBJson/SBJsonParser.h      |  101 +
 sdks/other/ios/UGAPI/SBJson/SBJsonParser.m      |  100 +
 .../other/ios/UGAPI/SBJson/SBJsonStreamParser.h |  161 +
 .../other/ios/UGAPI/SBJson/SBJsonStreamParser.m |  255 +
 .../SBJson/SBJsonStreamParserAccumulator.h      |   37 +
 .../SBJson/SBJsonStreamParserAccumulator.m      |   47 +
 .../UGAPI/SBJson/SBJsonStreamParserAdapter.h    |  148 +
 .../UGAPI/SBJson/SBJsonStreamParserAdapter.m    |  164 +
 .../ios/UGAPI/SBJson/SBJsonStreamParserState.h  |   83 +
 .../ios/UGAPI/SBJson/SBJsonStreamParserState.m  |  355 ++
 .../other/ios/UGAPI/SBJson/SBJsonStreamWriter.h |  195 +
 .../other/ios/UGAPI/SBJson/SBJsonStreamWriter.m |  374 ++
 .../SBJson/SBJsonStreamWriterAccumulator.h      |   36 +
 .../SBJson/SBJsonStreamWriterAccumulator.m      |   52 +
 .../ios/UGAPI/SBJson/SBJsonStreamWriterState.h  |   69 +
 .../ios/UGAPI/SBJson/SBJsonStreamWriterState.m  |  139 +
 sdks/other/ios/UGAPI/SBJson/SBJsonTokeniser.h   |   67 +
 sdks/other/ios/UGAPI/SBJson/SBJsonTokeniser.m   |  453 ++
 sdks/other/ios/UGAPI/SBJson/SBJsonUTF8Stream.h  |   58 +
 sdks/other/ios/UGAPI/SBJson/SBJsonUTF8Stream.m  |  141 +
 sdks/other/ios/UGAPI/SBJson/SBJsonWriter.h      |  117 +
 sdks/other/ios/UGAPI/SBJson/SBJsonWriter.m      |  112 +
 sdks/other/ios/UGAPI/SSKeychain.h               |  357 ++
 sdks/other/ios/UGAPI/SSKeychain.m               |  262 +
 sdks/other/ios/UGAPI/UGActivity.h               |   64 +
 sdks/other/ios/UGAPI/UGActivity.m               |  263 +
 sdks/other/ios/UGAPI/UGClient.h                 |  328 ++
 sdks/other/ios/UGAPI/UGClient.m                 | 1252 ++++
 sdks/other/ios/UGAPI/UGClientDelegate.h         |   35 +
 sdks/other/ios/UGAPI/UGClientResponse.h         |   59 +
 sdks/other/ios/UGAPI/UGClientResponse.m         |   40 +
 sdks/other/ios/UGAPI/UGHTTPManager.h            |   74 +
 sdks/other/ios/UGAPI/UGHTTPManager.m            |  328 ++
 sdks/other/ios/UGAPI/UGMultiStepAction.h        |   58 +
 sdks/other/ios/UGAPI/UGMultiStepAction.m        |   40 +
 sdks/other/ios/UGAPI/UGQuery.h                  |  104 +
 sdks/other/ios/UGAPI/UGQuery.m                  |  277 +
 sdks/other/ios/UGAPI/UGUser.h                   |   27 +
 sdks/other/ios/UGAPI/UGUser.m                   |   27 +
 sdks/other/ios/UGAPI/v2/UGConnection.h          |  289 +
 sdks/other/ios/UGAPI/v2/UGConnection.m          |  938 +++
 sdks/other/ios/UGAPI/v2/UGHTTPClient.h          |   45 +
 sdks/other/ios/UGAPI/v2/UGHTTPClient.m          |  161 +
 sdks/other/ios/UGAPI/v2/UGHTTPHelpers.h         |   40 +
 sdks/other/ios/UGAPI/v2/UGHTTPHelpers.m         |  162 +
 sdks/other/ios/UGAPI/v2/UGHTTPResult.h          |   34 +
 sdks/other/ios/UGAPI/v2/UGHTTPResult.m          |   46 +
 .../ios/UGAPIApp.xcodeproj/project.pbxproj      |  653 +++
 .../contents.xcworkspacedata                    |    7 +
 sdks/other/ios/UGAPIApp/UGAPIApp-Info.plist     |   49 +
 sdks/other/ios/UGAPIApp/UGAPIApp-Prefix.pch     |   31 +
 sdks/other/ios/UGAPIApp/UGAppAppDelegate.h      |   25 +
 sdks/other/ios/UGAPIApp/UGAppAppDelegate.m      |  139 +
 sdks/other/ios/UGAPIApp/UGAppViewController.h   |   22 +
 sdks/other/ios/UGAPIApp/UGAppViewController.m   |   47 +
 .../ios/UGAPIApp/en.lproj/InfoPlist.strings     |    2 +
 .../en.lproj/MainStoryboard_iPad.storyboard     |   27 +
 .../en.lproj/MainStoryboard_iPhone.storyboard   |   27 +
 sdks/other/ios/UGAPIApp/main.m                  |   27 +
 .../ios/UGAPIAppTests/UGAPIAppTests-Info.plist  |   22 +
 sdks/other/ios/UGAPIAppTests/UGAPIAppTests.h    |   22 +
 sdks/other/ios/UGAPIAppTests/UGAPIAppTests.m    |   41 +
 .../UGAPIAppTests/en.lproj/InfoPlist.strings    |    2 +
 sdks/other/ios/changelog.md                     |   11 +
 .../Books/books.xcodeproj/project.pbxproj       |  342 ++
 .../samples/Books/books/AddBookViewController.h |   41 +
 .../samples/Books/books/AddBookViewController.m |  169 +
 .../other/ios/samples/Books/books/AppDelegate.h |   43 +
 .../other/ios/samples/Books/books/AppDelegate.m |   43 +
 .../samples/Books/books/BooksViewController.h   |   41 +
 .../samples/Books/books/BooksViewController.m   |  154 +
 .../ios/samples/Books/books/Default-568h@2x.png |  Bin 0 -> 18594 bytes
 sdks/other/ios/samples/Books/books/Default.png  |  Bin 0 -> 6540 bytes
 .../ios/samples/Books/books/Default@2x.png      |  Bin 0 -> 16107 bytes
 .../Books/books/UGSignInViewController.h        |   23 +
 .../Books/books/UGSignInViewController.m        |  184 +
 .../ios/samples/Books/books/books-Info.plist    |   63 +
 .../ios/samples/Books/books/books-Prefix.pch    |   31 +
 .../Books/books/en.lproj/InfoPlist.strings      |   21 +
 sdks/other/ios/samples/Books/books/main.m       |   32 +
 .../Browser/browser.xcodeproj/project.pbxproj   |  487 ++
 .../samples/Browser/browser/Default-568h@2x.png |  Bin 0 -> 18594 bytes
 .../ios/samples/Browser/browser/Default.png     |  Bin 0 -> 6540 bytes
 .../ios/samples/Browser/browser/Default@2x.png  |  Bin 0 -> 16107 bytes
 .../ios/samples/Browser/browser/UGAppDelegate.h |   24 +
 .../ios/samples/Browser/browser/UGAppDelegate.m |   39 +
 .../Browser/browser/UGAppViewController.h       |   27 +
 .../Browser/browser/UGAppViewController.m       |  143 +
 .../browser/UGCollectionViewController.h        |   23 +
 .../browser/UGCollectionViewController.m        |  115 +
 .../Browser/browser/UGEntityViewController.h    |   22 +
 .../Browser/browser/UGEntityViewController.m    |   86 +
 .../Browser/browser/UGSignInViewController.h    |   24 +
 .../Browser/browser/UGSignInViewController.m    |  185 +
 .../Browser/browser/UGTextViewController.h      |   23 +
 .../Browser/browser/UGTextViewController.m      |   43 +
 .../samples/Browser/browser/browser-Info.plist  |   63 +
 .../samples/Browser/browser/browser-Prefix.pch  |   14 +
 .../Browser/browser/en.lproj/InfoPlist.strings  |    2 +
 sdks/other/ios/samples/Browser/browser/main.m   |   30 +
 sdks/other/ios/samples/parties/Icon.ai          | 4620 +++++++++++++++
 .../parties/parties.xcodeproj/project.pbxproj   |  481 ++
 .../ios/samples/parties/parties/AppDelegate.h   |   26 +
 .../ios/samples/parties/parties/AppDelegate.m   |   73 +
 .../samples/parties/parties/Default-568h@2x.png |  Bin 0 -> 18594 bytes
 .../ios/samples/parties/parties/Default.png     |  Bin 0 -> 6540 bytes
 .../ios/samples/parties/parties/Default@2x.png  |  Bin 0 -> 16107 bytes
 sdks/other/ios/samples/parties/parties/Icon.png |  Bin 0 -> 7725 bytes
 .../parties/parties/PartiesViewController.h     |   24 +
 .../parties/parties/PartiesViewController.m     |  241 +
 .../parties/parties/PartyViewController.h       |   24 +
 .../parties/parties/PartyViewController.m       |  166 +
 .../parties/parties/en.lproj/InfoPlist.strings  |    2 +
 sdks/other/ios/samples/parties/parties/main.m   |   35 +
 .../samples/parties/parties/parties-Info.plist  |   63 +
 .../samples/parties/parties/parties-Prefix.pch  |   15 +
 sdks/other/ios/test/test_client.nu              |   50 +
 sdks/other/ios/test/test_connection.nu          |  119 +
 sdks/other/perl/Build.PL                        |   46 +
 sdks/other/perl/LICENSE                         |  202 +
 sdks/other/perl/MANIFEST                        |   23 +
 sdks/other/perl/Makefile.PL                     |   41 +
 sdks/other/perl/README.md                       |  341 ++
 sdks/other/perl/examples/books.pl               |   48 +
 sdks/other/perl/lib/Usergrid/Client.pm          |  492 ++
 sdks/other/perl/lib/Usergrid/Collection.pm      |  212 +
 sdks/other/perl/lib/Usergrid/Entity.pm          |   92 +
 sdks/other/perl/lib/Usergrid/Request.pm         |  249 +
 sdks/other/perl/t/01_init.t                     |   27 +
 sdks/other/perl/t/02_login.t                    |   64 +
 sdks/other/perl/t/03_update.t                   |  102 +
 sdks/other/perl/t/04_collection.t               |  104 +
 sdks/other/perl/t/05_query.t                    |  108 +
 sdks/other/perl/t/06_batch_update.t             |  107 +
 sdks/other/perl/t/07_batch_delete.t             |   87 +
 sdks/other/perl/t/08_connections.t              |   94 +
 sdks/other/perl/t/09_paging.t                   |  140 +
 sdks/other/perl/t/10_auto_paging.t              |   94 +
 sdks/other/php/LICENSE                          |  202 +
 sdks/other/php/README.md                        |  388 ++
 sdks/other/php/changelog.md                     |    0
 sdks/other/php/examples/autoloader.inc.php      |   36 +
 sdks/other/php/examples/quick_start/index.php   |   45 +
 sdks/other/php/examples/tests/Tester.php        |   80 +
 sdks/other/php/examples/tests/client_auth.php   |  101 +
 sdks/other/php/examples/tests/collection.php    |  154 +
 sdks/other/php/examples/tests/entity.php        |  114 +
 sdks/other/php/examples/tests/exceptions.php    |   45 +
 sdks/other/php/examples/tests/generic.php       |  122 +
 sdks/other/php/examples/tests/push.php          |   71 +
 sdks/other/php/examples/tests/pushtest_dev.p12  |  Bin 0 -> 3203 bytes
 sdks/other/php/examples/tests/test.php          |   56 +
 sdks/other/php/examples/tests/user.php          |  137 +
 .../php/lib/vendor/Apache/Usergrid/Client.php   |  813 +++
 .../lib/vendor/Apache/Usergrid/Collection.php   |  313 +
 .../php/lib/vendor/Apache/Usergrid/Entity.php   |  320 ++
 .../lib/vendor/Apache/Usergrid/Exceptions.php   |   41 +
 .../lib/vendor/Apache/Usergrid/Notification.php |  103 +
 .../php/lib/vendor/Apache/Usergrid/Request.php  |  174 +
 .../php/lib/vendor/Apache/Usergrid/Response.php |   90 +
 sdks/other/php/tests/autoloader.inc.php         |   36 +
 sdks/other/php5/apache-usergrid/.gitignore      |   12 +
 .../Examples/attrubites/attributes.php          |  122 +
 .../Examples/collections/books.php              |  130 +
 .../Examples/collections/data.php               |   38 +
 .../Examples/collections/users.php              |  120 +
 .../php5/apache-usergrid/Examples/examples.md   |   17 +
 .../php5/apache-usergrid/Examples/examples.php  |  245 +
 .../Examples/management/management.php          |   91 +
 .../apache-usergrid/Examples/messages/data.php  |   17 +
 .../Examples/messages/messages.php              |   62 +
 .../Examples/notifications/data.php             |   17 +
 .../Examples/notifications/notifications.php    |   86 +
 .../Examples/notifications/notifiers.php        |   79 +
 sdks/other/php5/apache-usergrid/LICENSE         |  202 +
 sdks/other/php5/apache-usergrid/README.md       |  219 +
 sdks/other/php5/apache-usergrid/TODO.md         |    2 +
 sdks/other/php5/apache-usergrid/composer.json   |   40 +
 sdks/other/php5/apache-usergrid/composer.lock   | 1225 ++++
 sdks/other/php5/apache-usergrid/phpunit.xml     |   29 +
 .../src/Api/Exception/BadRequestException.php   |   34 +
 .../src/Api/Exception/InvalidIdException.php    |   33 +
 .../src/Api/Exception/NotFoundException.php     |   33 +
 .../src/Api/Exception/ServerErrorException.php  |   33 +
 .../src/Api/Exception/UnauthorizedException.php |   34 +
 .../src/Api/Exception/UsergridException.php     |  152 +
 .../apache-usergrid/src/Api/Filters/Boolean.php |   44 +
 .../apache-usergrid/src/Api/Filters/Date.php    |   44 +
 .../apache-usergrid/src/Api/Filters/Number.php  |   48 +
 .../apache-usergrid/src/Api/GuzzleClient.php    |   64 +
 .../src/Api/Models/Application.php              |   35 +
 .../src/Api/Models/BaseCollection.php           |  116 +
 .../src/Api/Models/Collection.php               |   37 +
 .../apache-usergrid/src/Api/Models/Device.php   |   50 +
 .../apache-usergrid/src/Api/Models/Entity.php   |   36 +
 .../apache-usergrid/src/Api/Models/Event.php    |   35 +
 .../apache-usergrid/src/Api/Models/Group.php    |   54 +
 .../src/Api/Models/GuzzleCommandTrait.php       |   59 +
 .../apache-usergrid/src/Api/Models/Notifier.php |   36 +
 .../src/Api/Models/Organization.php             |   38 +
 .../apache-usergrid/src/Api/Models/Receipt.php  |   36 +
 .../apache-usergrid/src/Api/Models/Role.php     |   54 +
 .../apache-usergrid/src/Api/Models/User.php     |   77 +
 .../apache-usergrid/src/Api/QueryAggregator.php |   61 +
 .../src/Api/ResourceIterator.php                |   69 +
 .../php5/apache-usergrid/src/Api/Usergrid.php   |  452 ++
 .../Oauth2/GrantType/AuthorizationCode.php      |   77 +
 .../Oauth2/GrantType/ClientCredentials.php      |   73 +
 .../Oauth2/GrantType/GrantTypeInterface.php     |   41 +
 .../GrantType/HWIOAuthBundleRefreshToken.php    |   62 +
 .../Oauth2/GrantType/PasswordCredentials.php    |   75 +
 .../Plugin/Oauth2/GrantType/RefreshToken.php    |   74 +
 .../src/Guzzle/Plugin/Oauth2/Oauth2Plugin.php   |  212 +
 .../Laravel/ApacheUsergridServiceProvider.php   |  159 +
 .../src/Laravel/Facades/Usergrid.php            |   42 +
 .../src/Manifests/1.0.0/Application.php         |  979 ++++
 .../src/Manifests/1.0.0/Errors.php              |   53 +
 .../src/Manifests/1.0.0/Management.php          | 1076 ++++
 .../src/Manifests/1.0.0/Manifest.php            |   25 +
 .../src/Manifests/1.0.0/Notification.php        |  154 +
 .../src/Manifests/1.0.1/Activities.php          |   24 +
 .../src/Manifests/1.0.1/Application.php         | 1108 ++++
 .../src/Manifests/1.0.1/Assets.php              |   24 +
 .../src/Manifests/1.0.1/Custom.php              |  381 ++
 .../src/Manifests/1.0.1/Devices.php             |  465 ++
 .../src/Manifests/1.0.1/Errors.php              |   50 +
 .../src/Manifests/1.0.1/Events.php              |   24 +
 .../src/Manifests/1.0.1/Groups.php              |  486 ++
 .../src/Manifests/1.0.1/Management.php          | 1076 ++++
 .../src/Manifests/1.0.1/Manifest.php            |   24 +
 .../src/Manifests/1.0.1/Messages.php            |   19 +
 .../src/Manifests/1.0.1/Notifications.php       |  241 +
 .../src/Manifests/1.0.1/Notifiers.php           |  166 +
 .../src/Manifests/1.0.1/Receipts.php            |   24 +
 .../src/Manifests/1.0.1/Roles.php               |  381 ++
 .../src/Manifests/1.0.1/Users.php               |  381 ++
 .../Manifests/swagger-json/applications.json    | 1262 +++++
 .../src/Manifests/swagger-json/management.json  | 1905 +++++++
 .../src/Manifests/swagger-json/resources.json   |   15 +
 .../src/Native/ConfigRepository.php             |  102 +
 .../src/Native/Facades/Usergrid.php             |  118 +
 .../src/Native/UsergridBootstrapper.php         |  150 +
 .../php5/apache-usergrid/src/config/config.php  |   53 +
 .../tests/Api/ApplicationTest.php               |   72 +
 .../apache-usergrid/tests/Api/AttributeTest.php |   59 +
 .../Api/Exception/BadRequestExceptionTest.php   |   59 +
 .../Api/Exception/InvalidIdExceptionTest.php    |   58 +
 .../Api/Exception/NotFoundExceptionTest.php     |   57 +
 .../Api/Exception/ServerErrorExceptionTest.php  |   58 +
 .../Api/Exception/UnauthorizedExceptionTest.php |   58 +
 .../tests/Api/Filters/BooleanTest.php           |   45 +
 .../tests/Api/Filters/DateTest.php              |   41 +
 .../tests/Api/ManagementTest.php                |   59 +
 .../tests/Api/QueryAggregatorTest.php           |   40 +
 .../apache-usergrid/tests/Api/UsergridTest.php  |  153 +
 .../tests/Laravel/Facades/UsergridTest.php      |   53 +
 .../php5/apache-usergrid/tests/bootstrap.php    |   61 +
 sdks/other/ruby-on-rails/Gemfile                |   19 +
 sdks/other/ruby-on-rails/LICENSE.txt            |   14 +
 sdks/other/ruby-on-rails/README.md              |  212 +
 sdks/other/ruby-on-rails/Rakefile               |   22 +
 sdks/other/ruby-on-rails/lib/extensions/hash.rb |   23 +
 .../ruby-on-rails/lib/extensions/resource.rb    |   66 +
 .../ruby-on-rails/lib/usergrid_ironhorse.rb     |   39 +
 .../lib/usergrid_ironhorse/base.rb              |  370 ++
 .../lib/usergrid_ironhorse/query.rb             |  929 +++
 .../lib/usergrid_ironhorse/user_context.rb      |   96 +
 .../lib/usergrid_ironhorse/version.rb           |   21 +
 sdks/other/ruby-on-rails/spec/spec_helper.rb    |   93 +
 .../other/ruby-on-rails/spec/spec_settings.yaml |   20 +
 .../spec/support/active_model_lint.rb           |   33 +
 .../spec/usergrid_ironhorse/base_spec.rb        |  452 ++
 .../ruby-on-rails/usergrid_ironhorse.gemspec    |   44 +
 sdks/other/ruby/.gitignore                      |   18 +
 sdks/other/ruby/.rspec                          |    1 +
 sdks/other/ruby/.rvmrc                          |    2 +
 sdks/other/ruby/Gemfile                         |   19 +
 sdks/other/ruby/LICENSE                         |   14 +
 sdks/other/ruby/README.md                       |  268 +
 sdks/other/ruby/Rakefile                        |   22 +
 sdks/other/ruby/bin/autospec                    |   16 +
 sdks/other/ruby/bin/htmldiff                    |   16 +
 sdks/other/ruby/bin/ldiff                       |   16 +
 sdks/other/ruby/bin/restclient                  |   16 +
 sdks/other/ruby/bin/rspec                       |   16 +
 .../other/ruby/lib/usergrid/core/application.rb |   84 +
 sdks/other/ruby/lib/usergrid/core/collection.rb |  121 +
 sdks/other/ruby/lib/usergrid/core/entity.rb     |   80 +
 sdks/other/ruby/lib/usergrid/core/management.rb |   57 +
 .../ruby/lib/usergrid/core/organization.rb      |   74 +
 sdks/other/ruby/lib/usergrid/core/resource.rb   |  157 +
 sdks/other/ruby/lib/usergrid/extensions/hash.rb |   45 +
 .../ruby/lib/usergrid/extensions/response.rb    |   96 +
 sdks/other/ruby/lib/usergrid/version.rb         |   18 +
 sdks/other/ruby/lib/usergrid_iron.rb            |   43 +
 sdks/other/ruby/spec/spec_helper.rb             |   89 +
 sdks/other/ruby/spec/spec_settings.yaml         |   27 +
 .../ruby/spec/usergrid/core/application_spec.rb |  342 ++
 .../ruby/spec/usergrid/core/collection_spec.rb  |  125 +
 .../ruby/spec/usergrid/core/entity_spec.rb      |   91 +
 .../ruby/spec/usergrid/core/management_spec.rb  |   51 +
 .../spec/usergrid/core/organization_spec.rb     |  113 +
 .../ruby/spec/usergrid/core/resource_spec.rb    |   63 +
 .../ruby/spec/usergrid/extensions/hash_spec.rb  |   40 +
 sdks/other/ruby/usergrid_iron.gemspec           |   41 +
 sdks/perl/Build.PL                              |   46 -
 sdks/perl/LICENSE                               |  202 -
 sdks/perl/MANIFEST                              |   23 -
 sdks/perl/Makefile.PL                           |   41 -
 sdks/perl/README.md                             |  341 --
 sdks/perl/examples/books.pl                     |   48 -
 sdks/perl/lib/Usergrid/Client.pm                |  492 --
 sdks/perl/lib/Usergrid/Collection.pm            |  212 -
 sdks/perl/lib/Usergrid/Entity.pm                |   92 -
 sdks/perl/lib/Usergrid/Request.pm               |  249 -
 sdks/perl/t/01_init.t                           |   27 -
 sdks/perl/t/02_login.t                          |   64 -
 sdks/perl/t/03_update.t                         |  102 -
 sdks/perl/t/04_collection.t                     |  104 -
 sdks/perl/t/05_query.t                          |  108 -
 sdks/perl/t/06_batch_update.t                   |  107 -
 sdks/perl/t/07_batch_delete.t                   |   87 -
 sdks/perl/t/08_connections.t                    |   94 -
 sdks/perl/t/09_paging.t                         |  140 -
 sdks/perl/t/10_auto_paging.t                    |   94 -
 sdks/php/LICENSE                                |  202 -
 sdks/php/README.md                              |  388 --
 sdks/php/changelog.md                           |    0
 sdks/php/examples/autoloader.inc.php            |   36 -
 sdks/php/examples/quick_start/index.php         |   45 -
 sdks/php/examples/tests/Tester.php              |   80 -
 sdks/php/examples/tests/client_auth.php         |  101 -
 sdks/php/examples/tests/collection.php          |  154 -
 sdks/php/examples/tests/entity.php              |  114 -
 sdks/php/examples/tests/exceptions.php          |   45 -
 sdks/php/examples/tests/generic.php             |  122 -
 sdks/php/examples/tests/push.php                |   71 -
 sdks/php/examples/tests/pushtest_dev.p12        |  Bin 3203 -> 0 bytes
 sdks/php/examples/tests/test.php                |   56 -
 sdks/php/examples/tests/user.php                |  137 -
 sdks/php/lib/vendor/Apache/Usergrid/Client.php  |  813 ---
 .../lib/vendor/Apache/Usergrid/Collection.php   |  313 -
 sdks/php/lib/vendor/Apache/Usergrid/Entity.php  |  320 --
 .../lib/vendor/Apache/Usergrid/Exceptions.php   |   41 -
 .../lib/vendor/Apache/Usergrid/Notification.php |  103 -
 sdks/php/lib/vendor/Apache/Usergrid/Request.php |  174 -
 .../php/lib/vendor/Apache/Usergrid/Response.php |   90 -
 sdks/php/tests/autoloader.inc.php               |   36 -
 sdks/php5/apache-usergrid/.gitignore            |   12 -
 .../Examples/attrubites/attributes.php          |  122 -
 .../Examples/collections/books.php              |  130 -
 .../Examples/collections/data.php               |   38 -
 .../Examples/collections/users.php              |  120 -
 sdks/php5/apache-usergrid/Examples/examples.md  |   17 -
 sdks/php5/apache-usergrid/Examples/examples.php |  245 -
 .../Examples/management/management.php          |   91 -
 .../apache-usergrid/Examples/messages/data.php  |   17 -
 .../Examples/messages/messages.php              |   62 -
 .../Examples/notifications/data.php             |   17 -
 .../Examples/notifications/notifications.php    |   86 -
 .../Examples/notifications/notifiers.php        |   79 -
 sdks/php5/apache-usergrid/LICENSE               |  202 -
 sdks/php5/apache-usergrid/README.md             |  219 -
 sdks/php5/apache-usergrid/TODO.md               |    2 -
 sdks/php5/apache-usergrid/composer.json         |   40 -
 sdks/php5/apache-usergrid/composer.lock         | 1225 ----
 sdks/php5/apache-usergrid/phpunit.xml           |   29 -
 .../src/Api/Exception/BadRequestException.php   |   34 -
 .../src/Api/Exception/InvalidIdException.php    |   33 -
 .../src/Api/Exception/NotFoundException.php     |   33 -
 .../src/Api/Exception/ServerErrorException.php  |   33 -
 .../src/Api/Exception/UnauthorizedException.php |   34 -
 .../src/Api/Exception/UsergridException.php     |  152 -
 .../apache-usergrid/src/Api/Filters/Boolean.php |   44 -
 .../apache-usergrid/src/Api/Filters/Date.php    |   44 -
 .../apache-usergrid/src/Api/Filters/Number.php  |   48 -
 .../apache-usergrid/src/Api/GuzzleClient.php    |   64 -
 .../src/Api/Models/Application.php              |   35 -
 .../src/Api/Models/BaseCollection.php           |  116 -
 .../src/Api/Models/Collection.php               |   37 -
 .../apache-usergrid/src/Api/Models/Device.php   |   50 -
 .../apache-usergrid/src/Api/Models/Entity.php   |   36 -
 .../apache-usergrid/src/Api/Models/Event.php    |   35 -
 .../apache-usergrid/src/Api/Models/Group.php    |   54 -
 .../src/Api/Models/GuzzleCommandTrait.php       |   59 -
 .../apache-usergrid/src/Api/Models/Notifier.php |   36 -
 .../src/Api/Models/Organization.php             |   38 -
 .../apache-usergrid/src/Api/Models/Receipt.php  |   36 -
 .../apache-usergrid/src/Api/Models/Role.php     |   54 -
 .../apache-usergrid/src/Api/Models/User.php     |   77 -
 .../apache-usergrid/src/Api/QueryAggregator.php |   61 -
 .../src/Api/ResourceIterator.php                |   69 -
 sdks/php5/apache-usergrid/src/Api/Usergrid.php  |  452 --
 .../Oauth2/GrantType/AuthorizationCode.php      |   77 -
 .../Oauth2/GrantType/ClientCredentials.php      |   73 -
 .../Oauth2/GrantType/GrantTypeInterface.php     |   41 -
 .../GrantType/HWIOAuthBundleRefreshToken.php    |   62 -
 .../Oauth2/GrantType/PasswordCredentials.php    |   75 -
 .../Plugin/Oauth2/GrantType/RefreshToken.php    |   74 -
 .../src/Guzzle/Plugin/Oauth2/Oauth2Plugin.php   |  212 -
 .../Laravel/ApacheUsergridServiceProvider.php   |  159 -
 .../src/Laravel/Facades/Usergrid.php            |   42 -
 .../src/Manifests/1.0.0/Application.php         |  979 ----
 .../src/Manifests/1.0.0/Errors.php              |   53 -
 .../src/Manifests/1.0.0/Management.php          | 1076 ----
 .../src/Manifests/1.0.0/Manifest.php            |   25 -
 .../src/Manifests/1.0.0/Notification.php        |  154 -
 .../src/Manifests/1.0.1/Activities.php          |   24 -
 .../src/Manifests/1.0.1/Application.php         | 1108 ----
 .../src/Manifests/1.0.1/Assets.php              |   24 -
 .../src/Manifests/1.0.1/Custom.php              |  381 --
 .../src/Manifests/1.0.1/Devices.php             |  465 --
 .../src/Manifests/1.0.1/Errors.php              |   50 -
 .../src/Manifests/1.0.1/Events.php              |   24 -
 .../src/Manifests/1.0.1/Groups.php              |  486 --
 .../src/Manifests/1.0.1/Management.php          | 1076 ----
 .../src/Manifests/1.0.1/Manifest.php            |   24 -
 .../src/Manifests/1.0.1/Messages.php            |   19 -
 .../src/Manifests/1.0.1/Notifications.php       |  241 -
 .../src/Manifests/1.0.1/Notifiers.php           |  166 -
 .../src/Manifests/1.0.1/Receipts.php            |   24 -
 .../src/Manifests/1.0.1/Roles.php               |  381 --
 .../src/Manifests/1.0.1/Users.php               |  381 --
 .../Manifests/swagger-json/applications.json    | 1262 -----
 .../src/Manifests/swagger-json/management.json  | 1905 -------
 .../src/Manifests/swagger-json/resources.json   |   15 -
 .../src/Native/ConfigRepository.php             |  102 -
 .../src/Native/Facades/Usergrid.php             |  118 -
 .../src/Native/UsergridBootstrapper.php         |  150 -
 sdks/php5/apache-usergrid/src/config/config.php |   53 -
 .../tests/Api/ApplicationTest.php               |   72 -
 .../apache-usergrid/tests/Api/AttributeTest.php |   59 -
 .../Api/Exception/BadRequestExceptionTest.php   |   59 -
 .../Api/Exception/InvalidIdExceptionTest.php    |   58 -
 .../Api/Exception/NotFoundExceptionTest.php     |   57 -
 .../Api/Exception/ServerErrorExceptionTest.php  |   58 -
 .../Api/Exception/UnauthorizedExceptionTest.php |   58 -
 .../tests/Api/Filters/BooleanTest.php           |   45 -
 .../tests/Api/Filters/DateTest.php              |   41 -
 .../tests/Api/ManagementTest.php                |   59 -
 .../tests/Api/QueryAggregatorTest.php           |   40 -
 .../apache-usergrid/tests/Api/UsergridTest.php  |  153 -
 .../tests/Laravel/Facades/UsergridTest.php      |   53 -
 sdks/php5/apache-usergrid/tests/bootstrap.php   |   61 -
 sdks/python/.gitignore                          |   57 -
 sdks/python/GUIDE.md                            |    2 -
 sdks/python/LICENSE                             |  202 -
 sdks/python/README.md                           |   16 +-
 sdks/python/README.rst                          |   20 -
 sdks/python/sample_app.py                       |   77 -
 sdks/python/setup.py                            |   51 -
 sdks/python/usergrid/UsergridApplication.py     |   65 -
 sdks/python/usergrid/UsergridAuth.py            |  105 -
 sdks/python/usergrid/UsergridClient.py          |  401 --
 sdks/python/usergrid/UsergridCollection.py      |   82 -
 sdks/python/usergrid/UsergridConnection.py      |   30 -
 sdks/python/usergrid/UsergridError.py           |   21 -
 sdks/python/usergrid/UsergridOrganization.py    |   35 -
 sdks/python/usergrid/UsergridQueryIterator.py   |  157 -
 sdks/python/usergrid/__init__.py                |   37 -
 sdks/python/usergrid/app_templates.py           |   38 -
 sdks/python/usergrid/management_templates.py    |   27 -
 sdks/ruby-on-rails/Gemfile                      |   19 -
 sdks/ruby-on-rails/LICENSE.txt                  |   14 -
 sdks/ruby-on-rails/README.md                    |  212 -
 sdks/ruby-on-rails/Rakefile                     |   22 -
 sdks/ruby-on-rails/lib/extensions/hash.rb       |   23 -
 sdks/ruby-on-rails/lib/extensions/resource.rb   |   66 -
 sdks/ruby-on-rails/lib/usergrid_ironhorse.rb    |   39 -
 .../lib/usergrid_ironhorse/base.rb              |  370 --
 .../lib/usergrid_ironhorse/query.rb             |  929 ---
 .../lib/usergrid_ironhorse/user_context.rb      |   96 -
 .../lib/usergrid_ironhorse/version.rb           |   21 -
 sdks/ruby-on-rails/spec/spec_helper.rb          |   93 -
 sdks/ruby-on-rails/spec/spec_settings.yaml      |   20 -
 .../spec/support/active_model_lint.rb           |   33 -
 .../spec/usergrid_ironhorse/base_spec.rb        |  452 --
 sdks/ruby-on-rails/usergrid_ironhorse.gemspec   |   44 -
 sdks/ruby/.gitignore                            |   18 -
 sdks/ruby/.rspec                                |    1 -
 sdks/ruby/.rvmrc                                |    2 -
 sdks/ruby/Gemfile                               |   19 -
 sdks/ruby/LICENSE                               |   14 -
 sdks/ruby/README.md                             |  268 -
 sdks/ruby/Rakefile                              |   22 -
 sdks/ruby/bin/autospec                          |   16 -
 sdks/ruby/bin/htmldiff                          |   16 -
 sdks/ruby/bin/ldiff                             |   16 -
 sdks/ruby/bin/restclient                        |   16 -
 sdks/ruby/bin/rspec                             |   16 -
 sdks/ruby/lib/usergrid/core/application.rb      |   84 -
 sdks/ruby/lib/usergrid/core/collection.rb       |  121 -
 sdks/ruby/lib/usergrid/core/entity.rb           |   80 -
 sdks/ruby/lib/usergrid/core/management.rb       |   57 -
 sdks/ruby/lib/usergrid/core/organization.rb     |   74 -
 sdks/ruby/lib/usergrid/core/resource.rb         |  157 -
 sdks/ruby/lib/usergrid/extensions/hash.rb       |   45 -
 sdks/ruby/lib/usergrid/extensions/response.rb   |   96 -
 sdks/ruby/lib/usergrid/version.rb               |   18 -
 sdks/ruby/lib/usergrid_iron.rb                  |   43 -
 sdks/ruby/spec/spec_helper.rb                   |   89 -
 sdks/ruby/spec/spec_settings.yaml               |   27 -
 .../ruby/spec/usergrid/core/application_spec.rb |  342 --
 sdks/ruby/spec/usergrid/core/collection_spec.rb |  125 -
 sdks/ruby/spec/usergrid/core/entity_spec.rb     |   91 -
 sdks/ruby/spec/usergrid/core/management_spec.rb |   51 -
 .../spec/usergrid/core/organization_spec.rb     |  113 -
 sdks/ruby/spec/usergrid/core/resource_spec.rb   |   63 -
 sdks/ruby/spec/usergrid/extensions/hash_spec.rb |   40 -
 sdks/ruby/usergrid_iron.gemspec                 |   41 -
 sdks/swift/.gitignore                           |   25 -
 sdks/swift/LICENSE.txt                          |   19 -
 sdks/swift/Package.swift                        |   30 -
 sdks/swift/README.md                            |  804 +--
 .../ActivityFeed.xcodeproj/project.pbxproj      |  827 ---
 .../contents.xcworkspacedata                    |    7 -
 .../contents.xcworkspacedata                    |    7 -
 .../xcshareddata/ActivityFeed.xcscmblueprint    |   30 -
 sdks/swift/Samples/ActivityFeed/Podfile         |    8 -
 sdks/swift/Samples/ActivityFeed/Readme.md       |   29 -
 .../ActivityFeed/Source/ActivityEntity.swift    |   60 -
 .../ActivityFeed/Source/AppDelegate.swift       |   65 -
 .../AppIcon.appiconset/Contents.json            |   38 -
 .../Source/Assets.xcassets/Contents.json        |    6 -
 .../UsergridGuy.imageset/Contents.json          |   21 -
 .../UsergridGuy.imageset/UsergridGuy.png        |  Bin 6230 -> 0 bytes
 .../Source/Base.lproj/LaunchScreen.storyboard   |   27 -
 .../Source/Base.lproj/Main.storyboard           |  371 --
 .../Source/FollowViewController.swift           |   50 -
 .../ActivityFeed/Source/FormTextField.swift     |   71 -
 .../Samples/ActivityFeed/Source/Info.plist      |   43 -
 .../Source/LoginViewController.swift            |   77 -
 .../Source/MessageTableViewCell.swift           |  101 -
 .../ActivityFeed/Source/MessageTextView.swift   |   39 -
 .../Source/MessageViewController.swift          |  224 -
 .../Source/RegisterViewController.swift         |   62 -
 .../ActivityFeed/Source/UsergridManager.swift   |   78 -
 .../Source/ViewControllerExtensions.swift       |   36 -
 .../Assets.xcassets/README__ignoredByTemplate__ |    1 -
 .../ExtensionDelegate.swift                     |   45 -
 .../WatchSample Extension/Info.plist            |   45 -
 .../InterfaceController.swift                   |   81 -
 .../AppIcon.appiconset/Contents.json            |   55 -
 .../WatchSample/Base.lproj/Interface.storyboard |   46 -
 .../Samples/ActivityFeed/WatchSample/Info.plist |   35 -
 .../Samples/Push/Push.xcodeproj/project.pbxproj |  473 --
 .../contents.xcworkspacedata                    |    7 -
 .../Push.xcworkspace/contents.xcworkspacedata   |    7 -
 sdks/swift/Samples/Push/Readme.md               |   21 -
 .../swift/Samples/Push/Source/AppDelegate.swift |   53 -
 .../AppIcon.appiconset/Contents.json            |   38 -
 .../Push/Source/Assets.xcassets/Contents.json   |    6 -
 .../UsergridGuy.imageset/Contents.json          |   21 -
 .../UsergridGuy.imageset/UsergridGuy.png        |  Bin 6230 -> 0 bytes
 .../Source/Base.lproj/LaunchScreen.storyboard   |   27 -
 .../Push/Source/Base.lproj/Main.storyboard      |   75 -
 sdks/swift/Samples/Push/Source/Info.plist       |   38 -
 .../Samples/Push/Source/UsergridManager.swift   |   72 -
 .../Samples/Push/Source/ViewController.swift    |   39 -
 sdks/swift/Samples/Readme.md                    |   27 -
 sdks/swift/Source/Info.plist                    |   26 -
 sdks/swift/Source/Usergrid.swift                |  637 ---
 sdks/swift/Source/UsergridAsset.swift           |  198 -
 .../Source/UsergridAssetRequestWrapper.swift    |   48 -
 sdks/swift/Source/UsergridAuth.swift            |  276 -
 sdks/swift/Source/UsergridClient.swift          |  931 ---
 sdks/swift/Source/UsergridClientConfig.swift    |  149 -
 sdks/swift/Source/UsergridDevice.swift          |  213 -
 sdks/swift/Source/UsergridEntity.swift          |  635 ---
 sdks/swift/Source/UsergridEnums.swift           |  417 --
 sdks/swift/Source/UsergridExtensions.swift      |  112 -
 sdks/swift/Source/UsergridFileMetaData.swift    |  114 -
 sdks/swift/Source/UsergridKeychainHelpers.swift |  196 -
 sdks/swift/Source/UsergridQuery.swift           |  591 --
 sdks/swift/Source/UsergridRequest.swift         |  245 -
 sdks/swift/Source/UsergridRequestManager.swift  |  176 -
 sdks/swift/Source/UsergridResponse.swift        |  203 -
 sdks/swift/Source/UsergridResponseError.swift   |   90 -
 sdks/swift/Source/UsergridSDK.h                 |   37 -
 sdks/swift/Source/UsergridSessionDelegate.swift |   90 -
 sdks/swift/Source/UsergridUser.swift            |  523 --
 sdks/swift/Tests/ASSET_Tests.swift              |  280 -
 sdks/swift/Tests/AUTH_Tests.swift               |  132 -
 sdks/swift/Tests/CONNECTION_Tests.swift         |  105 -
 sdks/swift/Tests/ClientCreationTests.swift      |   74 -
 sdks/swift/Tests/Entity_Tests.swift             |  173 -
 sdks/swift/Tests/GET_Tests.swift                |  113 -
 sdks/swift/Tests/Info.plist                     |   24 -
 sdks/swift/Tests/PUT_Tests.swift                |  158 -
 sdks/swift/Tests/TestAssets/UsergridGuy.jpg     |  Bin 12981 -> 0 bytes
 sdks/swift/Tests/TestAssets/logo_apigee.png     |  Bin 10696 -> 0 bytes
 sdks/swift/Tests/TestAssets/test.png            |  Bin 1417937 -> 0 bytes
 sdks/swift/Tests/User_Tests.swift               |  399 --
 .../swift/UsergridSDK.xcodeproj/project.pbxproj | 1179 ----
 .../contents.xcworkspacedata                    |    7 -
 .../xcshareddata/WorkspaceSettings.xcsettings   |    8 -
 .../xcschemes/UsergridSDK OSX.xcscheme          |  100 -
 .../xcschemes/UsergridSDK iOS.xcscheme          |  100 -
 .../xcschemes/UsergridSDK tvOS.xcscheme         |  114 -
 .../xcschemes/UsergridSDK watchOS.xcscheme      |   80 -
 .../xcschemes/UsergridSDK_OSX_Tests.xcscheme    |   56 -
 .../xcschemes/UsergridSDK_TVOS_Tests.xcscheme   |   56 -
 .../xcschemes/UsergridSDK_iOS_Tests.xcscheme    |   57 -
 sdks/swift/docs/Classes.html                    |  702 ---
 sdks/swift/docs/Classes/Usergrid.html           | 3798 -------------
 sdks/swift/docs/Classes/UsergridAppAuth.html    |  410 --
 sdks/swift/docs/Classes/UsergridAsset.html      |  702 ---
 .../Classes/UsergridAssetUploadRequest.html     |  356 --
 sdks/swift/docs/Classes/UsergridAuth.html       |  558 --
 sdks/swift/docs/Classes/UsergridClient.html     | 3873 -------------
 .../docs/Classes/UsergridClientConfig.html      |  744 ---
 sdks/swift/docs/Classes/UsergridDevice.html     |  763 ---
 sdks/swift/docs/Classes/UsergridEntity.html     | 2683 ---------
 .../docs/Classes/UsergridFileMetaData.html      |  532 --
 sdks/swift/docs/Classes/UsergridQuery.html      | 2278 --------
 .../UsergridQuery/UsergridQueryOperator.html    |  272 -
 .../UsergridQuery/UsergridQuerySortOrder.html   |  203 -
 sdks/swift/docs/Classes/UsergridRequest.html    |  619 --
 sdks/swift/docs/Classes/UsergridResponse.html   |  969 ----
 .../docs/Classes/UsergridResponseError.html     |  473 --
 sdks/swift/docs/Classes/UsergridUser.html       | 2434 --------
 .../UsergridUser/UsergridUserProperties.html    |  346 --
 sdks/swift/docs/Classes/UsergridUserAuth.html   |  410 --
 sdks/swift/docs/Enums.html                      |  435 --
 sdks/swift/docs/Enums/UsergridAuthFallback.html |  248 -
 sdks/swift/docs/Enums/UsergridAuthMode.html     |  283 -
 .../docs/Enums/UsergridDeviceProperties.html    |  369 --
 sdks/swift/docs/Enums/UsergridDirection.html    |  286 -
 .../docs/Enums/UsergridEntityProperties.html    |  514 --
 sdks/swift/docs/Enums/UsergridHttpMethod.html   |  341 --
 .../docs/Enums/UsergridImageContentType.html    |  286 -
 .../swift/docs/Enums/UsergridQueryOperator.html |  431 --
 .../docs/Enums/UsergridQuerySortOrder.html      |  338 --
 .../docs/Enums/UsergridUserProperties.html      |  524 --
 sdks/swift/docs/Extensions.html                 |  203 -
 sdks/swift/docs/Extensions/NSDate.html          |  448 --
 sdks/swift/docs/Extensions/UsergridAsset.html   |  184 -
 sdks/swift/docs/Extensions/UsergridAuth.html    |  260 -
 sdks/swift/docs/Extensions/UsergridClient.html  | 1962 -------
 sdks/swift/docs/Global Variables.html           |  210 -
 sdks/swift/docs/Protocols.html                  |  146 -
 sdks/swift/docs/Protocols/UsergridAuth.html     |  260 -
 sdks/swift/docs/Typealiases.html                |  411 --
 sdks/swift/docs/css/highlight.css               |  200 -
 sdks/swift/docs/css/jazzy.css                   |  331 --
 .../docs/docsets/.docset/Contents/Info.plist    |   20 -
 .../Contents/Resources/Documents/Classes.html   |  702 ---
 .../Resources/Documents/Classes/Usergrid.html   | 3798 -------------
 .../Documents/Classes/UsergridAppAuth.html      |  410 --
 .../Documents/Classes/UsergridAsset.html        |  702 ---
 .../Classes/UsergridAssetUploadRequest.html     |  356 --
 .../Documents/Classes/UsergridAuth.html         |  558 --
 .../Documents/Classes/UsergridClient.html       | 3873 -------------
 .../Documents/Classes/UsergridClientConfig.html |  744 ---
 .../Documents/Classes/UsergridDevice.html       |  763 ---
 .../Documents/Classes/UsergridEntity.html       | 2683 ---------
 .../Documents/Classes/UsergridFileMetaData.html |  532 --
 .../Documents/Classes/UsergridQuery.html        | 2278 --------
 .../UsergridQuery/UsergridQueryOperator.html    |  272 -
 .../UsergridQuery/UsergridQuerySortOrder.html   |  203 -
 .../Documents/Classes/UsergridRequest.html      |  619 --
 .../Documents/Classes/UsergridResponse.html     |  969 ----
 .../Classes/UsergridResponseError.html          |  473 --
 .../Documents/Classes/UsergridUser.html         | 2434 --------
 .../UsergridUser/UsergridUserProperties.html    |  346 --
 .../Documents/Classes/UsergridUserAuth.html     |  410 --
 .../Contents/Resources/Documents/Enums.html     |  435 --
 .../Documents/Enums/UsergridAuthFallback.html   |  248 -
 .../Documents/Enums/UsergridAuthMode.html       |  283 -
 .../Enums/UsergridDeviceProperties.html         |  369 --
 .../Documents/Enums/UsergridDirection.html      |  286 -
 .../Enums/UsergridEntityProperties.html         |  514 --
 .../Documents/Enums/UsergridHttpMethod.html     |  341 --
 .../Enums/UsergridImageContentType.html         |  286 -
 .../Documents/Enums/UsergridQueryOperator.html  |  431 --
 .../Documents/Enums/UsergridQuerySortOrder.html |  338 --
 .../Documents/Enums/UsergridUserProperties.html |  524 --
 .../Resources/Documents/Extensions.html         |  203 -
 .../Resources/Documents/Extensions/NSDate.html  |  448 --
 .../Documents/Extensions/UsergridAsset.html     |  184 -
 .../Documents/Extensions/UsergridAuth.html      |  260 -
 .../Documents/Extensions/UsergridClient.html    | 1962 -------
 .../Resources/Documents/Global Variables.html   |  210 -
 .../Contents/Resources/Documents/Protocols.html |  146 -
 .../Documents/Protocols/UsergridAuth.html       |  260 -
 .../Resources/Documents/Typealiases.html        |  411 --
 .../Resources/Documents/css/highlight.css       |  200 -
 .../Contents/Resources/Documents/css/jazzy.css  |  331 --
 .../Contents/Resources/Documents/img/carat.png  |  Bin 274 -> 0 bytes
 .../Contents/Resources/Documents/img/dash.png   |  Bin 1338 -> 0 bytes
 .../Contents/Resources/Documents/img/gh.png     |  Bin 1571 -> 0 bytes
 .../Contents/Resources/Documents/index.html     |  927 ---
 .../Contents/Resources/Documents/js/jazzy.js    |   40 -
 .../Resources/Documents/js/jquery.min.js        |    4 -
 .../Resources/Documents/undocumented.txt        |    0
 .../.docset/Contents/Resources/docSet.dsidx     |  Bin 147456 -> 0 bytes
 sdks/swift/docs/docsets/.tgz                    |  Bin 148251 -> 0 bytes
 .../UsergridSDK.docset/Contents/Info.plist      |   20 -
 .../Contents/Resources/Documents/Classes.html   |  694 ---
 .../Resources/Documents/Classes/Usergrid.html   | 3704 ------------
 .../Documents/Classes/UsergridAppAuth.html      |  402 --
 .../Documents/Classes/UsergridAsset.html        |  694 ---
 .../Classes/UsergridAssetUploadRequest.html     |  348 --
 .../Documents/Classes/UsergridAuth.html         |  550 --
 .../Documents/Classes/UsergridClient.html       | 3800 -------------
 .../Documents/Classes/UsergridClientConfig.html |  736 ---
 .../Documents/Classes/UsergridDevice.html       |  644 ---
 .../Documents/Classes/UsergridEntity.html       | 2612 ---------
 .../Documents/Classes/UsergridFileMetaData.html |  524 --
 .../Documents/Classes/UsergridQuery.html        | 2270 --------
 .../UsergridQuery/UsergridQueryOperator.html    |  272 -
 .../UsergridQuery/UsergridQuerySortOrder.html   |  203 -
 .../Documents/Classes/UsergridRequest.html      |  611 --
 .../Documents/Classes/UsergridResponse.html     |  961 ----
 .../Classes/UsergridResponseError.html          |  465 --
 .../Documents/Classes/UsergridUser.html         | 2319 --------
 .../UsergridUser/UsergridUserProperties.html    |  346 --
 .../Documents/Classes/UsergridUserAuth.html     |  402 --
 .../Contents/Resources/Documents/Enums.html     |  427 --
 .../Documents/Enums/UsergridAuthFallback.html   |  248 -
 .../Enums/UsergridDeviceProperties.html         |  361 --
 .../Documents/Enums/UsergridDirection.html      |  278 -
 .../Enums/UsergridEntityProperties.html         |  506 --
 .../Documents/Enums/UsergridHttpMethod.html     |  333 --
 .../Enums/UsergridImageContentType.html         |  278 -
 .../Documents/Enums/UsergridQueryOperator.html  |  423 --
 .../Documents/Enums/UsergridQuerySortOrder.html |  330 --
 .../Documents/Enums/UsergridUserProperties.html |  516 --
 .../Resources/Documents/Extensions.html         |  175 -
 .../Documents/Extensions/UsergridAsset.html     |  184 -
 .../Documents/Extensions/UsergridAuth.html      |  260 -
 .../Documents/Extensions/UsergridClient.html    | 1962 -------
 .../Resources/Documents/Global Variables.html   |  202 -
 .../Contents/Resources/Documents/Protocols.html |  146 -
 .../Documents/Protocols/UsergridAuth.html       |  260 -
 .../Resources/Documents/Typealiases.html        |  403 --
 .../Resources/Documents/css/highlight.css       |  200 -
 .../Contents/Resources/Documents/css/jazzy.css  |  331 --
 .../Contents/Resources/Documents/img/carat.png  |  Bin 274 -> 0 bytes
 .../Contents/Resources/Documents/img/dash.png   |  Bin 1338 -> 0 bytes
 .../Contents/Resources/Documents/img/gh.png     |  Bin 1571 -> 0 bytes
 .../Contents/Resources/Documents/index.html     |  919 ---
 .../Contents/Resources/Documents/js/jazzy.js    |   40 -
 .../Resources/Documents/js/jquery.min.js        |    4 -
 .../Resources/Documents/undocumented.txt        |    0
 .../Contents/Resources/docSet.dsidx             |  Bin 151552 -> 0 bytes
 sdks/swift/docs/docsets/UsergridSDK.tgz         |  Bin 145485 -> 0 bytes
 sdks/swift/docs/img/carat.png                   |  Bin 274 -> 0 bytes
 sdks/swift/docs/img/dash.png                    |  Bin 1338 -> 0 bytes
 sdks/swift/docs/img/gh.png                      |  Bin 1571 -> 0 bytes
 sdks/swift/docs/index.html                      |  927 ---
 sdks/swift/docs/js/jazzy.js                     |   40 -
 sdks/swift/docs/js/jquery.min.js                |    4 -
 sdks/swift/docs/undocumented.txt                |    0
 sdks/usergrid-java-sdk-0.0.6/README.txt         |    5 -
 sdks/usergrid-java-sdk-0.0.6/pom.xml            |  114 -
 .../java/org/usergrid/java/client/Client.java   | 1292 -----
 .../usergrid/java/client/entities/Activity.java |  626 --
 .../usergrid/java/client/entities/Device.java   |   68 -
 .../usergrid/java/client/entities/Entity.java   |  191 -
 .../usergrid/java/client/entities/Group.java    |   79 -
 .../usergrid/java/client/entities/Message.java  |  148 -
 .../org/usergrid/java/client/entities/User.java |  158 -
 .../java/client/exception/ClientException.java  |   42 -
 .../java/client/response/AggregateCounter.java  |   52 -
 .../client/response/AggregateCounterSet.java    |  111 -
 .../java/client/response/ApiResponse.java       |  421 --
 .../client/response/ClientCredentialsInfo.java  |   58 -
 .../java/client/response/QueueInfo.java         |   44 -
 .../usergrid/java/client/utils/JsonUtils.java   |  182 -
 .../usergrid/java/client/utils/MapUtils.java    |   39 -
 .../usergrid/java/client/utils/ObjectUtils.java |   36 -
 .../usergrid/java/client/utils/UrlUtils.java    |  124 -
 stack/README.md                                 |    6 +-
 .../corepersistence/CpEntityManager.java        |   21 +-
 .../pipeline/read/ResultsPage.java              |   14 +-
 .../read/traverse/AbstractReadGraphFilter.java  |    7 +
 .../results/IdQueryExecutor.java                |   10 +
 .../results/ObservableQueryExecutor.java        |    3 +
 .../mq/cassandra/io/AbstractSearch.java         |    8 +-
 .../actorsystem/ActorSystemManagerImpl.java     |   12 +-
 .../impl/ScopedCacheSerializationImpl.java      |   10 +-
 .../mvcc/stage/CollectionIoEvent.java           |   10 +-
 .../mvcc/stage/delete/MarkCommit.java           |    2 +-
 .../mvcc/stage/write/WriteCommit.java           |   13 +-
 .../mvcc/stage/write/WriteUniqueVerify.java     |   16 +-
 .../MvccEntitySerializationStrategyImpl.java    |    4 +-
 ...vccEntitySerializationStrategyProxyImpl.java |    4 +-
 .../MvccEntitySerializationStrategyV3Impl.java  |    4 +-
 .../MvccLogEntrySerializationProxyImpl.java     |    4 +-
 ...MvccLogEntrySerializationStrategyV1Impl.java |    4 +-
 ...MvccLogEntrySerializationStrategyV2Impl.java |    4 +-
 .../UniqueValueSerializationStrategyImpl.java   |   11 +-
 ...iqueValueSerializationStrategyProxyImpl.java |    4 +-
 .../UniqueValueSerializationStrategyV1Impl.java |   24 +-
 .../UniqueValueSerializationStrategyV2Impl.java |   25 +-
 .../uniquevalues/UniqueValuesServiceTest.java   |    4 +-
 .../astyanax/MultiRowShardColumnIterator.java   |   30 +
 .../persistence/core/datastax/CQLUtils.java     |   90 +-
 .../core/datastax/TableDefinition.java          |  105 +-
 .../core/datastax/impl/TableDefinitionImpl.java |  210 +
 .../impl/TableDefinitionStringImpl.java         |   48 +
 .../data/MigrationInfoSerializationImpl.java    |    4 +-
 .../core/migration/schema/Migration.java        |    4 +-
 .../migration/schema/MigrationManagerImpl.java  |   16 +-
 .../persistence/core/shard/SmartShard.java      |    9 +-
 .../persistence/core/datastax/CQLUtilsTest.java |   21 +-
 .../core/datastax/TableDefinitionTest.java      |    9 +-
 .../EdgeMetadataSerializationProxyImpl.java     |    4 +-
 .../impl/EdgeMetadataSerializationV1Impl.java   |    4 +-
 .../impl/EdgeMetadataSerializationV2Impl.java   |    4 +-
 .../impl/NodeSerializationImpl.java             |    4 +-
 .../serialization/impl/shard/DirectedEdge.java  |    7 +
 .../impl/shard/NodeShardAllocation.java         |    5 +-
 .../graph/serialization/impl/shard/Shard.java   |   17 +-
 .../impl/shard/impl/EdgeSearcher.java           |   17 +-
 .../shard/impl/EdgeShardSerializationImpl.java  |    4 +-
 .../shard/impl/NodeShardAllocationImpl.java     |   13 +-
 .../impl/shard/impl/NodeShardCacheImpl.java     |   48 +-
 .../shard/impl/ShardGroupCompactionImpl.java    |    2 +-
 .../impl/shard/impl/ShardGroupDeletionImpl.java |   24 +-
 .../impl/ShardedEdgeSerializationImpl.java      |  116 +-
 .../shard/impl/SizebasedEdgeColumnFamilies.java |    4 +-
 .../shard/impl/serialize/ShardSerializer.java   |   11 +-
 .../graph/GraphManagerShardConsistencyIT.java   |  396 +-
 .../impl/shard/NodeShardAllocationTest.java     |    4 +-
 .../impl/shard/NodeShardCacheTest.java          |    4 +-
 .../map/impl/MapSerializationImpl.java          |   16 +-
 .../persistence/index/query/Identifier.java     |    2 +-
 .../usergrid/persistence/queue/QueueFig.java    |    8 +-
 .../queue/impl/SNSQueueManagerImpl.java         |   14 +-
 .../apache/usergrid/rest/ShutdownListener.java  |    2 +-
 .../rest/applications/ServiceResource.java      |    7 +-
 .../rest/applications/users/UsersResource.java  |   14 +-
 .../rest/management/ManagementResource.java     |   33 +-
 .../rest/management/users/UserResource.java     |    2 +-
 .../collection/CollectionsResourceIT.java       |   18 +-
 .../usergrid/rest/management/AdminUsersIT.java  |    2 +-
 .../rest/management/ManagementResourceIT.java   |    4 +-
 .../usergrid/management/ManagementService.java  |    2 +-
 .../cassandra/ManagementServiceImpl.java        |   23 +-
 .../usergrid/tools/CollectionIterator.java      |  273 +
 .../org/apache/usergrid/tools/ExportApp.java    |  118 +-
 .../org/apache/usergrid/tools/ShardManager.java |  242 +
 .../org/apache/usergrid/tools/ToolBase.java     |    2 +
 .../usergrid/tools/UniqueValueManager.java      |  312 +
 .../usergrid/tools/export/ExportConnection.java |   74 +
 .../usergrid/tools/export/ExportEntity.java     |   66 +
 1312 files changed, 48634 insertions(+), 216462 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
index 2a44f2b,2a44f2b..29503fa
--- a/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
+++ b/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
@@@ -32,7 -32,7 +32,7 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.core.CassandraConfig;
  import org.apache.usergrid.persistence.core.astyanax.*;
  import org.apache.usergrid.persistence.core.datastax.CQLUtils;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.core.shard.ExpandingShardLocator;
  import org.apache.usergrid.persistence.core.shard.StringHashUtils;
  import org.slf4j.Logger;
@@@ -276,11 -276,11 +276,11 @@@ public class ScopedCacheSerializationIm
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
--        final TableDefinition scopedCache =
--            new TableDefinition( SCOPED_CACHE_TABLE, SCOPED_CACHE_PARTITION_KEYS, SCOPED_CACHE_COLUMN_KEYS,
--                SCOPED_CACHE_COLUMNS, TableDefinition.CacheOption.KEYS, SCOPED_CACHE_CLUSTERING_ORDER);
++        final TableDefinitionImpl scopedCache =
++            new TableDefinitionImpl( SCOPED_CACHE_TABLE, SCOPED_CACHE_PARTITION_KEYS, SCOPED_CACHE_COLUMN_KEYS,
++                SCOPED_CACHE_COLUMNS, TableDefinitionImpl.CacheOption.KEYS, SCOPED_CACHE_CLUSTERING_ORDER);
  
          return Collections.singletonList(scopedCache);
      }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
index 2d7892a,2d7892a..5f37491
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
@@@ -25,7 -25,7 +25,7 @@@ import java.util.Iterator
  import java.util.List;
  import java.util.UUID;
  
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
@@@ -344,7 -344,7 +344,7 @@@ public abstract class MvccEntitySeriali
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
          return Collections.emptyList();
      }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyProxyImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyProxyImpl.java
index 19735cc,19735cc..395ed97
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyProxyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyProxyImpl.java
@@@ -27,7 -27,7 +27,7 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
  import org.apache.usergrid.persistence.collection.serialization.impl.migration.CollectionMigrationPlugin;
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.core.migration.data.MigrationInfoCache;
  import org.apache.usergrid.persistence.core.migration.data.MigrationRelationship;
  import org.apache.usergrid.persistence.core.migration.data.VersionedMigrationSet;
@@@ -188,7 -188,7 +188,7 @@@ public class MvccEntitySerializationStr
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
          return Collections.emptyList();
      }
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
index ecd0f5c,ecd0f5c..140d953
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
@@@ -16,7 -16,7 +16,7 @@@ import com.fasterxml.jackson.core.JsonF
  import com.fasterxml.jackson.core.JsonProcessingException;
  import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  import com.netflix.astyanax.serializers.StringSerializer;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
@@@ -306,7 -306,7 +306,7 @@@ public class MvccEntitySerializationStr
      }
  
      @Override
--    public Collection<TableDefinition> getTables() {
++    public Collection<TableDefinitionImpl> getTables() {
  
          return Collections.emptyList();
      }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a8cd381d/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationProxyImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationProxyImpl.java
index b27651d,b27651d..4e87f6d
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationProxyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationProxyImpl.java
@@@ -30,7 -30,7 +30,7 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
  import org.apache.usergrid.persistence.collection.serialization.impl.migration.CollectionMigrationPlugin;
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
--import org.apache.usergrid.persistence.core.datastax.TableDefinition;
++import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionImpl;
  import org.apache.usergrid.persistence.core.migration.data.MigrationInfoCache;
  import org.apache.usergrid.persistence.core.migration.data.MigrationRelationship;
  import org.apache.usergrid.persistence.core.migration.data.VersionedMigrationSet;
@@@ -148,7 -148,7 +148,7 @@@ public class MvccLogEntrySerializationP
      }
  
      @Override
--    public Collection<TableDefinition> getTables(){
++    public Collection<TableDefinitionImpl> getTables(){
          return Collections.emptyList();
      }
  


[14/25] usergrid git commit: Changes to make Queue / Hakka tests run with fewer intermittent failures.

Posted by sn...@apache.org.
Changes to make Queue / Hakka tests run with fewer intermittent failures.


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

Branch: refs/heads/usergrid-1318-queue
Commit: f47a5f65add96bbd066c88e085bc1d6aac0cc3c2
Parents: 3075dce
Author: Dave Johnson <sn...@apache.org>
Authored: Wed Sep 14 12:23:55 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Wed Sep 14 12:23:55 2016 -0400

----------------------------------------------------------------------
 stack/corepersistence/queue/pom.xml             |  28 +++--
 .../usergrid/persistence/qakka/QakkaModule.java |   1 -
 .../distributed/DistributedQueueService.java    |   2 +
 .../distributed/actors/QueueRefresher.java      |   2 +-
 .../qakka/distributed/actors/QueueWriter.java   |   2 +-
 .../impl/DistributedQueueServiceImpl.java       |   4 +
 .../MultiShardMessageIterator.java              |  26 +++--
 .../impl/TransferLogSerializationImpl.java      |   4 +-
 .../persistence/queue/guice/QueueModule.java    |  80 ++++++++++++++-
 .../persistence/qakka/AbstractTest.java         |   2 +-
 .../qakka/core/QueueMessageManagerTest.java     |  86 ++++++++++------
 .../distributed/QueueActorServiceTest.java      |  57 ++++++-----
 .../actors/QueueActorHelperTest.java            | 101 +++++++++++--------
 .../distributed/actors/QueueReaderTest.java     |  34 +++----
 .../distributed/actors/ShardAllocatorTest.java  |  46 ++++-----
 .../queues/DatabaseQueueSerializationTest.java  |   7 +-
 .../queue/LegacyQueueManagerTest.java           |  11 +-
 .../queue/guice/TestQueueModule.java            |  30 ------
 .../queue/src/test/resources/qakka.properties   |   4 +-
 19 files changed, 327 insertions(+), 200 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/pom.xml b/stack/corepersistence/queue/pom.xml
index c74d49c..48417d5 100644
--- a/stack/corepersistence/queue/pom.xml
+++ b/stack/corepersistence/queue/pom.xml
@@ -49,15 +49,25 @@
         <pluginManagement>
             <plugins>
 
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-war-plugin</artifactId>
-                <version>2.6</version>
-                <configuration>
-                    <archiveClasses>true</archiveClasses>
-                    <attachClasses>true</attachClasses>
-                </configuration>
-            </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-war-plugin</artifactId>
+                    <version>2.6</version>
+                    <configuration>
+                        <archiveClasses>true</archiveClasses>
+                        <attachClasses>true</attachClasses>
+                    </configuration>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>${surefire.plugin.version}</version>
+                    <configuration>
+                        <forkCount>0</forkCount>
+                        <threadCount>0</threadCount>
+                    </configuration>
+                </plugin>
 
             </plugins>
         </pluginManagement>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
index b7c977c..6a60c97 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/QakkaModule.java
@@ -115,6 +115,5 @@ public class QakkaModule extends AbstractModule {
         migrationBinder.addBinding().to( Key.get( ShardCounterSerialization.class ) );
         migrationBinder.addBinding().to( Key.get( ShardSerialization.class ) );
         migrationBinder.addBinding().to( Key.get( TransferLogSerialization.class ) );
-
     }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/DistributedQueueService.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/DistributedQueueService.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/DistributedQueueService.java
index c2ca6b1..b02a623 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/DistributedQueueService.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/DistributedQueueService.java
@@ -38,6 +38,8 @@ public interface DistributedQueueService {
 
     void refresh();
 
+    void shutdown();
+
     void refreshQueue(String queueName);
 
     void processTimeouts();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueRefresher.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueRefresher.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueRefresher.java
index 03ab1ec..96ed658 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueRefresher.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueRefresher.java
@@ -108,7 +108,7 @@ public class QueueRefresher extends UntypedActor {
                     }
 
                     if ( count > 0 ) {
-                        logger.debug( "Added {} in-memory for queue {}, new size = {}",
+                        logger.info( "Added {} in-memory for queue {}, new size = {}",
                                 count, queueName, inMemoryQueue.size( queueName ) );
                     }
                 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueWriter.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueWriter.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueWriter.java
index 6c91eb0..8657370 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueWriter.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueWriter.java
@@ -128,12 +128,12 @@ public class QueueWriter extends UntypedActor {
                                 QueueWriter.WriteStatus.SUCCESS_XFERLOG_DELETED ), getSender() );
 
                     } catch (Throwable e) {
-                        logger.error("Error deleting transferlog", e);
                         logger.debug( "Unable to delete transfer log for {} {} {} {}",
                                 qa.getQueueName(),
                                 qa.getSourceRegion(),
                                 qa.getDestRegion(),
                                 qa.getMessageId() );
+                        logger.debug("Error deleting transferlog", e);
 
                         getSender().tell( new QueueWriteResponse(
                                 QueueWriter.WriteStatus.SUCCESS_XFERLOG_NOTDELETED ), getSender() );

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
index 9551c61..0b9cf59 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
@@ -293,4 +293,8 @@ public class DistributedQueueServiceImpl implements DistributedQueueService {
         throw new QakkaRuntimeException(
                 "Error sending message " + message + "after " + retries );
     }
+
+    public void shutdown() {
+        actorSystemManager.shutdownAll();
+    }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardMessageIterator.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardMessageIterator.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardMessageIterator.java
index 1c733a6..42557e6 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardMessageIterator.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardMessageIterator.java
@@ -77,19 +77,25 @@ public class MultiShardMessageIterator implements Iterator<DatabaseQueueMessage>
     @Override
     public boolean hasNext() {
 
-        if ( shardIterator.hasNext() && currentIterator == null) {
-            advance();
-        }
+        try {
 
-        if ( shardIterator.hasNext() && !currentIterator.hasNext()) {
-            advance();
-        }
+            if (shardIterator.hasNext() && currentIterator == null) {
+                advance();
+            }
 
-        if ( !shardIterator.hasNext() && ( currentIterator == null || !currentIterator.hasNext()) ) {
-            advance();
-        }
+            if (shardIterator.hasNext() && !currentIterator.hasNext()) {
+                advance();
+            }
+
+            if (!shardIterator.hasNext() && (currentIterator == null || !currentIterator.hasNext())) {
+                advance();
+            }
 
-        return currentIterator.hasNext();
+            return currentIterator.hasNext();
+
+        } catch ( NoSuchElementException e ) {
+            return false;
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/impl/TransferLogSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/impl/TransferLogSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/impl/TransferLogSerializationImpl.java
index f9fb0dc..5bb06fd 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/impl/TransferLogSerializationImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/transferlog/impl/TransferLogSerializationImpl.java
@@ -81,6 +81,9 @@ public class TransferLogSerializationImpl implements TransferLogSerialization {
                 .value(COLUMN_MESSAGE_ID, messageId )
                 .value(COLUMN_TRANSFER_TIME, System.currentTimeMillis() );
         cassandraClient.getSession().execute(insert);
+
+//        logger.debug("Recorded transfer log for queue {} dest {} messageId {}",
+//            queueName, dest, messageId);
     }
 
 
@@ -97,7 +100,6 @@ public class TransferLogSerializationImpl implements TransferLogSerialization {
         if ( rs.getAvailableWithoutFetching() == 0 ) {
             StringBuilder sb = new StringBuilder();
             sb.append( "Transfer log entry not found for queueName=" ).append( queueName );
-            sb.append( " source=" ).append( source );
             sb.append( " dest=" ).append( dest );
             sb.append( " messageId=" ).append( messageId );
             throw new QakkaException( sb.toString() );

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
index 7bd0fa7..d2247c1 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/guice/QueueModule.java
@@ -19,8 +19,41 @@ package org.apache.usergrid.persistence.queue.guice;
 
 
 import com.google.inject.AbstractModule;
+import com.google.inject.Key;
 import com.google.inject.assistedinject.FactoryModuleBuilder;
+import com.google.inject.multibindings.Multibinder;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemModule;
+import org.apache.usergrid.persistence.core.guice.CommonModule;
+import org.apache.usergrid.persistence.core.migration.schema.Migration;
+import org.apache.usergrid.persistence.qakka.App;
+import org.apache.usergrid.persistence.qakka.MetricsService;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
 import org.apache.usergrid.persistence.qakka.QakkaModule;
+import org.apache.usergrid.persistence.qakka.api.URIStrategy;
+import org.apache.usergrid.persistence.qakka.api.impl.URIStrategyLocalhost;
+import org.apache.usergrid.persistence.qakka.core.*;
+import org.apache.usergrid.persistence.qakka.core.impl.QueueManagerImpl;
+import org.apache.usergrid.persistence.qakka.core.impl.QueueMessageManagerImpl;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.apache.usergrid.persistence.qakka.distributed.actors.QueueActorHelper;
+import org.apache.usergrid.persistence.qakka.distributed.impl.DistributedQueueServiceImpl;
+import org.apache.usergrid.persistence.qakka.distributed.impl.QueueActorRouterProducer;
+import org.apache.usergrid.persistence.qakka.distributed.impl.QueueSenderRouterProducer;
+import org.apache.usergrid.persistence.qakka.distributed.impl.QueueWriterRouterProducer;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLogSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.impl.AuditLogSerializationImpl;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.impl.QueueMessageSerializationImpl;
+import org.apache.usergrid.persistence.qakka.serialization.queues.QueueSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.queues.impl.QueueSerializationImpl;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardCounterSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardStrategy;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardCounterSerializationImpl;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardSerializationImpl;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardStrategyImpl;
+import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLogSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.transferlog.impl.TransferLogSerializationImpl;
 import org.apache.usergrid.persistence.queue.LegacyQueueFig;
 import org.apache.usergrid.persistence.queue.LegacyQueueManager;
 import org.apache.usergrid.persistence.queue.LegacyQueueManagerFactory;
@@ -44,11 +77,56 @@ public class QueueModule extends AbstractModule {
 
         install(new GuicyFigModule(LegacyQueueFig.class));
 
-        install( new QakkaModule() );
+        bindQakka();
 
         bind(LegacyQueueManagerFactory.class).to(QueueManagerFactoryImpl.class);
         install( new FactoryModuleBuilder().implement(LegacyQueueManager.class, QakkaQueueManager.class)
             .build(LegacyQueueManagerInternalFactory.class));
 
     }
+
+    private void bindQakka() {
+
+        install( new CommonModule() );
+        install( new ActorSystemModule() );
+        install( new GuicyFigModule( QakkaFig.class ) );
+
+        bind( App.class );
+
+        bind( CassandraClient.class ).to(           CassandraClientImpl.class );
+        bind( MetricsService.class ).to(            App.class );
+
+        bind( QueueManager.class ).to(              QueueManagerImpl.class );
+        bind( QueueSerialization.class ).to(        QueueSerializationImpl.class );
+
+        bind( QueueMessageManager.class ).to(       QueueMessageManagerImpl.class );
+        bind( QueueMessageSerialization.class ).to( QueueMessageSerializationImpl.class );
+
+        bind( ShardSerialization.class ).to(        ShardSerializationImpl.class );
+        bind( ShardStrategy.class ).to(             ShardStrategyImpl.class );
+
+        bind( ShardCounterSerialization.class ).to( ShardCounterSerializationImpl.class );
+
+        bind( TransferLogSerialization.class ).to(  TransferLogSerializationImpl.class );
+        bind( AuditLogSerialization.class ).to(     AuditLogSerializationImpl.class );
+        bind( DistributedQueueService.class ).to(   DistributedQueueServiceImpl.class );
+
+        bind( QueueActorRouterProducer.class );
+        bind( QueueWriterRouterProducer.class );
+        bind( QueueSenderRouterProducer.class );
+        bind( QueueActorHelper.class );
+
+        bind( Regions.class );
+        bind( URIStrategy.class ).to( URIStrategyLocalhost.class );
+
+        Multibinder<Migration> migrationBinder = Multibinder.newSetBinder( binder(), Migration.class );
+
+        migrationBinder.addBinding().to( Key.get( AuditLogSerialization.class ) );
+        //migrationBinder.addBinding().to( Key.get( MessageCounterSerialization.class ) );
+        migrationBinder.addBinding().to( Key.get( QueueMessageSerialization.class ) );
+        migrationBinder.addBinding().to( Key.get( QueueSerialization.class ) );
+        migrationBinder.addBinding().to( Key.get( ShardCounterSerialization.class ) );
+        migrationBinder.addBinding().to( Key.get( ShardSerialization.class ) );
+        migrationBinder.addBinding().to( Key.get( TransferLogSerialization.class ) );
+    }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
index 8f5284c..887d9ee 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/AbstractTest.java
@@ -43,7 +43,7 @@ public class AbstractTest {
 
     public AbstractTest() {
         if ( getInjector() == null ) {
-            setInjector( Guice.createInjector( new QueueModule() ) );
+            setInjector( Guice.createInjector( new QakkaModule() ) );
             MigrationManager migrationManager = getInjector().getInstance( MigrationManager.class );
             try {
                 migrationManager.migrate();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
index c154067..d03e702 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/core/QueueMessageManagerTest.java
@@ -23,9 +23,11 @@ import com.datastax.driver.core.DataType;
 import com.datastax.driver.core.ProtocolVersion;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
+import net.jcip.annotations.NotThreadSafe;
 import org.apache.commons.lang.RandomStringUtils;
 import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
 import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.core.impl.InMemoryQueue;
 import org.apache.usergrid.persistence.qakka.serialization.Result;
 import org.apache.usergrid.persistence.qakka.AbstractTest;
 import org.apache.usergrid.persistence.qakka.App;
@@ -39,6 +41,7 @@ import org.apache.usergrid.persistence.qakka.serialization.queuemessages.Databas
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
 import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLog;
 import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLogSerialization;
+import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -52,39 +55,37 @@ import java.util.UUID;
 import java.util.stream.Collectors;
 
 
+@NotThreadSafe
 public class QueueMessageManagerTest extends AbstractTest {
     private static final Logger logger = LoggerFactory.getLogger( QueueMessageManagerTest.class );
 
     // TODO: test that multiple threads pulling from same queue will never pop same item
 
-    protected Injector myInjector = null;
-
     @Override
     protected Injector getInjector() {
-        if ( myInjector == null ) {
-            myInjector = Guice.createInjector( new QakkaModule() );
-        }
-        return myInjector;
+        return Guice.createInjector( new QakkaModule() );
     }
 
 
     @Test
     public void testBasicOperation() throws Exception {
 
-        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        Injector injector = getInjector();
+
+        CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
         cassandraClient.getSession();
 
-        DistributedQueueService distributedQueueService = getInjector().getInstance( DistributedQueueService.class );
-        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        DistributedQueueService distributedQueueService = injector.getInstance( DistributedQueueService.class );
+        ActorSystemFig actorSystemFig = injector.getInstance( ActorSystemFig.class );
 
         String region = actorSystemFig.getRegionLocal();
-        App app = getInjector().getInstance( App.class );
+        App app = injector.getInstance( App.class );
         app.start( "localhost", getNextAkkaPort(), region );
 
         // create queue and send one message to it
         String queueName = "qmmt_queue_" + RandomStringUtils.randomAlphanumeric(15);
-        QueueManager queueManager = getInjector().getInstance( QueueManager.class );
-        QueueMessageManager qmm = getInjector().getInstance( QueueMessageManager.class );
+        QueueManager queueManager = injector.getInstance( QueueManager.class );
+        QueueMessageManager qmm = injector.getInstance( QueueMessageManager.class );
         queueManager.createQueue( new Queue( queueName, "test-type", region, region, 0L, 5, 10, null ));
         String jsonData = "{}";
         qmm.sendMessages( queueName, Collections.singletonList(region), null, null,
@@ -99,7 +100,7 @@ public class QueueMessageManagerTest extends AbstractTest {
         QueueMessage message = messages.get(0);
 
         // test that queue message data is present and correct
-        QueueMessageSerialization qms = getInjector().getInstance( QueueMessageSerialization.class );
+        QueueMessageSerialization qms = injector.getInstance( QueueMessageSerialization.class );
         DatabaseQueueMessageBody data = qms.loadMessageData( message.getMessageId() );
         Assert.assertNotNull( data );
         Assert.assertEquals( "application/json", data.getContentType() );
@@ -107,7 +108,7 @@ public class QueueMessageManagerTest extends AbstractTest {
         Assert.assertEquals( jsonData, jsonDataReturned );
 
         // test that transfer log is empty for our queue
-        TransferLogSerialization tlogs = getInjector().getInstance( TransferLogSerialization.class );
+        TransferLogSerialization tlogs = injector.getInstance( TransferLogSerialization.class );
         Result<TransferLog> all = tlogs.getAllTransferLogs( null, 1000 );
         List<TransferLog> logs = all.getEntities().stream()
                 .filter( log -> log.getQueueName().equals( queueName ) ).collect( Collectors.toList() );
@@ -125,31 +126,36 @@ public class QueueMessageManagerTest extends AbstractTest {
                 DatabaseQueueMessage.Type.INFLIGHT, message.getQueueMessageId() ));
 
         // test that audit log entry was written
-        AuditLogSerialization auditLogSerialization = getInjector().getInstance( AuditLogSerialization.class );
+        AuditLogSerialization auditLogSerialization = injector.getInstance( AuditLogSerialization.class );
         Result<AuditLog> auditLogs = auditLogSerialization.getAuditLogs( message.getMessageId() );
         Assert.assertEquals( 3, auditLogs.getEntities().size() );
+
+        distributedQueueService.shutdown();
     }
 
 
     @Test
     public void testQueueMessageTimeouts() throws Exception {
 
-        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        Injector injector = getInjector();
+
+        CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
         cassandraClient.getSession();
 
-        DistributedQueueService distributedQueueService = getInjector().getInstance( DistributedQueueService.class );
-        QakkaFig qakkaFig = getInjector().getInstance( QakkaFig.class );
-        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        DistributedQueueService distributedQueueService = injector.getInstance( DistributedQueueService.class );
+        QakkaFig qakkaFig             = injector.getInstance( QakkaFig.class );
+        ActorSystemFig actorSystemFig = injector.getInstance( ActorSystemFig.class );
+        InMemoryQueue inMemoryQueue   = injector.getInstance( InMemoryQueue.class );
 
         String region = actorSystemFig.getRegionLocal();
-        App app = getInjector().getInstance( App.class );
+        App app = injector.getInstance( App.class );
         app.start( "localhost", getNextAkkaPort(), region );
 
         // create some number of queue messages
 
-        QueueManager queueManager = getInjector().getInstance( QueueManager.class );
-        QueueMessageManager qmm = getInjector().getInstance( QueueMessageManager.class );
-        String queueName = "qmmt_queue_" + RandomStringUtils.randomAlphanumeric(15);
+        QueueManager queueManager = injector.getInstance( QueueManager.class );
+        QueueMessageManager qmm   = injector.getInstance( QueueMessageManager.class );
+        String queueName = "queue_testQueueMessageTimeouts_" + RandomStringUtils.randomAlphanumeric(15);
         queueManager.createQueue( new Queue( queueName, "test-type", region, region, 0L, 5, 10, null ));
 
         int numMessages = 40;
@@ -164,8 +170,15 @@ public class QueueMessageManagerTest extends AbstractTest {
                     DataType.serializeValue( "{}", ProtocolVersion.NEWEST_SUPPORTED ) );
         }
 
-        distributedQueueService.refresh();
-        Thread.sleep(1000);
+        int maxRetries = 15;
+        int retries = 0;
+        while ( retries++ < maxRetries ) {
+            //distributedQueueService.refresh();
+            Thread.sleep( 1000 );
+            if (inMemoryQueue.size( queueName ) == 40) {
+                break;
+            }
+        }
 
         // get all messages from queue
 
@@ -205,25 +218,29 @@ public class QueueMessageManagerTest extends AbstractTest {
                 // keep on going...
             }
         }
+
+        distributedQueueService.shutdown();
     }
 
 
     @Test
     public void testGetWithMissingData() throws InterruptedException {
 
-        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        Injector injector = getInjector();
+
+        CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
         cassandraClient.getSession();
 
-        getInjector().getInstance( App.class ); // init the INJECTOR
+        injector.getInstance( App.class ); // init the INJECTOR
 
-        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
-        DistributedQueueService qas         = getInjector().getInstance( DistributedQueueService.class );
-        QueueManager qm               = getInjector().getInstance( QueueManager.class );
-        QueueMessageManager qmm       = getInjector().getInstance( QueueMessageManager.class );
-        QueueMessageSerialization qms = getInjector().getInstance( QueueMessageSerialization.class );
+        ActorSystemFig actorSystemFig = injector.getInstance( ActorSystemFig.class );
+        DistributedQueueService qas         = injector.getInstance( DistributedQueueService.class );
+        QueueManager qm               = injector.getInstance( QueueManager.class );
+        QueueMessageManager qmm       = injector.getInstance( QueueMessageManager.class );
+        QueueMessageSerialization qms = injector.getInstance( QueueMessageSerialization.class );
 
         String region = actorSystemFig.getRegionLocal();
-        App app = getInjector().getInstance( App.class );
+        App app = injector.getInstance( App.class );
         app.start( "localhost", getNextAkkaPort(), region );
 
         // create queue messages, every other one with missing data
@@ -267,6 +284,9 @@ public class QueueMessageManagerTest extends AbstractTest {
             count += messages.size();
             logger.debug("Got {} messages", ++count);
         }
+
+        DistributedQueueService distributedQueueService = injector.getInstance( DistributedQueueService.class );
+        distributedQueueService.shutdown();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
index 829ba27..4b01ffa 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/QueueActorServiceTest.java
@@ -23,6 +23,7 @@ import com.datastax.driver.core.DataType;
 import com.datastax.driver.core.ProtocolVersion;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
+import net.jcip.annotations.NotThreadSafe;
 import org.apache.cassandra.utils.UUIDGen;
 import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
 import org.apache.usergrid.persistence.qakka.AbstractTest;
@@ -36,49 +37,47 @@ import org.apache.usergrid.persistence.qakka.core.impl.InMemoryQueue;
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessageBody;
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.transferlog.TransferLogSerialization;
 import org.junit.Assert;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.ByteArrayInputStream;
-import java.io.ObjectInputStream;
 import java.nio.ByteBuffer;
 import java.util.Collection;
 import java.util.UUID;
 
 
+@NotThreadSafe
 public class QueueActorServiceTest extends AbstractTest {
     private static final Logger logger = LoggerFactory.getLogger( QueueActorServiceTest.class );
 
-    protected Injector myInjector = null;
 
     @Override
     protected Injector getInjector() {
-        if ( myInjector == null ) {
-            myInjector = Guice.createInjector( new QakkaModule() );
-        }
-        return myInjector;
+        return Guice.createInjector( new QakkaModule() );
     }
 
 
     @Test
     public void testBasicOperation() throws Exception {
 
-        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        Injector injector = getInjector();
+
+        CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
         cassandraClient.getSession();
 
-        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        ActorSystemFig actorSystemFig = injector.getInstance( ActorSystemFig.class );
         String region = actorSystemFig.getRegionLocal();
 
-        App app = getInjector().getInstance( App.class );
+        App app = injector.getInstance( App.class );
         app.start( "localhost", getNextAkkaPort(), region );
 
-        DistributedQueueService distributedQueueService = getInjector().getInstance( DistributedQueueService.class );
-        QueueMessageSerialization serialization = getInjector().getInstance( QueueMessageSerialization.class );
+        DistributedQueueService distributedQueueService = injector.getInstance( DistributedQueueService.class );
+        QueueMessageSerialization serialization = injector.getInstance( QueueMessageSerialization.class );
 
         String queueName = "testqueue_" + UUID.randomUUID();
-        QueueManager queueManager = getInjector().getInstance( QueueManager.class );
+        QueueManager queueManager = injector.getInstance( QueueManager.class );
         queueManager.createQueue( new Queue( queueName, "test-type", region, region, 0L, 5, 10, null ));
 
         // send 1 queue message, get back one queue message
@@ -109,27 +108,31 @@ public class QueueActorServiceTest extends AbstractTest {
 
         Assert.assertEquals( data, returnedData );
 
+        distributedQueueService.shutdown();
     }
 
 
     @Test
     public void testGetMultipleQueueMessages() throws InterruptedException {
 
-        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        Injector injector = getInjector();
+
+        CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
         cassandraClient.getSession();
 
-        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        ActorSystemFig actorSystemFig = injector.getInstance( ActorSystemFig.class );
         String region = actorSystemFig.getRegionLocal();
 
-        App app = getInjector().getInstance( App.class );
+        App app = injector.getInstance( App.class );
         app.start("localhost", getNextAkkaPort(), region);
 
-        DistributedQueueService distributedQueueService = getInjector().getInstance( DistributedQueueService.class );
-        QueueMessageSerialization serialization = getInjector().getInstance( QueueMessageSerialization.class );
-        InMemoryQueue inMemoryQueue             = getInjector().getInstance( InMemoryQueue.class );
+        DistributedQueueService distributedQueueService = injector.getInstance( DistributedQueueService.class );
+        QueueMessageSerialization serialization         = injector.getInstance( QueueMessageSerialization.class );
+        TransferLogSerialization xferLogSerialization   = injector.getInstance( TransferLogSerialization.class );
+        InMemoryQueue inMemoryQueue                     = injector.getInstance( InMemoryQueue.class );
 
-        String queueName = "testqueue_" + UUID.randomUUID();
-        QueueManager queueManager = getInjector().getInstance( QueueManager.class );
+        String queueName = "queue_testGetMultipleQueueMessages_" + UUID.randomUUID();
+        QueueManager queueManager = injector.getInstance( QueueManager.class );
         queueManager.createQueue(
                 new Queue( queueName, "test-type", region, region, 0L, 5, 10, null ));
 
@@ -142,21 +145,25 @@ public class QueueActorServiceTest extends AbstractTest {
                     DataType.serializeValue( data, ProtocolVersion.NEWEST_SUPPORTED ), "text/plain" );
             serialization.writeMessageData( messageId, messageBody );
 
+            xferLogSerialization.recordTransferLog(
+                queueName, actorSystemFig.getRegionLocal(), region, messageId );
+
             distributedQueueService.sendMessageToRegion(
                     queueName, region, region, messageId , null, null);
         }
 
         int maxRetries = 15;
         int retries = 0;
+        int count = 0;
         while ( retries++ < maxRetries ) {
-            distributedQueueService.refresh();
-            Thread.sleep( 3000 );
+            Thread.sleep( 1000 );
             if (inMemoryQueue.size( queueName ) == 100) {
+                count = 100;
                 break;
             }
         }
 
-        Assert.assertEquals( 100, inMemoryQueue.size( queueName ) );
+        Assert.assertEquals( 100, count );
 
         Assert.assertEquals( 25, distributedQueueService.getNextMessages( queueName, 25 ).size() );
         Assert.assertEquals( 75, inMemoryQueue.size( queueName ) );
@@ -170,6 +177,6 @@ public class QueueActorServiceTest extends AbstractTest {
         Assert.assertEquals( 25, distributedQueueService.getNextMessages( queueName, 25 ).size() );
         Assert.assertEquals( 0, inMemoryQueue.size( queueName ) );
 
+        distributedQueueService.shutdown();
     }
-
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
index 9e4128e..99ca4ea 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueActorHelperTest.java
@@ -33,6 +33,7 @@ import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLogSeri
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
 import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
 import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -41,31 +42,27 @@ import java.util.UUID;
 
 public class QueueActorHelperTest extends AbstractTest {
 
-    protected Injector myInjector = null;
 
     @Override
     protected Injector getInjector() {
-        if ( myInjector == null ) {
-            myInjector = Guice.createInjector( new QakkaModule() );
-        }
-        return myInjector;
+        return Guice.createInjector( new QakkaModule() );
     }
 
-
     @Test
     public void loadDatabaseQueueMessage() throws Exception {
 
-        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        Injector injector = getInjector();
+        CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
         cassandraClient.getSession();
 
-        getInjector().getInstance( App.class ); // init the INJECTOR
+        injector.getInstance( App.class ); // init the INJECTOR
 
-        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
-        QueueMessageSerialization qms = getInjector().getInstance( QueueMessageSerialization.class );
-        QueueManager queueManager     = getInjector().getInstance( QueueManager.class );
+        ActorSystemFig actorSystemFig = injector.getInstance( ActorSystemFig.class );
+        QueueMessageSerialization qms = injector.getInstance( QueueMessageSerialization.class );
+        QueueManager queueManager     = injector.getInstance( QueueManager.class );
 
         String region = actorSystemFig.getRegionLocal();
-        App app = getInjector().getInstance( App.class );
+        App app = injector.getInstance( App.class );
         app.start( "localhost", getNextAkkaPort(), region );
 
         String queueName = "qat_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
@@ -88,27 +85,31 @@ public class QueueActorHelperTest extends AbstractTest {
 
         // load message
 
-        QueueActorHelper helper = getInjector().getInstance( QueueActorHelper.class );
+        QueueActorHelper helper = injector.getInstance( QueueActorHelper.class );
         DatabaseQueueMessage queueMessage = helper.loadDatabaseQueueMessage(
                 queueName, message.getQueueMessageId(), message.getType() );
 
         Assert.assertNotNull( queueMessage );
+
+        DistributedQueueService distributedQueueService = injector.getInstance( DistributedQueueService.class );
+        distributedQueueService.shutdown();
     }
 
 
     @Test
     public void loadDatabaseQueueMessageNotFound() throws Exception {
 
-        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        Injector injector = getInjector();
+        CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
         cassandraClient.getSession();
 
 
-        getInjector().getInstance( App.class ); // init the INJECTOR
-        QueueManager queueManager = getInjector().getInstance( QueueManager.class );
+        injector.getInstance( App.class ); // init the INJECTOR
+        QueueManager queueManager = injector.getInstance( QueueManager.class );
 
-        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        ActorSystemFig actorSystemFig = injector.getInstance( ActorSystemFig.class );
         String region = actorSystemFig.getRegionLocal();
-        App app = getInjector().getInstance( App.class );
+        App app = injector.getInstance( App.class );
         app.start( "localhost", getNextAkkaPort(), region );
 
         String queueName = "qat_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
@@ -118,29 +119,33 @@ public class QueueActorHelperTest extends AbstractTest {
 
         // load message
 
-        QueueActorHelper helper = getInjector().getInstance( QueueActorHelper.class );
+        QueueActorHelper helper = injector.getInstance( QueueActorHelper.class );
         DatabaseQueueMessage queueMessage = helper.loadDatabaseQueueMessage(
                 queueName, QakkaUtils.getTimeUuid(), DatabaseQueueMessage.Type.DEFAULT );
 
         Assert.assertNull( queueMessage );
+
+        DistributedQueueService distributedQueueService = injector.getInstance( DistributedQueueService.class );
+        distributedQueueService.shutdown();
     }
 
 
     @Test
     public void putInflight() throws Exception {
 
-        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        Injector injector = getInjector();
+        CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
         cassandraClient.getSession();
 
 
-        getInjector().getInstance( App.class ); // init the INJECTOR
+        injector.getInstance( App.class ); // init the INJECTOR
 
-        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
-        QueueMessageSerialization qms = getInjector().getInstance( QueueMessageSerialization.class );
-        QueueManager queueManager     = getInjector().getInstance( QueueManager.class );
+        ActorSystemFig actorSystemFig = injector.getInstance( ActorSystemFig.class );
+        QueueMessageSerialization qms = injector.getInstance( QueueMessageSerialization.class );
+        QueueManager queueManager     = injector.getInstance( QueueManager.class );
 
         String region = actorSystemFig.getRegionLocal();
-        App app = getInjector().getInstance( App.class );
+        App app = injector.getInstance( App.class );
         app.start( "localhost", getNextAkkaPort(), region );
 
         // write message to messages_available table
@@ -163,7 +168,7 @@ public class QueueActorHelperTest extends AbstractTest {
 
         // put message inflight
 
-        QueueActorHelper helper = getInjector().getInstance( QueueActorHelper.class );
+        QueueActorHelper helper = injector.getInstance( QueueActorHelper.class );
         helper.putInflight( queueName, message );
 
         // message must be gone from messages_available table
@@ -186,29 +191,33 @@ public class QueueActorHelperTest extends AbstractTest {
 
         // there must be an audit log record of the successful get operation
 
-        AuditLogSerialization auditLogSerialization = getInjector().getInstance( AuditLogSerialization.class );
+        AuditLogSerialization auditLogSerialization = injector.getInstance( AuditLogSerialization.class );
         Result<AuditLog> auditLogs = auditLogSerialization.getAuditLogs( message.getMessageId() );
         Assert.assertEquals( 1, auditLogs.getEntities().size() );
         Assert.assertEquals( AuditLog.Status.SUCCESS, auditLogs.getEntities().get(0).getStatus()  );
         Assert.assertEquals( AuditLog.Action.GET,     auditLogs.getEntities().get(0).getAction()  );
+
+        DistributedQueueService distributedQueueService = injector.getInstance( DistributedQueueService.class );
+        distributedQueueService.shutdown();
     }
 
 
     @Test
     public void ackQueueMessage() throws Exception {
 
-        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        Injector injector = getInjector();
+        CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
         cassandraClient.getSession();
 
 
-        getInjector().getInstance( App.class ); // init the INJECTOR
+        injector.getInstance( App.class ); // init the INJECTOR
 
-        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
-        QueueMessageSerialization qms = getInjector().getInstance( QueueMessageSerialization.class );
-        QueueManager queueManager     = getInjector().getInstance( QueueManager.class );
+        ActorSystemFig actorSystemFig = injector.getInstance( ActorSystemFig.class );
+        QueueMessageSerialization qms = injector.getInstance( QueueMessageSerialization.class );
+        QueueManager queueManager     = injector.getInstance( QueueManager.class );
 
         String region = actorSystemFig.getRegionLocal();
-        App app = getInjector().getInstance( App.class );
+        App app = injector.getInstance( App.class );
         app.start( "localhost", getNextAkkaPort(), region );
 
         UUID queueMessageId = QakkaUtils.getTimeUuid();
@@ -231,7 +240,7 @@ public class QueueActorHelperTest extends AbstractTest {
 
         // ack message
 
-        QueueActorHelper helper = getInjector().getInstance( QueueActorHelper.class );
+        QueueActorHelper helper = injector.getInstance( QueueActorHelper.class );
         helper.ackQueueMessage( queueName, message.getQueueMessageId() );
 
         // message must be gone from messages_available table
@@ -246,27 +255,31 @@ public class QueueActorHelperTest extends AbstractTest {
 
         // there should be an audit log record of the successful ack operation
 
-        AuditLogSerialization auditLogSerialization = getInjector().getInstance( AuditLogSerialization.class );
+        AuditLogSerialization auditLogSerialization = injector.getInstance( AuditLogSerialization.class );
         Result<AuditLog> auditLogs = auditLogSerialization.getAuditLogs( message.getMessageId() );
         Assert.assertEquals( 1, auditLogs.getEntities().size() );
         Assert.assertEquals( AuditLog.Status.SUCCESS, auditLogs.getEntities().get(0).getStatus()  );
         Assert.assertEquals( AuditLog.Action.ACK,     auditLogs.getEntities().get(0).getAction()  );
+
+        DistributedQueueService distributedQueueService = injector.getInstance( DistributedQueueService.class );
+        distributedQueueService.shutdown();
     }
 
 
     @Test
     public void ackQueueMessageNotFound() throws Exception {
 
-        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        Injector injector = getInjector();
+        CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
         cassandraClient.getSession();
 
 
-        getInjector().getInstance( App.class ); // init the INJECTOR
-        QueueManager queueManager     = getInjector().getInstance( QueueManager.class );
-        ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
+        injector.getInstance( App.class ); // init the INJECTOR
+        QueueManager queueManager     = injector.getInstance( QueueManager.class );
+        ActorSystemFig actorSystemFig = injector.getInstance( ActorSystemFig.class );
 
         String region = actorSystemFig.getRegionLocal();
-        App app = getInjector().getInstance( App.class );
+        App app = injector.getInstance( App.class );
         app.start( "localhost", getNextAkkaPort(), region );
 
         String queueName = "qat_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
@@ -278,7 +291,11 @@ public class QueueActorHelperTest extends AbstractTest {
 
         // ack message must fail
 
-        QueueActorHelper helper = getInjector().getInstance( QueueActorHelper.class );
-        Assert.assertEquals( DistributedQueueService.Status.BAD_REQUEST, helper.ackQueueMessage( queueName, queueMessageId ));
+        QueueActorHelper helper = injector.getInstance( QueueActorHelper.class );
+        Assert.assertEquals( DistributedQueueService.Status.BAD_REQUEST,
+            helper.ackQueueMessage( queueName, queueMessageId ));
+
+        DistributedQueueService distributedQueueService = injector.getInstance( DistributedQueueService.class );
+        distributedQueueService.shutdown();
     }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueReaderTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueReaderTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueReaderTest.java
index 5f0be53..b803f7e 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueReaderTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/QueueReaderTest.java
@@ -47,8 +47,8 @@ import java.util.UUID;
 public class QueueReaderTest extends AbstractTest {
     private static final Logger logger = LoggerFactory.getLogger( QueueReaderTest.class );
 
-    
-    
+
+
     @Test
     public void testBasicOperation() throws Exception {
 
@@ -56,18 +56,18 @@ public class QueueReaderTest extends AbstractTest {
         cassandraClient.getSession();
 
 
-        getInjector().getInstance( App.class ); // init the INJECTOR 
-        
+        getInjector().getInstance( App.class ); // init the INJECTOR
+
         QakkaFig qakkaFig = getInjector().getInstance( QakkaFig.class );
         ActorSystemFig actorSystemFig = getInjector().getInstance( ActorSystemFig.class );
         ShardSerialization shardSerialization = getInjector().getInstance( ShardSerialization.class );
 
         int numMessages = 200;
         // create queue messages, only first lot get queue message data
-        
+
         QueueMessageSerialization serialization = getInjector().getInstance( QueueMessageSerialization.class );
         String queueName = "qrt_queue_" + RandomStringUtils.randomAlphanumeric( 10 );
-        
+
         Shard newShard = new Shard( queueName, actorSystemFig.getRegionLocal(),
                 Shard.Type.DEFAULT, 1L, QakkaUtils.getTimeUuid());
         shardSerialization.createShard( newShard );
@@ -77,16 +77,16 @@ public class QueueReaderTest extends AbstractTest {
             UUID messageId = QakkaUtils.getTimeUuid();
             UUID queueMessageId = QakkaUtils.getTimeUuid();
 
-            DatabaseQueueMessage message = new DatabaseQueueMessage( 
+            DatabaseQueueMessage message = new DatabaseQueueMessage(
                     messageId,
-                    DatabaseQueueMessage.Type.DEFAULT, 
-                    queueName, 
+                    DatabaseQueueMessage.Type.DEFAULT,
+                    queueName,
                     actorSystemFig.getRegionLocal(),
-                    null, 
-                    System.currentTimeMillis(), 
-                    null, 
+                    null,
+                    System.currentTimeMillis(),
+                    null,
                     queueMessageId);
-            serialization.writeMessage( message ); 
+            serialization.writeMessage( message );
         }
 
         InMemoryQueue inMemoryQueue = getInjector().getInstance( InMemoryQueue.class );
@@ -97,15 +97,15 @@ public class QueueReaderTest extends AbstractTest {
         ActorSystem system = ActorSystem.create("Test-" + queueName);
         ActorRef queueReaderRef = system.actorOf( Props.create( QueueRefresher.class, queueName ), "queueReader");
         QueueRefreshRequest refreshRequest = new QueueRefreshRequest( queueName );
-        queueReaderRef.tell( refreshRequest, null ); // tell sends message, returns immediately
-    
+
         // need to wait for refresh to complete
         int maxRetries = 10;
         int retries = 0;
         while ( inMemoryQueue.size( queueName ) < qakkaFig.getQueueInMemorySize() && retries++ < maxRetries ) {
-            Thread.sleep(1000);     
+            queueReaderRef.tell( refreshRequest, null ); // tell sends message, returns immediately
+            Thread.sleep(1000);
         }
-        
+
         Assert.assertEquals( numMessages, inMemoryQueue.size( queueName ) );
     }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
index 3dbd980..dc6d891 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/distributed/actors/ShardAllocatorTest.java
@@ -39,6 +39,7 @@ import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardCounter
 import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardIterator;
 import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardSerialization;
 import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
+import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -52,29 +53,27 @@ public class ShardAllocatorTest extends AbstractTest {
     private static final Logger logger = LoggerFactory.getLogger( QueueReaderTest.class );
 
 
-    protected Injector myInjector = null;
-
     @Override
     protected Injector getInjector() {
-        if ( myInjector == null ) {
-            myInjector = Guice.createInjector( new QakkaModule() );
-        }
-        return myInjector;
+        return Guice.createInjector( new QakkaModule() );
     }
 
 
     @Test
     public void testBasicOperation() throws InterruptedException {
 
-        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        Injector injector = getInjector();
+
+        CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
         cassandraClient.getSession();
 
-        getInjector().getInstance( App.class ); // init the INJECTOR
+        injector.getInstance( App.class ); // init the INJECTOR
 
-        ShardSerialization shardSer        = getInjector().getInstance( ShardSerialization.class );
-        QakkaFig qakkaFig        = getInjector().getInstance( QakkaFig.class );
-        ActorSystemFig            actorSystemFig  = getInjector().getInstance( ActorSystemFig.class );
-        ShardCounterSerialization shardCounterSer = getInjector().getInstance( ShardCounterSerialization.class );
+        ShardSerialization shardSer = injector.getInstance( ShardSerialization.class );
+        QakkaFig qakkaFig           = injector.getInstance( QakkaFig.class );
+
+        ActorSystemFig            actorSystemFig  = injector.getInstance( ActorSystemFig.class );
+        ShardCounterSerialization shardCounterSer = injector.getInstance( ShardCounterSerialization.class );
 
         String rando = RandomStringUtils.randomAlphanumeric( 20 );
 
@@ -165,20 +164,22 @@ public class ShardAllocatorTest extends AbstractTest {
     @Test
     public void testBasicOperationWithMessages() throws InterruptedException {
 
-        CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
+        Injector injector = getInjector();
+
+        CassandraClient cassandraClient = injector.getInstance( CassandraClientImpl.class );
         cassandraClient.getSession();
 
-        getInjector().getInstance( App.class ); // init the INJECTOR
+        injector.getInstance( App.class ); // init the INJECTOR
 
-        ActorSystemFig      actorSystemFig        = getInjector().getInstance( ActorSystemFig.class );
-        QueueManager        queueManager          = getInjector().getInstance( QueueManager.class );
-        QueueMessageManager queueMessageManager   = getInjector().getInstance( QueueMessageManager.class );
-        DistributedQueueService distributedQueueService = getInjector().getInstance( DistributedQueueService.class );
-        ShardCounterSerialization shardCounterSer = getInjector().getInstance( ShardCounterSerialization.class );
+        ActorSystemFig      actorSystemFig        = injector.getInstance( ActorSystemFig.class );
+        QueueManager        queueManager          = injector.getInstance( QueueManager.class );
+        QueueMessageManager queueMessageManager   = injector.getInstance( QueueMessageManager.class );
+        DistributedQueueService distributedQueueService = injector.getInstance( DistributedQueueService.class );
+        ShardCounterSerialization shardCounterSer = injector.getInstance( ShardCounterSerialization.class );
 
 
         String region = actorSystemFig.getRegionLocal();
-        App app = getInjector().getInstance( App.class );
+        App app = injector.getInstance( App.class );
         app.start( "localhost", getNextAkkaPort(), region );
 
         String rando = RandomStringUtils.randomAlphanumeric( 20 );
@@ -205,8 +206,7 @@ public class ShardAllocatorTest extends AbstractTest {
 
         // Test that 8 shards were created
 
-        Assert.assertEquals( 8,
-                countShards( cassandraClient, shardCounterSer, queueName, region, Shard.Type.DEFAULT ));
-
+        Assert.assertTrue("num shards >= 7",
+            countShards( cassandraClient, shardCounterSer, queueName, region, Shard.Type.DEFAULT ) >= 7 );
     }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueueSerializationTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueueSerializationTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueueSerializationTest.java
index 4690a1a..e50bae5 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueueSerializationTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueueSerializationTest.java
@@ -43,6 +43,8 @@ public class DatabaseQueueSerializationTest extends AbstractTest {
 
         queueSerialization.writeQueue(queue);
 
+        queueSerialization.deleteQueue( queue.getName() );
+
     }
 
     @Test
@@ -51,7 +53,7 @@ public class DatabaseQueueSerializationTest extends AbstractTest {
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
         cassandraClient.getSession();
         QueueSerialization queueSerialization = getInjector().getInstance( QueueSerialization.class );
-        
+
         DatabaseQueue queue = new DatabaseQueue("test1", "west", "west", 0L, 0, 0, "test_dlq");
 
         queueSerialization.writeQueue(queue);
@@ -59,6 +61,7 @@ public class DatabaseQueueSerializationTest extends AbstractTest {
 
         assertEquals(queue, returnedQueue);
 
+        queueSerialization.deleteQueue( queue.getName() );
     }
 
     @Test
@@ -67,7 +70,7 @@ public class DatabaseQueueSerializationTest extends AbstractTest {
         CassandraClient cassandraClient = getInjector().getInstance( CassandraClientImpl.class );
         cassandraClient.getSession();
         QueueSerialization queueSerialization = getInjector().getInstance( QueueSerialization.class );
-        
+
         DatabaseQueue queue = new DatabaseQueue("test1", "west", "west", 0L, 0, 0, "test_dlq");
 
         queueSerialization.writeQueue(queue);

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
index 4b6e9d3..0fe183c 100644
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
+++ b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/LegacyQueueManagerTest.java
@@ -28,6 +28,7 @@ import org.apache.usergrid.persistence.qakka.App;
 import org.apache.usergrid.persistence.qakka.QakkaModule;
 import org.apache.usergrid.persistence.qakka.core.CassandraClient;
 import org.apache.usergrid.persistence.qakka.core.CassandraClientImpl;
+import org.apache.usergrid.persistence.qakka.distributed.DistributedQueueService;
 import org.apache.usergrid.persistence.queue.guice.QueueModule;
 import org.apache.usergrid.persistence.queue.impl.LegacyQueueScopeImpl;
 import org.junit.Ignore;
@@ -87,6 +88,9 @@ public class LegacyQueueManagerTest extends AbstractTest {
         messageList = qm.getMessages(1, String.class);
         assertTrue(messageList.size() <= 0);
 
+        DistributedQueueService distributedQueueService = myInjector.getInstance( DistributedQueueService.class );
+        distributedQueueService.shutdown();
+
     }
 
     @Test
@@ -127,6 +131,8 @@ public class LegacyQueueManagerTest extends AbstractTest {
         messageList = qm.getMessages(1, values.getClass());
         assertTrue(messageList.size() <= 0);
 
+        DistributedQueueService distributedQueueService = myInjector.getInstance( DistributedQueueService.class );
+        distributedQueueService.shutdown();
     }
 
     @Test
@@ -182,8 +188,9 @@ public class LegacyQueueManagerTest extends AbstractTest {
             Thread.sleep(1000);
         }
         assertEquals(initialDepth, depth);
-    }
-
 
+        DistributedQueueService distributedQueueService = myInjector.getInstance( DistributedQueueService.class );
+        distributedQueueService.shutdown();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/guice/TestQueueModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/guice/TestQueueModule.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/guice/TestQueueModule.java
deleted file mode 100644
index 70e3543..0000000
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/guice/TestQueueModule.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  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.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- */
-package org.apache.usergrid.persistence.queue.guice;
-
-
-import org.apache.usergrid.persistence.core.guice.TestModule;
-
-
-public class TestQueueModule extends TestModule {
-
-    @Override
-    protected void configure() {
-        install( new QueueModule() );
-    }
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f47a5f65/stack/corepersistence/queue/src/test/resources/qakka.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/resources/qakka.properties b/stack/corepersistence/queue/src/test/resources/qakka.properties
index c3b613c..c62b0df 100644
--- a/stack/corepersistence/queue/src/test/resources/qakka.properties
+++ b/stack/corepersistence/queue/src/test/resources/qakka.properties
@@ -34,7 +34,9 @@ usergrid.cluster.seeds=us-east:localhost
 # Port used for cluster communications.
 usergrid.cluster.port=2551
 
-queue.writer.num.actors=100
+queue.sender.num.actors=10
+queue.writer.num.actors=10
+queue.num.actors=10
 
 # set shard size and times low for testing purposes
 queue.shard.max.size=500


[15/25] usergrid git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/usergrid

Posted by sn...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/usergrid

* 'master' of https://git-wip-us.apache.org/repos/asf/usergrid:
  Add unique value index update option to UniqueValueManager tool.
  Add support for application and organization client credentials to be passed in Authorization header.
  Fix NPE when user doesn't exist after lookup from the unique value index.
  Use URLs (like admin reset password URL) from properties if they are provided.


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

Branch: refs/heads/usergrid-1318-queue
Commit: 7fdba4a2cfa6d18047b5b893382806a342a78eff
Parents: 9016fd2 d915f55
Author: Dave Johnson <sn...@apache.org>
Authored: Wed Sep 14 13:25:21 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Wed Sep 14 13:25:21 2016 -0400

----------------------------------------------------------------------
 .../usergrid/rest/exceptions/AuthErrorInfo.java |   1 +
 .../shiro/filters/BasicAuthSecurityFilter.java  |  22 ++-
 .../management/AccountCreationProps.java        |   8 +
 .../cassandra/OrganizationConfigPropsImpl.java  |  38 +++-
 .../usergrid/services/users/UsersService.java   |  15 +-
 .../usergrid/tools/UniqueValueManager.java      | 183 +++++++------------
 6 files changed, 142 insertions(+), 125 deletions(-)
----------------------------------------------------------------------



[23/25] usergrid git commit: Don't include test classes in prod release

Posted by sn...@apache.org.
Don't include test classes in prod release


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

Branch: refs/heads/usergrid-1318-queue
Commit: 6f983a4c0fcf65dfabb048568c341b3698afbf25
Parents: 79c5499
Author: Dave Johnson <sn...@apache.org>
Authored: Fri Sep 16 14:53:12 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Fri Sep 16 14:53:12 2016 -0400

----------------------------------------------------------------------
 stack/core/pom.xml                       | 8 ++++++++
 stack/corepersistence/cache/pom.xml      | 1 +
 stack/corepersistence/pom.xml            | 2 +-
 stack/corepersistence/queryindex/pom.xml | 1 +
 4 files changed, 11 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/6f983a4c/stack/core/pom.xml
----------------------------------------------------------------------
diff --git a/stack/core/pom.xml b/stack/core/pom.xml
index 7ee3b06..25f2e37 100644
--- a/stack/core/pom.xml
+++ b/stack/core/pom.xml
@@ -333,6 +333,14 @@
         </dependency>
 
         <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>common</artifactId>
+            <version>${project.version}</version>
+            <classifier>tests</classifier>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
             <groupId>org.hectorclient</groupId>
             <artifactId>hector-test</artifactId>
             <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/6f983a4c/stack/corepersistence/cache/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/cache/pom.xml b/stack/corepersistence/cache/pom.xml
index b864f0d..36f5823 100644
--- a/stack/corepersistence/cache/pom.xml
+++ b/stack/corepersistence/cache/pom.xml
@@ -52,6 +52,7 @@ limitations under the License.
             <artifactId>common</artifactId>
             <version>${project.version}</version>
             <classifier>tests</classifier>
+            <scope>test</scope>
         </dependency>
 
         <!--

http://git-wip-us.apache.org/repos/asf/usergrid/blob/6f983a4c/stack/corepersistence/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/pom.xml b/stack/corepersistence/pom.xml
index b67f307..376de79 100644
--- a/stack/corepersistence/pom.xml
+++ b/stack/corepersistence/pom.xml
@@ -74,7 +74,7 @@ limitations under the License.
         <antlr.version>3.5.2</antlr.version>
         <archaius.version>0.5.12</archaius.version>
         <astyanax.version>3.9.0</astyanax.version>
-        <cassandra.version>2.1.14</cassandra.version>
+        <cassandra.version>2.1.9</cassandra.version>
         <!--        <chop.version>1.0</chop.version>-->
         <commons.codec.version>1.6</commons.codec.version>
         <commons.collections.version>3.2.1</commons.collections.version>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/6f983a4c/stack/corepersistence/queryindex/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/pom.xml b/stack/corepersistence/queryindex/pom.xml
index a3f293d..11856cb 100644
--- a/stack/corepersistence/queryindex/pom.xml
+++ b/stack/corepersistence/queryindex/pom.xml
@@ -124,6 +124,7 @@
             <artifactId>collection</artifactId>
             <version>${project.version}</version>
             <classifier>tests</classifier>
+            <scope>test</scope>
         </dependency>
 
         <dependency>


[10/25] usergrid git commit: Initial integration of Qakka into Usergrid Queue module, and implementation of Qakka-based LegacyQueueManager implementation.

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/QakkaException.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/QakkaException.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/QakkaException.java
new file mode 100644
index 0000000..84e0681
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/QakkaException.java
@@ -0,0 +1,32 @@
+/*
+ * 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.qakka.exceptions;
+
+
+public class QakkaException extends Exception {
+
+    public QakkaException(String message) {
+        super( message );
+    }
+
+    public QakkaException(String message, Throwable cause) {
+        super( message, cause );
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/QakkaRuntimeException.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/QakkaRuntimeException.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/QakkaRuntimeException.java
new file mode 100644
index 0000000..fbb788b
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/exceptions/QakkaRuntimeException.java
@@ -0,0 +1,32 @@
+/*
+ * 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.qakka.exceptions;
+
+
+public class QakkaRuntimeException extends RuntimeException {
+
+    public QakkaRuntimeException(String message) {
+        super( message );
+    }
+
+    public QakkaRuntimeException(String message, Throwable cause) {
+        super( message, cause );
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardMessageIterator.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardMessageIterator.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardMessageIterator.java
new file mode 100644
index 0000000..1c733a6
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/MultiShardMessageIterator.java
@@ -0,0 +1,181 @@
+/*
+ * 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.qakka.serialization;
+
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Statement;
+import com.datastax.driver.core.querybuilder.Clause;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.impl.QueueMessageSerializationImpl;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+import static org.apache.usergrid.persistence.qakka.serialization.queuemessages.impl.QueueMessageSerializationImpl.*;
+
+
+public class MultiShardMessageIterator implements Iterator<DatabaseQueueMessage> {
+
+    private static final Logger logger = LoggerFactory.getLogger( MultiShardMessageIterator.class );
+
+    private final CassandraClient cassandraClient;
+
+
+    private final int PAGE_SIZE = 100;
+    private final String queueName;
+    private final String region;
+    private final DatabaseQueueMessage.Type messageType;
+    private final Iterator<Shard> shardIterator;
+
+    private Iterator<DatabaseQueueMessage> currentIterator;
+    private Shard currentShard;
+    private UUID nextStart;
+
+
+    public MultiShardMessageIterator(
+            final CassandraClient cassandraClient,
+            final String queueName,
+            final String region,
+            final DatabaseQueueMessage.Type messageType,
+            final Iterator<Shard> shardIterator,
+            final UUID nextStart) {
+
+        this.queueName = queueName;
+        this.region = region;
+        this.messageType = messageType;
+        this.shardIterator = shardIterator;
+        this.nextStart = nextStart;
+        this.cassandraClient = cassandraClient;
+
+        if (shardIterator == null) {
+            throw new RuntimeException("shardIterator cannot be null");
+        }
+
+    }
+
+    @Override
+    public boolean hasNext() {
+
+        if ( shardIterator.hasNext() && currentIterator == null) {
+            advance();
+        }
+
+        if ( shardIterator.hasNext() && !currentIterator.hasNext()) {
+            advance();
+        }
+
+        if ( !shardIterator.hasNext() && ( currentIterator == null || !currentIterator.hasNext()) ) {
+            advance();
+        }
+
+        return currentIterator.hasNext();
+    }
+
+    @Override
+    public DatabaseQueueMessage next() {
+
+        if ( !hasNext() ) {
+            throw new NoSuchElementException( "No next message exists" );
+        }
+
+        return currentIterator.next();
+    }
+
+    private void advance(){
+
+        if (currentShard == null){
+            currentShard = shardIterator.next();
+        }
+
+        Clause queueNameClause = QueryBuilder.eq( COLUMN_QUEUE_NAME, queueName);
+        Clause regionClause    = QueryBuilder.eq( COLUMN_REGION, region);
+        Clause shardIdClause   = QueryBuilder.eq( COLUMN_SHARD_ID, currentShard.getShardId());
+
+        // if we have a pointer from the shard and this is the first seek, init from the pointer's position
+        if ( currentShard.getPointer() != null && nextStart == null ){
+            nextStart = currentShard.getPointer();
+        }
+
+        Statement query;
+
+        if ( nextStart == null) {
+
+            query = QueryBuilder.select().all().from(QueueMessageSerializationImpl.getTableName(messageType))
+                    .where(queueNameClause)
+                    .and(regionClause)
+                    .and(shardIdClause)
+                    .limit(PAGE_SIZE);
+        } else {
+
+            Clause messageIdClause = QueryBuilder.gt( COLUMN_QUEUE_MESSAGE_ID, nextStart);
+            query = QueryBuilder.select().all().from(QueueMessageSerializationImpl.getTableName(messageType))
+                    .where(queueNameClause)
+                    .and(regionClause)
+                    .and(shardIdClause)
+                    .and(messageIdClause)
+                    .limit(PAGE_SIZE);
+        }
+
+        List<Row> rows = cassandraClient.getSession().execute(query).all();
+
+        if ( (rows == null || rows.size() == 0) && shardIterator.hasNext()) {
+
+            currentShard = shardIterator.next();
+            advance();
+
+        } else {
+
+            currentIterator = getIteratorFromRows(rows);
+
+        }
+    }
+
+
+    private Iterator<DatabaseQueueMessage> getIteratorFromRows(List<Row> rows){
+
+        List<DatabaseQueueMessage> messages = new ArrayList<>(rows.size());
+
+        rows.forEach(row -> {
+
+            final String queueName =    row.getString( COLUMN_QUEUE_NAME);
+            final String region =       row.getString( COLUMN_REGION);
+            final long shardId =        row.getLong(   COLUMN_SHARD_ID);
+            final UUID queueMessageId = row.getUUID(   COLUMN_QUEUE_MESSAGE_ID);
+            final UUID messageId =      row.getUUID(   COLUMN_MESSAGE_ID);
+            final long queuedAt =       row.getLong(   COLUMN_QUEUED_AT);
+            final long inflightAt =     row.getLong(   COLUMN_INFLIGHT_AT);
+
+            messages.add(new DatabaseQueueMessage(
+                    messageId, messageType, queueName, region, shardId, queuedAt, inflightAt, queueMessageId));
+
+            //queueMessageId is internal to the messages_available and messages_inflight tables
+            nextStart = queueMessageId;
+
+        });
+
+        return messages.iterator();
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/Result.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/Result.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/Result.java
new file mode 100644
index 0000000..b2b0934
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/Result.java
@@ -0,0 +1,34 @@
+/*
+ * 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.qakka.serialization;
+
+import com.datastax.driver.core.PagingState;
+
+import java.util.List;
+
+
+/**
+ * Created by Dave Johnson (snoopdave@apache.org) on 8/8/16.
+ */
+public interface Result<T> {
+    PagingState getPagingState();
+
+    List<T> getEntities();
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/AuditLog.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/AuditLog.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/AuditLog.java
new file mode 100644
index 0000000..dcf0d1a
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/AuditLog.java
@@ -0,0 +1,101 @@
+/*
+ * 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.qakka.serialization.auditlog;
+
+import java.util.UUID;
+
+
+public class AuditLog {
+
+    public enum Status { SUCCESS, ERROR };
+
+    public enum Action { SEND, ACK, GET, REQUEUE };
+
+    Action action;
+    Status status;
+    String queueName;
+    String region;
+    UUID messageId;
+
+    UUID queueMessageId;
+    long transfer_time;
+
+    public AuditLog(
+            Action action,
+            Status status,
+            String queueName,
+            String region,
+            UUID messageId,
+            UUID queueMessageId,
+            long transfer_time) {
+
+        this.action = action;
+        this.status = status;
+        this.queueName = queueName;
+        this.region = region;
+        this.messageId = messageId;
+        this.queueMessageId = queueMessageId;
+        this.transfer_time = transfer_time;
+    }
+
+    public Action getAction() {
+        return action;
+    }
+
+    public Status getStatus() {
+        return status;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public void setQueueName(String queueName) {
+        this.queueName = queueName;
+    }
+
+    public String getRegion() {
+        return region;
+    }
+
+    public void setRegion(String region) {
+        this.region = region;
+    }
+
+    public UUID getMessageId() {
+        return messageId;
+    }
+
+    public void setMessageId(UUID messageId) {
+        this.messageId = messageId;
+    }
+
+    public long getTransfer_time() {
+        return transfer_time;
+    }
+
+    public void setTransfer_time(long transfer_time) {
+        this.transfer_time = transfer_time;
+    }
+
+    public UUID getQueueMessageId() {
+        return queueMessageId;
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/AuditLogSerialization.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/AuditLogSerialization.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/AuditLogSerialization.java
new file mode 100644
index 0000000..95f2dbe
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/AuditLogSerialization.java
@@ -0,0 +1,45 @@
+/*
+ * 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.qakka.serialization.auditlog;
+
+import org.apache.usergrid.persistence.core.migration.schema.Migration;
+import org.apache.usergrid.persistence.qakka.serialization.Result;
+
+import java.util.UUID;
+
+
+public interface AuditLogSerialization extends Migration {
+
+    /**
+     * Record audit log record.
+     */
+    void recordAuditLog(
+        AuditLog.Action action,
+        AuditLog.Status status,
+        String queueName,
+        String region,
+        UUID messageId,
+        UUID queueMessageId);
+
+    /**
+     * Get all audit logs for a specific queue message.
+     */
+    Result<AuditLog> getAuditLogs(UUID messageId);
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/impl/AuditLogSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/impl/AuditLogSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/impl/AuditLogSerializationImpl.java
new file mode 100644
index 0000000..d9dbab6
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/auditlog/impl/AuditLogSerializationImpl.java
@@ -0,0 +1,148 @@
+/*
+ * 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.qakka.serialization.auditlog.impl;
+
+import com.datastax.driver.core.PagingState;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Statement;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
+import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.serialization.Result;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLog;
+import org.apache.usergrid.persistence.qakka.serialization.auditlog.AuditLogSerialization;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+
+public class AuditLogSerializationImpl implements AuditLogSerialization {
+
+    private static final Logger logger = LoggerFactory.getLogger( AuditLogSerializationImpl.class );
+
+    private final CassandraClient cassandraClient;
+
+    public final static String TABLE_AUDIT_LOG   = "audit_log";
+
+    public final static String COLUMN_ACTION           = "action";
+    public final static String COLUMN_STATUS           = "status";
+    public final static String COLUMN_QUEUE_NAME       = "queue_name";
+    public final static String COLUMN_REGION           = "region";
+    public final static String COLUMN_MESSAGE_ID       = "message_id";
+    public final static String COLUMN_QUEUE_MESSAGE_ID = "queue_message_id";
+    public final static String COLUMN_TRANSFER_TIME    = "transfer_time";
+
+
+    // design note: want to be able to query this by message_id, so we can do "garbage collection"
+    // of message data items that have been processed in all target regions
+
+    static final String CQL =
+        "CREATE TABLE IF NOT EXISTS audit_log ( " +
+                "action           text, " +
+                "status           text, " +
+                "queue_name       text, " +
+                "region           text, " +
+                "message_id       timeuuid, " +
+                "queue_message_id timeuuid, " +
+                "transfer_time    bigint, " +
+                "PRIMARY KEY (message_id, transfer_time) " +
+        ") WITH CLUSTERING ORDER BY (transfer_time ASC); ";
+
+
+    @Inject
+    public AuditLogSerializationImpl( CassandraClient cassandraClient ) {
+        this.cassandraClient = cassandraClient;
+    }
+
+
+    @Override
+    public void recordAuditLog(
+            AuditLog.Action action,
+            AuditLog.Status status,
+            String queueName,
+            String region,
+            UUID messageId,
+            UUID queueMessageId ) {
+
+        Statement insert = QueryBuilder.insertInto(TABLE_AUDIT_LOG)
+                .value(COLUMN_ACTION, action.toString() )
+                .value(COLUMN_STATUS, status.toString() )
+                .value(COLUMN_QUEUE_NAME, queueName )
+                .value(COLUMN_REGION, region )
+                .value(COLUMN_MESSAGE_ID, messageId )
+                .value(COLUMN_QUEUE_MESSAGE_ID, queueMessageId )
+                .value(COLUMN_TRANSFER_TIME, System.currentTimeMillis() );
+        cassandraClient.getSession().execute(insert);
+    }
+
+
+    @Override
+    public Result<AuditLog> getAuditLogs( UUID messageId ) {
+
+        Statement query = QueryBuilder.select().all().from(TABLE_AUDIT_LOG)
+            .where( QueryBuilder.eq( COLUMN_MESSAGE_ID, messageId ) );
+
+        ResultSet rs = cassandraClient.getSession().execute( query );
+
+        final List<AuditLog> auditLogs = rs.all().stream().map( row ->
+            new AuditLog(
+                AuditLog.Action.valueOf( row.getString( COLUMN_ACTION )),
+                AuditLog.Status.valueOf( row.getString( COLUMN_STATUS )),
+                row.getString( COLUMN_QUEUE_NAME ),
+                row.getString( COLUMN_REGION ),
+                row.getUUID( COLUMN_MESSAGE_ID ),
+                row.getUUID( COLUMN_QUEUE_MESSAGE_ID ),
+                row.getLong( COLUMN_TRANSFER_TIME ) )
+        ).collect( Collectors.toList() );
+
+        return new Result<AuditLog>() {
+
+            @Override
+            public PagingState getPagingState() {
+                return null; // no paging
+            }
+
+            @Override
+            public List<AuditLog> getEntities() {
+                return auditLogs;
+            }
+        };
+
+    }
+
+
+    @Override
+    public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
+        return Collections.EMPTY_LIST;
+    }
+
+    @Override
+    public Collection<TableDefinition> getTables() {
+        return Collections.singletonList( new TableDefinitionStringImpl( TABLE_AUDIT_LOG, CQL ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/DatabaseQueueMessage.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/DatabaseQueueMessage.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/DatabaseQueueMessage.java
new file mode 100644
index 0000000..dab47d5
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/DatabaseQueueMessage.java
@@ -0,0 +1,155 @@
+/*
+ * 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.qakka.serialization.queuemessages;
+
+import java.util.UUID;
+
+
+public class DatabaseQueueMessage {
+
+    public enum Type {
+        DEFAULT, INFLIGHT
+    }
+
+    private final String queueName;
+    private final String region;
+    private final Long queuedAt;
+    private final UUID messageId;
+    private final UUID queueMessageId;
+
+    private Type type;
+    private Long inflightAt;
+
+    private Long shardId;
+
+
+    public DatabaseQueueMessage(
+            final UUID messageId,
+            final Type type,
+            final String queueName,
+            final String region,
+            final Long shardId,
+            final Long queuedAt,
+            final Long inflightAt,
+            UUID queueMessageId){
+
+        this.messageId = messageId;
+        this.type = type;
+        this.queueName = queueName;
+        this.region = region;
+        this.shardId = shardId;
+        this.queuedAt = queuedAt;
+        this.inflightAt = inflightAt;
+        this.queueMessageId = queueMessageId;
+
+    }
+
+    public void setType(Type type) {
+        this.type = type;
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public String getRegion() {
+        return region;
+    }
+
+    public Long getShardId() {
+        return shardId;
+    }
+
+    public UUID getMessageId() {
+        return messageId;
+    }
+
+    public Type getType() {
+        return type;
+    }
+
+    public Long getQueuedAt() {
+        return queuedAt;
+    }
+
+    public UUID getQueueMessageId() {
+        return queueMessageId;
+    }
+
+    public Long getInflightAt() {
+        return inflightAt;
+    }
+
+    public void setInflightAt(Long inflightAt) {
+        this.inflightAt = inflightAt;
+    }
+
+    public void setShardId(Long shardId) {
+        this.shardId = shardId;
+    }
+
+
+
+    @Override
+    public int hashCode() {
+        int result = queueName.hashCode();
+        result = ( 31 * result ) + region.hashCode();
+        result = ( 31 * result ) + (int)( shardId != null ? shardId : 0L );
+        result = ( 31 * result ) + messageId.hashCode();
+        result = ( 31 * result ) + type.hashCode();
+
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+
+        if( this == obj){
+            return true;
+        }
+
+        if( !(obj instanceof DatabaseQueueMessage)){
+            return false;
+        }
+
+        DatabaseQueueMessage that = (DatabaseQueueMessage) obj;
+
+        if( !this.queueName.equalsIgnoreCase(that.queueName)){
+            return false;
+        }
+        if( !this.region.equalsIgnoreCase(that.region)){
+            return false;
+        }
+        if( this.shardId != that.shardId){
+            return false;
+        }
+        if( !messageId.equals(that.messageId)){
+            return false;
+        }
+        if( !type.equals(that.type)){
+            return false;
+        }
+
+        return true;
+
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/DatabaseQueueMessageBody.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/DatabaseQueueMessageBody.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/DatabaseQueueMessageBody.java
new file mode 100644
index 0000000..c4c7fce
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/DatabaseQueueMessageBody.java
@@ -0,0 +1,52 @@
+/*
+ * 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.qakka.serialization.queuemessages;
+
+import com.google.common.base.Preconditions;
+
+import java.nio.ByteBuffer;
+
+
+public class DatabaseQueueMessageBody {
+
+
+    private final ByteBuffer blob;
+    private final String contentType;
+
+
+    public DatabaseQueueMessageBody(final ByteBuffer blob, final String contentType){
+
+        Preconditions.checkNotNull(blob, "Blob data cannot be null");
+
+        this.blob = blob;
+        this.contentType = contentType;
+
+    }
+
+    public ByteBuffer getBlob() {
+        return blob;
+    }
+
+    public String getContentType() {
+        return contentType;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/MessageCounterSerialization.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/MessageCounterSerialization.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/MessageCounterSerialization.java
new file mode 100644
index 0000000..cbbf11f
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/MessageCounterSerialization.java
@@ -0,0 +1,31 @@
+/*
+ * 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.qakka.serialization.queuemessages;
+
+import org.apache.usergrid.persistence.core.migration.schema.Migration;
+
+
+public interface MessageCounterSerialization  extends Migration {
+
+    void incrementCounter(String queueName, DatabaseQueueMessage.Type type, long increment);
+
+    void decrementCounter(String queueName, DatabaseQueueMessage.Type type, long increment);
+
+    long getCounterValue(String name, DatabaseQueueMessage.Type type);
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/QueueMessageSerialization.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/QueueMessageSerialization.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/QueueMessageSerialization.java
new file mode 100644
index 0000000..3ebe735
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/QueueMessageSerialization.java
@@ -0,0 +1,54 @@
+/*
+ * 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.qakka.serialization.queuemessages;
+
+import org.apache.usergrid.persistence.core.migration.schema.Migration;
+
+import java.util.UUID;
+
+
+public interface QueueMessageSerialization extends Migration {
+
+    /**
+     * Write message to storage..
+     * If queueMessageId or createdTime are null, then values will be generated.
+     */
+    UUID writeMessage(final DatabaseQueueMessage message);
+
+    DatabaseQueueMessage loadMessage(
+        final String queueName,
+        final String region,
+        final Long shardIdOrNull,
+        final DatabaseQueueMessage.Type type,
+        final UUID queueMessageId);
+
+    void deleteMessage(
+        final String queueName,
+        final String region,
+        final Long shardIdOrNull,
+        final DatabaseQueueMessage.Type type,
+        final UUID queueMessageId);
+
+    void writeMessageData(final UUID messageId, final DatabaseQueueMessageBody messageBody);
+
+    DatabaseQueueMessageBody loadMessageData(final UUID messageId);
+
+    void deleteMessageData(final UUID messageId);
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/MessageCounterSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/MessageCounterSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/MessageCounterSerializationImpl.java
new file mode 100644
index 0000000..65ffc47
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/MessageCounterSerializationImpl.java
@@ -0,0 +1,204 @@
+/*
+ * 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.qakka.serialization.queuemessages.impl;
+
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Statement;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
+import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl;
+import org.apache.usergrid.persistence.qakka.QakkaFig;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.exceptions.NotFoundException;
+import org.apache.usergrid.persistence.qakka.exceptions.QakkaRuntimeException;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardCounterSerialization;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.text.MessageFormat;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+
+
+@Singleton
+public class MessageCounterSerializationImpl implements ShardCounterSerialization {
+    private static final Logger logger = LoggerFactory.getLogger( MessageCounterSerializationImpl.class );
+
+    private final CassandraClient cassandraClient;
+
+    final static String TABLE_SHARD_COUNTERS       = "counters";
+    final static String COLUMN_QUEUE_NAME    = "queue_name";
+    final static String COLUMN_SHARD_ID      = "shard_id";
+    final static String COLUMN_COUNTER_VALUE = "counter_value";
+    final static String COLUMN_SHARD_TYPE    = "shard_type";
+
+    // design note: counters based on DataStax example here:
+    // https://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html
+
+    static final String CQL =
+        "CREATE TABLE IF NOT EXISTS shard_counters ( " +
+                "counter_value counter, " +
+                "queue_name    varchar, " +
+                "shard_type    varchar, " +
+                "shard_id      bigint, " +
+                "PRIMARY KEY (queue_name, shard_type, shard_id) " +
+        ");";
+
+
+    final long maxInMemoryIncrement;
+
+    class InMemoryCount {
+        long baseCount;
+        final AtomicLong increment = new AtomicLong( 0L );
+        InMemoryCount( long baseCount ) {
+            this.baseCount = baseCount;
+        }
+        public long value() {
+            return baseCount + increment.get();
+        }
+        public AtomicLong getIncrement() {
+            return increment;
+        }
+        void setBaseCount( long baseCount ) {
+            this.baseCount = baseCount;
+        }
+    }
+
+    private Map<String, InMemoryCount> inMemoryCounters = new ConcurrentHashMap<>(200);
+
+
+    @Inject
+    public MessageCounterSerializationImpl(QakkaFig qakkaFig, CassandraClient cassandraClient ) {
+        this.maxInMemoryIncrement = qakkaFig.getMaxInMemoryShardCounter();
+        this.cassandraClient = cassandraClient;
+    }
+
+
+    @Override
+    public void incrementCounter(String queueName, Shard.Type type, long shardId, long increment ) {
+
+        String key = queueName + type + shardId;
+        synchronized ( inMemoryCounters ) {
+
+            if ( inMemoryCounters.get( key ) == null ) {
+
+                Long value = retrieveCounterFromStorage( queueName, type, shardId );
+
+                if ( value == null ) {
+                    incrementCounterInStorage( queueName, type, shardId, 0L );
+                    inMemoryCounters.put( key, new InMemoryCount( 0L ));
+                } else {
+                    inMemoryCounters.put( key, new InMemoryCount( value ));
+                }
+                inMemoryCounters.get( key ).getIncrement().addAndGet( increment );
+                return;
+            }
+        }
+
+        InMemoryCount inMemoryCount = inMemoryCounters.get( key );
+
+        synchronized ( inMemoryCount ) {
+            long totalIncrement = inMemoryCount.getIncrement().addAndGet( increment );
+
+            if (totalIncrement > maxInMemoryIncrement) {
+                incrementCounterInStorage( queueName, type, shardId, totalIncrement );
+                inMemoryCount.setBaseCount( retrieveCounterFromStorage( queueName, type, shardId ) );
+                inMemoryCount.getIncrement().set( 0L );
+            }
+        }
+
+    }
+
+
+    @Override
+    public long getCounterValue( String queueName, Shard.Type type, long shardId ) {
+
+        String key = queueName + type + shardId;
+
+        synchronized ( inMemoryCounters ) {
+
+            if ( inMemoryCounters.get( key ) == null ) {
+
+                Long value = retrieveCounterFromStorage( queueName, type, shardId );
+
+                if ( value == null ) {
+                    throw new NotFoundException(
+                            MessageFormat.format( "No counter found for queue {0} type {1} shardId {2}",
+                                    queueName, type, shardId ));
+                } else {
+                    inMemoryCounters.put( key, new InMemoryCount( value ));
+                }
+            }
+        }
+
+        return inMemoryCounters.get( key ).value();
+    }
+
+    void incrementCounterInStorage( String queueName, Shard.Type type, long shardId, long increment ) {
+
+        Statement update = QueryBuilder.update( TABLE_SHARD_COUNTERS )
+                .where( QueryBuilder.eq(   COLUMN_QUEUE_NAME, queueName ) )
+                .and(   QueryBuilder.eq(   COLUMN_SHARD_TYPE, type.toString() ) )
+                .and(   QueryBuilder.eq(   COLUMN_SHARD_ID, shardId ) )
+                .with(  QueryBuilder.incr( COLUMN_COUNTER_VALUE, increment ) );
+        cassandraClient.getSession().execute( update );
+    }
+
+
+    Long retrieveCounterFromStorage( String queueName, Shard.Type type, long shardId ) {
+
+        Statement query = QueryBuilder.select().from( TABLE_SHARD_COUNTERS )
+                .where( QueryBuilder.eq( COLUMN_QUEUE_NAME, queueName ) )
+                .and( QueryBuilder.eq( COLUMN_SHARD_TYPE, type.toString()) )
+                .and( QueryBuilder.eq( COLUMN_SHARD_ID, shardId ) );
+
+        ResultSet resultSet = cassandraClient.getSession().execute( query );
+        List<Row> all = resultSet.all();
+
+        if ( all.size() > 1 ) {
+            throw new QakkaRuntimeException(
+                    "Multiple rows for counter " + queueName + " type " + type + " shardId " + shardId );
+        }
+        if ( all.isEmpty() ) {
+            return null;
+        }
+        return all.get(0).getLong( COLUMN_COUNTER_VALUE );
+    }
+
+
+    @Override
+    public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
+        return Collections.EMPTY_LIST;
+    }
+
+    @Override
+    public Collection<TableDefinition> getTables() {
+        return Collections.singletonList( new TableDefinitionStringImpl( TABLE_SHARD_COUNTERS, CQL ) );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/QueueMessageSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/QueueMessageSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/QueueMessageSerializationImpl.java
new file mode 100644
index 0000000..f55b936
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queuemessages/impl/QueueMessageSerializationImpl.java
@@ -0,0 +1,320 @@
+/*
+ * 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.qakka.serialization.queuemessages.impl;
+
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Statement;
+import com.datastax.driver.core.querybuilder.Clause;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
+import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.core.QakkaUtils;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessage;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.DatabaseQueueMessageBody;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.QueueMessageSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardCounterSerialization;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardStrategy;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.UUID;
+
+
+public class QueueMessageSerializationImpl implements QueueMessageSerialization {
+
+    private static final Logger logger = LoggerFactory.getLogger( QueueMessageSerializationImpl.class );
+
+    private final CassandraClient cassandraClient;
+
+    private final ActorSystemFig            actorSystemFig;
+    private final ShardStrategy             shardStrategy;
+    private final ShardCounterSerialization shardCounterSerialization;
+
+    public final static String COLUMN_QUEUE_NAME       = "queue_name";
+    public final static String COLUMN_REGION           = "region";
+    public final static String COLUMN_SHARD_ID         = "shard_id";
+    public final static String COLUMN_QUEUED_AT        = "queued_at";
+    public final static String COLUMN_INFLIGHT_AT      = "inflight_at";
+    public final static String COLUMN_QUEUE_MESSAGE_ID = "queue_message_id";
+    public final static String COLUMN_MESSAGE_ID       = "message_id";
+    public final static String COLUMN_CONTENT_TYPE     = "content_type";
+    public final static String COLUMN_MESSAGE_DATA     = "data";
+
+    public final static String TABLE_MESSAGES_AVAILABLE = "messages_available";
+
+    public final static String TABLE_MESSAGES_INFLIGHT = "messages_inflight";
+
+    public final static String TABLE_MESSAGE_DATA = "message_data";
+
+    static final String MESSAGES_AVAILABLE =
+        "CREATE TABLE IF NOT EXISTS messages_available ( " +
+                "queue_name       text, " +
+                "region           text, " +
+                "shard_id         bigint, " +
+                "queue_message_id timeuuid, " +
+                "message_id       uuid, " +
+                "queued_at        bigint, " +
+                "inflight_at      bigint, " +
+                "PRIMARY KEY ((queue_name, region, shard_id), queue_message_id ) " +
+                ") WITH CLUSTERING ORDER BY (queue_message_id ASC); ";
+
+    static final String MESSAGES_INFLIGHT =
+        "CREATE TABLE IF NOT EXISTS messages_inflight ( " +
+                "queue_name       text, " +
+                "region           text, " +
+                "shard_id         bigint, " +
+                "queue_message_id timeuuid, " +
+                "message_id       uuid, " +
+                "queued_at        bigint, " +
+                "inflight_at      bigint, " +
+                "PRIMARY KEY ((queue_name, region, shard_id), queue_message_id ) " +
+                ") WITH CLUSTERING ORDER BY (queue_message_id ASC); ";
+
+    static final String MESSAGE_DATA =
+        "CREATE TABLE IF NOT EXISTS message_data ( " +
+                "message_id uuid, " +
+                "data blob, " +
+                "content_type text, " +
+                "PRIMARY KEY ((message_id)) " +
+                "); ";
+
+    @Inject
+    public QueueMessageSerializationImpl(
+            ActorSystemFig            actorSystemFig,
+            ShardStrategy             shardStrategy,
+            ShardCounterSerialization shardCounterSerialization,
+            CassandraClient           cassandraClient
+        ) {
+        this.actorSystemFig            = actorSystemFig;
+        this.shardStrategy             = shardStrategy;
+        this.shardCounterSerialization = shardCounterSerialization;
+        this.cassandraClient = cassandraClient;
+    }
+
+
+    @Override
+    public UUID writeMessage(final DatabaseQueueMessage message) {
+
+        final UUID queueMessageId =  message.getQueueMessageId() == null ?
+                QakkaUtils.getTimeUuid() : message.getQueueMessageId();
+
+        long queuedAt = message.getQueuedAt() == null ?
+                System.currentTimeMillis() : message.getQueuedAt();
+
+        long inflightAt = message.getInflightAt() == null ?
+                message.getQueuedAt() : message.getInflightAt();
+
+        Shard.Type shardType = DatabaseQueueMessage.Type.DEFAULT.equals( message.getType() ) ?
+                Shard.Type.DEFAULT : Shard.Type.INFLIGHT;
+
+        if ( message.getShardId() == null ) {
+            Shard shard = shardStrategy.selectShard(
+                    message.getQueueName(), actorSystemFig.getRegionLocal(), shardType, queueMessageId );
+            message.setShardId( shard.getShardId() );
+        }
+
+        Statement insert = QueryBuilder.insertInto(getTableName(message.getType()))
+                .value( COLUMN_QUEUE_NAME,       message.getQueueName())
+                .value( COLUMN_REGION,           message.getRegion())
+                .value( COLUMN_SHARD_ID,         message.getShardId())
+                .value( COLUMN_MESSAGE_ID,       message.getMessageId())
+                .value( COLUMN_QUEUE_MESSAGE_ID, queueMessageId)
+                .value( COLUMN_INFLIGHT_AT,      inflightAt )
+                .value( COLUMN_QUEUED_AT,        queuedAt);
+
+        cassandraClient.getSession().execute(insert);
+
+        shardCounterSerialization.incrementCounter( message.getQueueName(), shardType, message.getShardId(), 1 );
+
+        return queueMessageId;
+    }
+
+
+    @Override
+    public DatabaseQueueMessage loadMessage(
+            final String queueName,
+            final String region,
+            final Long shardIdOrNull,
+            final DatabaseQueueMessage.Type type,
+            final UUID queueMessageId ) {
+
+        if ( queueMessageId == null ) {
+            return null;
+        }
+
+        final long shardId;
+        if ( shardIdOrNull == null ) {
+            Shard.Type shardType = DatabaseQueueMessage.Type.DEFAULT.equals( type ) ?
+                    Shard.Type.DEFAULT : Shard.Type.INFLIGHT;
+            Shard shard = shardStrategy.selectShard(
+                    queueName, actorSystemFig.getRegionLocal(), shardType, queueMessageId );
+            shardId = shard.getShardId();
+        } else {
+            shardId = shardIdOrNull;
+        }
+
+        Clause queueNameClause = QueryBuilder.eq(      COLUMN_QUEUE_NAME, queueName );
+        Clause regionClause = QueryBuilder.eq(         COLUMN_REGION, region );
+        Clause shardIdClause = QueryBuilder.eq(        COLUMN_SHARD_ID, shardId );
+        Clause queueMessageIdClause = QueryBuilder.eq( COLUMN_QUEUE_MESSAGE_ID, queueMessageId);
+
+        Statement select = QueryBuilder.select().from(getTableName( type ))
+                .where(queueNameClause)
+                .and(regionClause)
+                .and(shardIdClause)
+                .and(queueMessageIdClause);
+
+        Row row = cassandraClient.getSession().execute(select).one();
+
+        if (row == null) {
+            return null;
+        }
+
+        return new DatabaseQueueMessage(
+            row.getUUID(   COLUMN_MESSAGE_ID),
+            type,
+            row.getString( COLUMN_QUEUE_NAME),
+            row.getString( COLUMN_REGION),
+            row.getLong(   COLUMN_SHARD_ID),
+            row.getLong(   COLUMN_QUEUED_AT),
+            row.getLong(   COLUMN_INFLIGHT_AT),
+            row.getUUID(   COLUMN_QUEUE_MESSAGE_ID)
+        );
+    }
+
+
+    @Override
+    public void deleteMessage(
+            final String queueName,
+            final String region,
+            final Long shardIdOrNull,
+            final DatabaseQueueMessage.Type type,
+            final UUID queueMessageId ) {
+
+        final long shardId;
+        if ( shardIdOrNull == null ) {
+            Shard.Type shardType = DatabaseQueueMessage.Type.DEFAULT.equals( type ) ?
+                    Shard.Type.DEFAULT : Shard.Type.INFLIGHT;
+            Shard shard = shardStrategy.selectShard(
+                    queueName, actorSystemFig.getRegionLocal(), shardType, queueMessageId );
+            shardId = shard.getShardId();
+        } else {
+            shardId = shardIdOrNull;
+        }
+
+        Clause queueNameClause = QueryBuilder.eq(      COLUMN_QUEUE_NAME, queueName );
+        Clause regionClause = QueryBuilder.eq(         COLUMN_REGION, region );
+        Clause shardIdClause = QueryBuilder.eq(        COLUMN_SHARD_ID, shardId );
+        Clause queueMessageIdClause = QueryBuilder.eq( COLUMN_QUEUE_MESSAGE_ID, queueMessageId);
+
+        Statement delete = QueryBuilder.delete().from(getTableName( type ))
+                .where(queueNameClause)
+                .and(regionClause)
+                .and(shardIdClause)
+                .and(queueMessageIdClause);
+
+        ResultSet resultSet = cassandraClient.getSession().execute( delete );
+
+        String s = "s";
+    }
+
+
+    @Override
+    public DatabaseQueueMessageBody loadMessageData(final UUID messageId ){
+
+        Clause messageIdClause = QueryBuilder.eq( COLUMN_MESSAGE_ID, messageId );
+
+        Statement select = QueryBuilder.select().from( TABLE_MESSAGE_DATA).where(messageIdClause);
+
+        Row row = cassandraClient.getSession().execute(select).one();
+        if ( row == null ) {
+            return null;
+        }
+
+        return new DatabaseQueueMessageBody(
+                row.getBytes( COLUMN_MESSAGE_DATA),
+                row.getString( COLUMN_CONTENT_TYPE));
+    }
+
+
+    @Override
+    public void writeMessageData( final UUID messageId, final DatabaseQueueMessageBody messageBody ) {
+        Preconditions.checkArgument(QakkaUtils.isTimeUuid(messageId), "MessageId is not a type 1 UUID");
+
+        Statement insert = QueryBuilder.insertInto(TABLE_MESSAGE_DATA)
+                .value( COLUMN_MESSAGE_ID, messageId)
+                .value( COLUMN_MESSAGE_DATA, messageBody.getBlob())
+                .value( COLUMN_CONTENT_TYPE, messageBody.getContentType());
+
+        cassandraClient.getSession().execute(insert);
+    }
+
+
+    @Override
+    public void deleteMessageData( final UUID messageId ) {
+
+        Clause messageIdClause = QueryBuilder.eq(COLUMN_MESSAGE_ID, messageId);
+
+        Statement delete = QueryBuilder.delete().from(TABLE_MESSAGE_DATA)
+                .where(messageIdClause);
+
+        cassandraClient.getSession().execute(delete);
+    }
+
+
+    public static String getTableName(DatabaseQueueMessage.Type messageType){
+
+        String table;
+        if( messageType.equals(DatabaseQueueMessage.Type.DEFAULT)) {
+            table = TABLE_MESSAGES_AVAILABLE;
+        }else if (messageType.equals(DatabaseQueueMessage.Type.INFLIGHT)) {
+            table = TABLE_MESSAGES_INFLIGHT;
+        }else{
+            throw new IllegalArgumentException("Unknown DatabaseQueueMessage Type");
+        }
+
+        return table;
+    }
+
+    @Override
+    public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
+        return Collections.EMPTY_LIST;
+    }
+
+    @Override
+    public Collection<TableDefinition> getTables() {
+        return Lists.newArrayList(
+                new TableDefinitionStringImpl( TABLE_MESSAGES_AVAILABLE, MESSAGES_AVAILABLE ),
+                new TableDefinitionStringImpl( TABLE_MESSAGES_INFLIGHT, MESSAGES_INFLIGHT ),
+                new TableDefinitionStringImpl( TABLE_MESSAGE_DATA, MESSAGE_DATA )
+        );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueue.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueue.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueue.java
new file mode 100644
index 0000000..dcf273a
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/DatabaseQueue.java
@@ -0,0 +1,114 @@
+/*
+ * 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.qakka.serialization.queues;
+
+public class DatabaseQueue {
+
+    private final String name;
+    private final String regions;
+
+    private String defaultDestinations;
+    private Long defaultDelayMs;
+    private Integer retryCount;
+    private Integer handlingTimeoutSec;
+    private String deadLetterQueue;
+
+
+    public DatabaseQueue(final String name,
+                         final String regions,
+                         final String defaultDestinations,
+                         final Long defaultDelayMs,
+                         final Integer retryCount,
+                         final Integer handlingTimeoutSec,
+                         final String deadLetterQueue ){
+
+        this.name = name;
+        this.regions = regions;
+        this.defaultDestinations = defaultDestinations;
+        this.defaultDelayMs = defaultDelayMs;
+        this.retryCount = retryCount;
+        this.handlingTimeoutSec = handlingTimeoutSec;
+        this.deadLetterQueue = deadLetterQueue;
+
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getDeadLetterQueue() {
+        return deadLetterQueue;
+    }
+
+    public Integer getHandlingTimeoutSec() {
+        return handlingTimeoutSec;
+    }
+
+    public Integer getRetryCount() {
+        return retryCount;
+    }
+
+    public Long getDefaultDelayMs() {
+        return defaultDelayMs;
+    }
+
+    public String getDefaultDestinations() {
+        return defaultDestinations;
+    }
+
+    public String getRegions() {
+        return regions;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = name.hashCode();
+        result = ( 31 * result ) + regions.hashCode();
+
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+
+        if( this == obj){
+            return true;
+        }
+
+        if( !(obj instanceof DatabaseQueue)){
+            return false;
+        }
+
+        DatabaseQueue that = (DatabaseQueue) obj;
+
+        if( !this.name.equalsIgnoreCase(that.name)){
+            return false;
+        }
+        if( !this.regions.equals(that.regions)){
+            return false;
+        }
+
+        return true;
+
+    }
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/QueueSerialization.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/QueueSerialization.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/QueueSerialization.java
new file mode 100644
index 0000000..b00d269
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/QueueSerialization.java
@@ -0,0 +1,36 @@
+/*
+ * 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.qakka.serialization.queues;
+
+import org.apache.usergrid.persistence.core.migration.schema.Migration;
+
+import java.util.List;
+
+
+public interface QueueSerialization extends Migration {
+
+    void writeQueue(DatabaseQueue queue);
+
+    DatabaseQueue getQueue(String name);
+
+    void deleteQueue(String name);
+
+    List<String> getListOfQueues();
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/impl/QueueSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/impl/QueueSerializationImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/impl/QueueSerializationImpl.java
new file mode 100644
index 0000000..932097a
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/queues/impl/QueueSerializationImpl.java
@@ -0,0 +1,157 @@
+/*
+ * 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.qakka.serialization.queues.impl;
+
+
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Statement;
+import com.datastax.driver.core.querybuilder.Clause;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
+import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.serialization.queuemessages.impl.QueueMessageSerializationImpl;
+import org.apache.usergrid.persistence.qakka.serialization.queues.DatabaseQueue;
+import org.apache.usergrid.persistence.qakka.serialization.queues.QueueSerialization;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class QueueSerializationImpl implements QueueSerialization {
+
+    private static final Logger logger = LoggerFactory.getLogger( QueueMessageSerializationImpl.class );
+
+    private final CassandraClient cassandraClient;
+
+    public final static String COLUMN_QUEUE_NAME = "queue_name";
+    public final static String COLUMN_REGIONS = "regions";
+    public final static String COLUMN_DEFAULT_DESTINATIONS = "default_destinations";
+    public final static String COLUMN_DEFAULT_DELAY_MS = "default_delay_ms";
+    public final static String COLUMN_RETRY_COUNT = "retry_count";
+    public final static String COLUMN_HANDLING_TIMEOUT_SEC = "handling_timeout_sec";
+    public final static String COLUMN_DEAD_LETTER_QUEUE = "dead_letter_queue";
+
+
+    public final static String TABLE_QUEUES = "queues";
+
+    static final String CQL =
+        "CREATE TABLE IF NOT EXISTS queues ( " +
+            "queue_name           text, " +
+            "regions              text, " +
+            "default_destinations text, " +
+            "default_delay_ms     bigint, " +
+            "retry_count          int, " +
+            "handling_timeout_sec int, " +
+            "dead_letter_queue    text, " +
+            "PRIMARY KEY ((queue_name)) " +
+            "); ";
+
+
+    @Inject
+    public QueueSerializationImpl( CassandraClient cassandraClient ) {
+        this.cassandraClient = cassandraClient;
+    }
+
+
+    @Override
+    public void writeQueue(DatabaseQueue queue) {
+
+        Statement insert = QueryBuilder.insertInto(TABLE_QUEUES)
+                .value(COLUMN_QUEUE_NAME, queue.getName())
+                .value(COLUMN_REGIONS, queue.getRegions())
+                .value(COLUMN_DEFAULT_DESTINATIONS, queue.getDefaultDestinations())
+                .value(COLUMN_DEFAULT_DELAY_MS, queue.getDefaultDelayMs())
+                .value(COLUMN_RETRY_COUNT, queue.getRetryCount())
+                .value(COLUMN_HANDLING_TIMEOUT_SEC, queue.getHandlingTimeoutSec())
+                .value(COLUMN_DEAD_LETTER_QUEUE, queue.getDeadLetterQueue());
+
+
+        cassandraClient.getSession().execute(insert);
+
+    }
+
+    @Override
+    public DatabaseQueue getQueue(String name) {
+
+        Clause queueNameClause = QueryBuilder.eq(COLUMN_QUEUE_NAME, name);
+
+        Statement query = QueryBuilder.select().all().from(TABLE_QUEUES)
+                .where(queueNameClause);
+
+        Row row = cassandraClient.getSession().execute(query).one();
+
+        if(row == null){
+            return null;
+        }
+
+        final String queueName = row.getString(COLUMN_QUEUE_NAME);
+        final String regions = row.getString(COLUMN_REGIONS);
+        final String defaultDestinations = row.getString(COLUMN_DEFAULT_DESTINATIONS);
+        final long defaultDelayMs = row.getLong(COLUMN_DEFAULT_DELAY_MS);
+        final int retryCount = row.getInt(COLUMN_RETRY_COUNT);
+        final int handlingTimeoutSec = row.getInt(COLUMN_HANDLING_TIMEOUT_SEC);
+        final String deadLetterQueue = row.getString(COLUMN_DEAD_LETTER_QUEUE);
+
+        return new DatabaseQueue( queueName, regions, defaultDestinations, defaultDelayMs, retryCount,
+                handlingTimeoutSec, deadLetterQueue);
+
+    }
+
+    @Override
+    public void deleteQueue(String name) {
+
+        Clause queueNameClause = QueryBuilder.eq(COLUMN_QUEUE_NAME, name);
+
+        Statement delete = QueryBuilder.delete().from(TABLE_QUEUES)
+                .where(queueNameClause);
+
+        cassandraClient.getSession().execute(delete);
+    }
+
+    @Override
+    public List<String> getListOfQueues() {
+
+        Statement select = QueryBuilder.select().all().from( TABLE_QUEUES );
+        ResultSet rs = cassandraClient.getSession().execute( select );
+
+        return rs.all().stream()
+                .map( row -> row.getString( COLUMN_QUEUE_NAME ))
+                .collect( Collectors.toList() );
+    }
+
+
+    @Override
+    public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
+        return Collections.EMPTY_LIST;
+    }
+
+    @Override
+    public Collection<TableDefinition> getTables() {
+        return Collections.singletonList( new TableDefinitionStringImpl( "queues", CQL ) );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/Shard.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/Shard.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/Shard.java
new file mode 100644
index 0000000..20c802d
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/Shard.java
@@ -0,0 +1,111 @@
+/*
+ * 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.qakka.serialization.sharding;
+
+
+import java.util.UUID;
+
+public class Shard {
+
+    public enum Type {
+
+        DEFAULT, INFLIGHT
+    }
+
+    private String queueName;
+    private String region;
+    private long shardId;
+    private Type type;
+    private UUID pointer;
+
+    public Shard(final String queueName, final String region, final Type type, final long shardId, UUID pointer){
+
+        this.queueName = queueName;
+        this.region = region;
+        this.type = type;
+        this.shardId = shardId;
+        this.pointer = pointer;
+
+    }
+
+    public String getQueueName() {
+        return queueName;
+    }
+
+    public String getRegion() {
+        return region;
+    }
+
+    public long getShardId() {
+        return shardId;
+    }
+
+    public Type getType() {
+        return type;
+    }
+
+    public UUID getPointer() {
+        return pointer;
+    }
+
+    public void setPointer(UUID pointer) {
+        this.pointer = pointer;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = queueName.hashCode();
+        result = ( 31 * result ) + region.hashCode();
+        result = ( 31 * result ) + (int)shardId;
+        result = ( 31 * result ) + type.hashCode();
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+
+        if( this == obj){
+            return true;
+        }
+
+        if( !(obj instanceof Shard)){
+            return false;
+        }
+
+        Shard that = (Shard) obj;
+
+        if( !this.queueName.equalsIgnoreCase(that.queueName)){
+            return false;
+        }
+        if( !this.region.equalsIgnoreCase(that.region)){
+            return false;
+        }
+        if( this.shardId != that.shardId){
+            return false;
+        }
+        if( !this.type.equals(that.type)){
+            return false;
+        }
+
+        return true;
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardCounterSerialization.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardCounterSerialization.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardCounterSerialization.java
new file mode 100644
index 0000000..c29c548
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardCounterSerialization.java
@@ -0,0 +1,29 @@
+/*
+ * 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.qakka.serialization.sharding;
+
+import org.apache.usergrid.persistence.core.migration.schema.Migration;
+
+
+public interface ShardCounterSerialization extends Migration {
+
+    void incrementCounter(String queueName, Shard.Type type, long shardId, long increment);
+
+    long getCounterValue(String name, Shard.Type type, long shardId);
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIterator.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIterator.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIterator.java
new file mode 100644
index 0000000..31e31ce
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardIterator.java
@@ -0,0 +1,142 @@
+/*
+ * 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.qakka.serialization.sharding;
+
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Statement;
+import com.datastax.driver.core.querybuilder.Clause;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import org.apache.usergrid.persistence.qakka.core.CassandraClient;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.impl.ShardSerializationImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+public class ShardIterator implements Iterator<Shard> {
+
+    private static final Logger logger = LoggerFactory.getLogger( ShardIterator.class );
+
+    private final CassandraClient cassandraClient;
+
+    private final int PAGE_SIZE = 100;
+    private final String queueName;
+    private final String region;
+    private final Shard.Type shardType;
+    private final Optional<Long> shardId;
+
+    private Iterator<Shard> currentIterator;
+
+    private long nextStart = 0L;
+
+
+    public ShardIterator(
+            final CassandraClient cassandraClient,
+            final String queueName,
+            final String region,
+            final Shard.Type shardtype,
+            final Optional<Long> lastShardId){
+
+        this.queueName = queueName;
+        this.region = region;
+        this.shardType = shardtype;
+        this.shardId = lastShardId.isPresent() ? lastShardId : Optional.of(0L);
+        this.cassandraClient = cassandraClient;
+    }
+
+    @Override
+    public boolean hasNext() {
+
+        if(currentIterator == null || !currentIterator.hasNext()){
+            advance();
+        }
+
+        return currentIterator.hasNext();
+
+    }
+
+    @Override
+    public Shard next() {
+
+        if ( !hasNext() ) {
+            throw new NoSuchElementException( "No next shard exists" );
+        }
+
+        return currentIterator.next();
+
+    }
+
+    private void advance(){
+
+
+        Clause queueNameClause = QueryBuilder.eq( ShardSerializationImpl.COLUMN_QUEUE_NAME, queueName);
+        Clause regionClause = QueryBuilder.eq( ShardSerializationImpl.COLUMN_REGION, region);
+        Clause activeClause = QueryBuilder.eq( ShardSerializationImpl.COLUMN_ACTIVE, 1);
+        Clause shardIdClause;
+        if(nextStart == 0L && shardId.isPresent()){
+            shardIdClause = QueryBuilder.gt( ShardSerializationImpl.COLUMN_SHARD_ID, shardId.get());
+        }else if( nextStart == 0L && !shardId.isPresent()){
+            shardIdClause = QueryBuilder.gte( ShardSerializationImpl.COLUMN_SHARD_ID, 0L);
+
+        }else{
+            shardIdClause = QueryBuilder.gt( ShardSerializationImpl.COLUMN_SHARD_ID, nextStart);
+        }
+
+
+
+        Statement query = QueryBuilder.select().all().from(ShardSerializationImpl.getTableName(shardType))
+                .where(queueNameClause)
+                .and(regionClause)
+                .and(activeClause)
+                .and(shardIdClause)
+                .limit(PAGE_SIZE);
+
+        List<Row> rows = cassandraClient.getSession().execute(query).all();
+
+
+        currentIterator = getIteratorFromRows(rows);
+
+
+    }
+
+
+    private Iterator<Shard> getIteratorFromRows( List<Row> rows){
+
+        List<Shard> shards = new ArrayList<>(rows.size());
+
+        rows.forEach(row -> {
+
+            final String queueName = row.getString( ShardSerializationImpl.COLUMN_QUEUE_NAME);
+            final String region = row.getString( ShardSerializationImpl.COLUMN_REGION);
+            final long shardId = row.getLong( ShardSerializationImpl.COLUMN_SHARD_ID);
+            final UUID pointer = row.getUUID( ShardSerializationImpl.COLUMN_POINTER);
+
+            shards.add(new Shard(queueName, region, shardType, shardId, pointer));
+
+            nextStart = shardId;
+
+        });
+
+        return shards.iterator();
+
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardSerialization.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardSerialization.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardSerialization.java
new file mode 100644
index 0000000..c0173ab
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardSerialization.java
@@ -0,0 +1,35 @@
+/*
+ * 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.qakka.serialization.sharding;
+
+import org.apache.usergrid.persistence.core.migration.schema.Migration;
+
+
+public interface ShardSerialization extends Migration {
+
+    void createShard(final Shard shard);
+
+    Shard loadShard(final Shard shard);
+
+    void deleteShard(final Shard shard);
+
+    void updateShardPointer(final Shard shard);
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardStrategy.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardStrategy.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardStrategy.java
new file mode 100644
index 0000000..013f0b6
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/ShardStrategy.java
@@ -0,0 +1,35 @@
+/*
+ * 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.qakka.serialization.sharding;
+
+import java.util.UUID;
+
+
+public interface ShardStrategy {
+
+    /**
+     * Select shard that should be used for the specified Queue Message.
+     * @param queueName Name of queue
+     * @param region    Region
+     * @param type      Indicates whether message is inflight or available
+     * @param pointer   Queue Message ID (must be Time-based)
+     */
+    Shard selectShard(String queueName, String region, Shard.Type type, UUID pointer);
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3075dce1/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/PlaceholderShardStrategy.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/PlaceholderShardStrategy.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/PlaceholderShardStrategy.java
new file mode 100644
index 0000000..3ca79e6
--- /dev/null
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/serialization/sharding/impl/PlaceholderShardStrategy.java
@@ -0,0 +1,44 @@
+/*
+ * 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.qakka.serialization.sharding.impl;
+
+
+import org.apache.usergrid.persistence.qakka.serialization.sharding.Shard;
+import org.apache.usergrid.persistence.qakka.serialization.sharding.ShardStrategy;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+
+// TODO: delete me!
+
+public class PlaceholderShardStrategy implements ShardStrategy {
+
+    private Map<String, Shard> shardMap = new HashMap<>();
+
+
+    @Override
+    public Shard selectShard(String queueName, String region, Shard.Type type, UUID pointer) {
+        String key = queueName + region + type;
+        shardMap.putIfAbsent( key, new Shard( queueName, region, type, 0L, pointer ) );
+        return shardMap.get( key );
+    }
+}


[22/25] usergrid git commit: Move router producer registration to CpEntityManagerFactory

Posted by sn...@apache.org.
Move router producer registration to CpEntityManagerFactory


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

Branch: refs/heads/usergrid-1318-queue
Commit: 79c5499799007e24ea1784f6fd8b21f2225c668b
Parents: 99dbfc2
Author: Dave Johnson <sn...@apache.org>
Authored: Fri Sep 16 14:52:32 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Fri Sep 16 14:52:32 2016 -0400

----------------------------------------------------------------------
 .../corepersistence/CpEntityManagerFactory.java | 32 ++++++++++++--------
 .../impl/DistributedQueueServiceImpl.java       |  9 +-----
 2 files changed, 20 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/79c54997/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
index 2a88302..5d8c417 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
@@ -60,6 +60,9 @@ import org.apache.usergrid.persistence.index.EntityIndex;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.entity.SimpleId;
 import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+import org.apache.usergrid.persistence.qakka.distributed.impl.QueueActorRouterProducer;
+import org.apache.usergrid.persistence.qakka.distributed.impl.QueueSenderRouterProducer;
+import org.apache.usergrid.persistence.qakka.distributed.impl.QueueWriterRouterProducer;
 import org.apache.usergrid.utils.UUIDUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -113,7 +116,6 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
     private final GraphManagerFactory graphManagerFactory;
     private final CollectionSettingsFactory collectionSettingsFactory;
     private ActorSystemManager actorSystemManager;
-    private UniqueValuesService uniqueValuesService;
     private final LockManager lockManager;
 
     private final QueueManagerFactory queueManagerFactory;
@@ -128,16 +130,17 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
         this.cassandraService = cassandraService;
         this.counterUtils = counterUtils;
         this.injector = injector;
-        this.reIndexService = injector.getInstance(ReIndexService.class);
-        this.entityManagerFig = injector.getInstance(EntityManagerFig.class);
-        this.actorSystemFig = injector.getInstance( ActorSystemFig.class );
-        this.managerCache = injector.getInstance( ManagerCache.class );
-        this.metricsFactory = injector.getInstance( MetricsFactory.class );
-        this.indexService = injector.getInstance( AsyncEventService.class );
-        this.graphManagerFactory = injector.getInstance( GraphManagerFactory.class );
-        this.collectionService = injector.getInstance( CollectionService.class );
-        this.connectionService = injector.getInstance( ConnectionService.class );
-        this.collectionSettingsFactory = injector.getInstance( CollectionSettingsFactory.class );
+
+        this.reIndexService             = injector.getInstance(ReIndexService.class);
+        this.entityManagerFig           = injector.getInstance(EntityManagerFig.class);
+        this.actorSystemFig             = injector.getInstance( ActorSystemFig.class );
+        this.managerCache               = injector.getInstance( ManagerCache.class );
+        this.metricsFactory             = injector.getInstance( MetricsFactory.class );
+        this.indexService               = injector.getInstance( AsyncEventService.class );
+        this.graphManagerFactory        = injector.getInstance( GraphManagerFactory.class );
+        this.collectionService          = injector.getInstance( CollectionService.class );
+        this.connectionService          = injector.getInstance( ConnectionService.class );
+        this.collectionSettingsFactory  = injector.getInstance( CollectionSettingsFactory.class );
 
         Properties properties = cassandraService.getProperties();
         this.entityManagers = createEntityManagerCache( properties );
@@ -148,10 +151,13 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
             try {
                 logger.info("Akka cluster starting...");
 
-                this.uniqueValuesService = injector.getInstance( UniqueValuesService.class );
                 this.actorSystemManager = injector.getInstance( ActorSystemManager.class );
 
-                actorSystemManager.registerRouterProducer( uniqueValuesService );
+                actorSystemManager.registerRouterProducer( injector.getInstance( UniqueValuesService.class ) );
+                actorSystemManager.registerRouterProducer( injector.getInstance( QueueActorRouterProducer.class ) );
+                actorSystemManager.registerRouterProducer( injector.getInstance( QueueWriterRouterProducer.class ) );
+                actorSystemManager.registerRouterProducer( injector.getInstance( QueueSenderRouterProducer.class ) );
+
                 actorSystemManager.start();
                 actorSystemManager.waitForClientActor();
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/79c54997/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
index 0b9cf59..1243c23 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/qakka/distributed/impl/DistributedQueueServiceImpl.java
@@ -56,18 +56,11 @@ public class DistributedQueueServiceImpl implements DistributedQueueService {
     public DistributedQueueServiceImpl(
             ActorSystemManager actorSystemManager,
             QueueManager queueManager,
-            QakkaFig qakkaFig,
-            QueueActorRouterProducer  queueActorRouterProducer,
-            QueueWriterRouterProducer queueWriterRouterProducer,
-            QueueSenderRouterProducer queueSenderRouterProducer ) {
+            QakkaFig qakkaFig ) {
 
         this.actorSystemManager = actorSystemManager;
         this.queueManager = queueManager;
         this.qakkaFig = qakkaFig;
-
-        actorSystemManager.registerRouterProducer( queueActorRouterProducer );
-        actorSystemManager.registerRouterProducer( queueWriterRouterProducer );
-        actorSystemManager.registerRouterProducer( queueSenderRouterProducer );
     }
 
 


[05/25] usergrid git commit: Move under org.apache.usergrid.persistence package in preparation for integration into Usergrid.

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/QueueManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/QueueManagerTest.java b/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/QueueManagerTest.java
deleted file mode 100644
index d57beab..0000000
--- a/stack/corepersistence/queue/src/test/java/org/apache/usergrid/persistence/queue/QueueManagerTest.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * 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.queue;
-
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import org.apache.usergrid.persistence.core.aws.NoAWSCredsRule;
-import org.apache.usergrid.persistence.core.test.ITRunner;
-import org.apache.usergrid.persistence.core.test.UseModules;
-import org.apache.usergrid.persistence.queue.guice.TestQueueModule;
-import org.apache.usergrid.persistence.queue.impl.QueueScopeImpl;
-
-import com.google.inject.Inject;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
-
-
-@RunWith( ITRunner.class )
-@UseModules( { TestQueueModule.class } )
-public class QueueManagerTest {
-
-    @Inject
-    protected QueueFig queueFig;
-    @Inject
-    protected QueueManagerFactory qmf;
-
-    /**
-     * Mark tests as ignored if no AWS creds are present
-     */
-    @Rule
-    public NoAWSCredsRule awsCredsRule = new NoAWSCredsRule();
-
-
-    protected QueueScope scope;
-    private QueueManager qm;
-
-    public static long queueSeed = System.currentTimeMillis();
-
-
-    @Before
-    public void mockApp() {
-
-        this.scope = new QueueScopeImpl( "testQueue"+queueSeed++, QueueScope.RegionImplementation.LOCAL);
-        qm = qmf.getQueueManager(scope);
-    }
-
-    @org.junit.After
-    public void cleanup(){
-        qm.deleteQueue();
-    }
-
-
-    @Test
-    public void send() throws Exception{
-        String value = "bodytest";
-        qm.sendMessage(value);
-        List<QueueMessage> messageList = qm.getMessages(1, String.class);
-        assertTrue(messageList.size() >= 1);
-        for(QueueMessage message : messageList){
-            assertTrue(message.getBody().equals(value));
-            qm.commitMessage(message);
-        }
-
-        messageList = qm.getMessages(1, String.class);
-        assertTrue(messageList.size() <= 0);
-
-    }
-
-    @Test
-    public void sendMore() throws Exception{
-        HashMap<String,String> values = new HashMap<>();
-        values.put("test","Test");
-
-        List<Map<String,String>> bodies = new ArrayList<>();
-        bodies.add(values);
-        qm.sendMessages(bodies);
-        List<QueueMessage> messageList = qm.getMessages(1, values.getClass());
-        assertTrue(messageList.size() >= 1);
-        for(QueueMessage message : messageList){
-            assertTrue(message.getBody().equals(values));
-        }
-        qm.commitMessages(messageList);
-
-        messageList = qm.getMessages(1, values.getClass());
-        assertTrue(messageList.size() <= 0);
-
-    }
-
-    @Test
-    public void queueSize() throws Exception{
-        HashMap<String,String> values = new HashMap<>();
-        values.put("test", "Test");
-
-        List<Map<String,String>> bodies = new ArrayList<>();
-        bodies.add(values);
-        long initialDepth = qm.getQueueDepth();
-        qm.sendMessages(bodies);
-        long depth = 0;
-        for(int i=0; i<10;i++){
-             depth = qm.getQueueDepth();
-            if(depth>0){
-                break;
-            }
-            Thread.sleep(1000);
-        }
-        assertTrue(depth>0);
-
-        List<QueueMessage> messageList = qm.getMessages(10, values.getClass());
-        assertTrue(messageList.size() <= 500);
-        for(QueueMessage message : messageList){
-            assertTrue(message.getBody().equals(values));
-        }
-        if(messageList.size()>0) {
-            qm.commitMessages(messageList);
-        }
-        for(int i=0; i<10;i++){
-            depth = qm.getQueueDepth();
-            if(depth==initialDepth){
-                break;
-            }
-            Thread.sleep(1000);
-        }
-        assertEquals(initialDepth, depth);
-    }
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java
index 3f0ca69..adad92a 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java
@@ -22,7 +22,7 @@ package org.apache.usergrid.services.notifications;
 
 import org.apache.usergrid.batch.JobExecution;
 import org.apache.usergrid.persistence.entities.Notification;
-import org.apache.usergrid.persistence.queue.QueueMessage;
+import org.apache.usergrid.persistence.queue.LegacyQueueMessage;
 import rx.Observable;
 
 import java.util.List;
@@ -54,7 +54,7 @@ public interface ApplicationQueueManager {
      * @param queuePath
      * @return
      */
-    Observable sendBatchToProviders(List<QueueMessage> messages, String queuePath);
+    Observable sendBatchToProviders(List<LegacyQueueMessage> messages, String queuePath);
 
     /**
      * stop processing and send message to providers to stop

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManagerCache.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManagerCache.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManagerCache.java
index 2ef567d..3b2eff3 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManagerCache.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManagerCache.java
@@ -20,7 +20,7 @@ import com.google.common.cache.*;
 import com.google.inject.Singleton;
 import org.apache.usergrid.persistence.EntityManager;
 import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
-import org.apache.usergrid.persistence.queue.QueueManager;
+import org.apache.usergrid.persistence.queue.LegacyQueueManager;
 import org.apache.usergrid.services.notifications.impl.ApplicationQueueManagerImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -103,7 +103,7 @@ public class ApplicationQueueManagerCache{
 
 
     public ApplicationQueueManager getApplicationQueueManager( final EntityManager entityManager,
-                                                               final QueueManager queueManager,
+                                                               final LegacyQueueManager legacyQueueManager,
                                                                final JobScheduler jobScheduler,
                                                                final MetricsFactory metricsService,
                                                                final Properties properties ) {
@@ -124,7 +124,7 @@ public class ApplicationQueueManagerCache{
             manager = new ApplicationQueueManagerImpl(
                 jobScheduler,
                 entityManager,
-                queueManager,
+                legacyQueueManager,
                 metricsService,
                 properties
             );

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/services/src/main/java/org/apache/usergrid/services/notifications/NotificationsService.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/NotificationsService.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/NotificationsService.java
index 907638e..b43594a 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/NotificationsService.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/NotificationsService.java
@@ -19,7 +19,6 @@ package org.apache.usergrid.services.notifications;
 
 import java.util.*;
 
-import org.apache.usergrid.persistence.collection.EntityCollectionManagerFactory;
 import org.apache.usergrid.services.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,10 +35,10 @@ import org.apache.usergrid.persistence.entities.Receipt;
 import org.apache.usergrid.persistence.exceptions.RequiredPropertyNotFoundException;
 import org.apache.usergrid.persistence.index.query.Identifier;
 import org.apache.usergrid.persistence.Query;
-import org.apache.usergrid.persistence.queue.QueueManager;
-import org.apache.usergrid.persistence.queue.QueueManagerFactory;
-import org.apache.usergrid.persistence.queue.QueueScope;
-import org.apache.usergrid.persistence.queue.impl.QueueScopeImpl;
+import org.apache.usergrid.persistence.queue.LegacyQueueManager;
+import org.apache.usergrid.persistence.queue.LegacyQueueManagerFactory;
+import org.apache.usergrid.persistence.queue.LegacyQueueScope;
+import org.apache.usergrid.persistence.queue.impl.LegacyQueueScopeImpl;
 import org.apache.usergrid.services.exceptions.ForbiddenServiceOperationException;
 import org.apache.usergrid.services.notifications.impl.ApplicationQueueManagerImpl;
 
@@ -76,7 +75,7 @@ public class NotificationsService extends AbstractCollectionService {
     private long gracePeriod;
     private ServiceManagerFactory smf;
     private EntityManagerFactory emf;
-    private QueueManagerFactory queueManagerFactory;
+    private LegacyQueueManagerFactory queueManagerFactory;
     private ApplicationQueueManagerCache applicationQueueManagerCache;
 
     public NotificationsService() {
@@ -97,12 +96,12 @@ public class NotificationsService extends AbstractCollectionService {
         postTimer = metricsService.getTimer(this.getClass(), "collection.post_requests");
         JobScheduler jobScheduler = new JobScheduler(sm,em);
         String name = ApplicationQueueManagerImpl.getQueueNames( props );
-        QueueScope queueScope = new QueueScopeImpl( name, QueueScope.RegionImplementation.LOCAL);
-        queueManagerFactory = getApplicationContext().getBean( Injector.class ).getInstance(QueueManagerFactory.class);
-        QueueManager queueManager = queueManagerFactory.getQueueManager(queueScope);
+        LegacyQueueScope queueScope = new LegacyQueueScopeImpl( name, LegacyQueueScope.RegionImplementation.LOCAL);
+        queueManagerFactory = getApplicationContext().getBean( Injector.class ).getInstance(LegacyQueueManagerFactory.class);
+        LegacyQueueManager legacyQueueManager = queueManagerFactory.getQueueManager(queueScope);
         applicationQueueManagerCache = getApplicationContext().getBean(Injector.class).getInstance(ApplicationQueueManagerCache.class);
         notificationQueueManager = applicationQueueManagerCache
-            .getApplicationQueueManager(em,queueManager, jobScheduler, metricsService ,props);
+            .getApplicationQueueManager(em, legacyQueueManager, jobScheduler, metricsService ,props);
 
         gracePeriod = JobScheduler.SCHEDULER_GRACE_PERIOD;
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueJob.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueJob.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueJob.java
index 245a36f..0ba5c1e 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueJob.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueJob.java
@@ -24,7 +24,6 @@ import javax.annotation.PostConstruct;
 import com.google.inject.Injector;
 import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
 import org.apache.usergrid.persistence.entities.Notification;
-import org.apache.usergrid.persistence.queue.QueueManagerFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueListener.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueListener.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueListener.java
index 478d5ed..20fbd84 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueListener.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueListener.java
@@ -18,17 +18,14 @@ package org.apache.usergrid.services.notifications;
 
 import com.codahale.metrics.*;
 import com.codahale.metrics.Timer;
-import com.google.common.cache.*;
 import com.google.inject.Injector;
 
-import org.apache.usergrid.persistence.EntityManager;
 import org.apache.usergrid.persistence.EntityManagerFactory;
 
 import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
 import org.apache.usergrid.persistence.queue.*;
-import org.apache.usergrid.persistence.queue.QueueManager;
-import org.apache.usergrid.persistence.queue.impl.QueueScopeImpl;
-import org.apache.usergrid.services.ServiceManager;
+import org.apache.usergrid.persistence.queue.LegacyQueueManager;
+import org.apache.usergrid.persistence.queue.impl.LegacyQueueScopeImpl;
 import org.apache.usergrid.services.ServiceManagerFactory;
 import org.apache.usergrid.services.notifications.impl.ApplicationQueueManagerImpl;
 import org.slf4j.Logger;
@@ -46,7 +43,7 @@ import java.util.concurrent.atomic.AtomicLong;
  */
 public class QueueListener  {
 
-    private final QueueManagerFactory queueManagerFactory;
+    private final LegacyQueueManagerFactory queueManagerFactory;
 
     public static long DEFAULT_SLEEP = 100;
 
@@ -75,7 +72,7 @@ public class QueueListener  {
     private int consecutiveCallsToRemoveDevices;
 
     public QueueListener(ServiceManagerFactory smf, EntityManagerFactory emf, Properties props){
-        this.queueManagerFactory = smf.getApplicationContext().getBean( Injector.class ).getInstance(QueueManagerFactory.class);
+        this.queueManagerFactory = smf.getApplicationContext().getBean( Injector.class ).getInstance(LegacyQueueManagerFactory.class);
         this.smf = smf;
         this.emf = emf;
         this.metricsService = smf.getApplicationContext().getBean( Injector.class ).getInstance(MetricsFactory.class);
@@ -161,8 +158,8 @@ public class QueueListener  {
             logger.trace("getting from queue {} ", queueName);
         }
 
-        QueueScope queueScope = new QueueScopeImpl( queueName, QueueScope.RegionImplementation.LOCAL);
-        QueueManager queueManager = queueManagerFactory.getQueueManager(queueScope);
+        LegacyQueueScope queueScope = new LegacyQueueScopeImpl( queueName, LegacyQueueScope.RegionImplementation.LOCAL);
+        LegacyQueueManager legacyQueueManager = queueManagerFactory.getQueueManager(queueScope);
 
         // run until there are no more active jobs
         final AtomicLong runCount = new AtomicLong(0);
@@ -170,7 +167,7 @@ public class QueueListener  {
         while ( true ) {
 
                 Timer.Context timerContext = timer.time();
-                rx.Observable.from(queueManager.getMessages(MAX_TAKE, ApplicationQueueMessage.class))
+                rx.Observable.from( legacyQueueManager.getMessages(MAX_TAKE, ApplicationQueueMessage.class))
                     .buffer(MAX_TAKE)
                     .doOnNext(messages -> {
 
@@ -180,10 +177,10 @@ public class QueueListener  {
                             }
 
                             if (messages.size() > 0) {
-                                HashMap<UUID, List<QueueMessage>> messageMap = new HashMap<>(messages.size());
+                                HashMap<UUID, List<LegacyQueueMessage>> messageMap = new HashMap<>(messages.size());
 
                                 //group messages into hash map by app id
-                                for (QueueMessage message : messages) {
+                                for (LegacyQueueMessage message : messages) {
                                     //TODO: stop copying around this area as it gets notification specific.
                                     ApplicationQueueMessage queueMessage = (ApplicationQueueMessage) message.getBody();
                                     UUID applicationId = queueMessage.getApplicationId();
@@ -191,7 +188,7 @@ public class QueueListener  {
                                     //Groups queue messages by application Id, ( they are all probably going to the same place )
                                     if (!messageMap.containsKey(applicationId)) {
                                         //For each app id it sends the set.
-                                        List<QueueMessage> applicationQueueMessages = new ArrayList<QueueMessage>();
+                                        List<LegacyQueueMessage> applicationQueueMessages = new ArrayList<LegacyQueueMessage>();
                                         applicationQueueMessages.add(message);
                                         messageMap.put(applicationId, applicationQueueMessages);
                                     } else {
@@ -203,13 +200,13 @@ public class QueueListener  {
                                 Observable merge = null;
 
                                 //send each set of app ids together
-                                for (Map.Entry<UUID, List<QueueMessage>> entry : messageMap.entrySet()) {
+                                for (Map.Entry<UUID, List<LegacyQueueMessage>> entry : messageMap.entrySet()) {
                                     UUID applicationId = entry.getKey();
 
                                     ApplicationQueueManager manager = applicationQueueManagerCache
                                         .getApplicationQueueManager(
                                             emf.getEntityManager(applicationId),
-                                            queueManager,
+                                            legacyQueueManager,
                                             new JobScheduler(smf.getServiceManager(applicationId), emf.getEntityManager(applicationId)),
                                             metricsService,
                                             properties
@@ -230,7 +227,7 @@ public class QueueListener  {
                                 if(merge!=null) {
                                     merge.toBlocking().lastOrDefault(null);
                                 }
-                                queueManager.commitMessages(messages);
+                                legacyQueueManager.commitMessages(messages);
 
                                 meter.mark(messages.size());
                                 if (logger.isTraceEnabled()) {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/services/src/main/java/org/apache/usergrid/services/notifications/impl/ApplicationQueueManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/impl/ApplicationQueueManagerImpl.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/impl/ApplicationQueueManagerImpl.java
index 23b21f2..96e2dbd 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/impl/ApplicationQueueManagerImpl.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/impl/ApplicationQueueManagerImpl.java
@@ -47,8 +47,8 @@ import org.apache.usergrid.persistence.entities.Notifier;
 import org.apache.usergrid.persistence.entities.Receipt;
 import org.apache.usergrid.persistence.entities.User;
 import org.apache.usergrid.persistence.index.utils.UUIDUtils;
-import org.apache.usergrid.persistence.queue.QueueManager;
-import org.apache.usergrid.persistence.queue.QueueMessage;
+import org.apache.usergrid.persistence.queue.LegacyQueueManager;
+import org.apache.usergrid.persistence.queue.LegacyQueueMessage;
 import org.apache.usergrid.services.notifications.ApplicationQueueManager;
 import org.apache.usergrid.services.notifications.ApplicationQueueMessage;
 import org.apache.usergrid.services.notifications.JobScheduler;
@@ -72,7 +72,7 @@ public class ApplicationQueueManagerImpl implements ApplicationQueueManager {
     private static final Logger logger = LoggerFactory.getLogger(ApplicationQueueManagerImpl.class);
 
     private final EntityManager em;
-    private final QueueManager qm;
+    private final LegacyQueueManager qm;
     private final JobScheduler jobScheduler;
     private final MetricsFactory metricsFactory;
     private final String queueName;
@@ -93,11 +93,11 @@ public class ApplicationQueueManagerImpl implements ApplicationQueueManager {
 
 
 
-    public ApplicationQueueManagerImpl( JobScheduler jobScheduler, EntityManager entityManager,
-                                        QueueManager queueManager, MetricsFactory metricsFactory,
-                                        Properties properties) {
+    public ApplicationQueueManagerImpl(JobScheduler jobScheduler, EntityManager entityManager,
+                                       LegacyQueueManager legacyQueueManager, MetricsFactory metricsFactory,
+                                       Properties properties) {
         this.em = entityManager;
-        this.qm = queueManager;
+        this.qm = legacyQueueManager;
         this.jobScheduler = jobScheduler;
         this.metricsFactory = metricsFactory;
         this.queueName = getQueueNames(properties);
@@ -473,7 +473,7 @@ public class ApplicationQueueManagerImpl implements ApplicationQueueManager {
      * @throws Exception
      */
     @Override
-    public Observable sendBatchToProviders(final List<QueueMessage> messages, final String queuePath) {
+    public Observable sendBatchToProviders(final List<LegacyQueueMessage> messages, final String queuePath) {
         if (logger.isTraceEnabled()) {
             logger.trace("sending batch of {} notifications.", messages.size());
         }
@@ -483,7 +483,7 @@ public class ApplicationQueueManagerImpl implements ApplicationQueueManager {
         final ConcurrentHashMap<UUID, TaskManager> taskMap = new ConcurrentHashMap<UUID, TaskManager>(messages.size());
         final ConcurrentHashMap<UUID, Notification> notificationMap = new ConcurrentHashMap<UUID, Notification>(messages.size());
 
-        final Func1<QueueMessage, ApplicationQueueMessage> func = queueMessage -> {
+        final Func1<LegacyQueueMessage, ApplicationQueueMessage> func = queueMessage -> {
             boolean messageCommitted = false;
             ApplicationQueueMessage message = null;
             try {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/services/src/main/java/org/apache/usergrid/services/queues/ImportQueueListener.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/queues/ImportQueueListener.java b/stack/services/src/main/java/org/apache/usergrid/services/queues/ImportQueueListener.java
index a95475d..e2a2808 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/queues/ImportQueueListener.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/queues/ImportQueueListener.java
@@ -20,16 +20,14 @@ package org.apache.usergrid.services.queues;
 import java.util.List;
 import java.util.Properties;
 
-import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import org.apache.usergrid.management.importer.ImportService;
-import org.apache.usergrid.management.importer.ImportServiceImpl;
 
 import org.apache.usergrid.persistence.EntityManagerFactory;
-import org.apache.usergrid.persistence.queue.QueueMessage;
+import org.apache.usergrid.persistence.queue.LegacyQueueMessage;
 import org.apache.usergrid.services.ServiceManagerFactory;
 
 import com.google.inject.Inject;
@@ -65,7 +63,7 @@ public class ImportQueueListener extends QueueListener {
      * @param messages
      */
     @Override
-    public void onMessage( final List<QueueMessage> messages ) throws Exception {
+    public void onMessage( final List<LegacyQueueMessage> messages ) throws Exception {
         /**
          * Much like in the original queueListener , we need to translate the Messages that we get
          * back from the QueueMessage into something like an Import message. The way that a
@@ -76,7 +74,7 @@ public class ImportQueueListener extends QueueListener {
         if (logger.isTraceEnabled()) {
             logger.trace("Doing work in onMessage in ImportQueueListener");
         }
-        for (QueueMessage message : messages) {
+        for (LegacyQueueMessage message : messages) {
             ImportQueueMessage queueMessage = ( ImportQueueMessage ) message.getBody();
 
 //        TODO   We still need to hide this queue behind the scheduler importService.downloadAndImportFile( queueMessage );

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/services/src/main/java/org/apache/usergrid/services/queues/ImportQueueManager.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/queues/ImportQueueManager.java b/stack/services/src/main/java/org/apache/usergrid/services/queues/ImportQueueManager.java
index f3c65c7..d9db84a 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/queues/ImportQueueManager.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/queues/ImportQueueManager.java
@@ -26,17 +26,17 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.usergrid.persistence.queue.QueueManager;
-import org.apache.usergrid.persistence.queue.QueueMessage;
+import org.apache.usergrid.persistence.queue.LegacyQueueManager;
+import org.apache.usergrid.persistence.queue.LegacyQueueMessage;
 
 
 /**
  * Manages the queueManager implementation for Import
  */
-public class ImportQueueManager implements QueueManager {
+public class ImportQueueManager implements LegacyQueueManager {
 
     @Override
-    public List<QueueMessage> getMessages(final int limit, final Class klass) {
+    public List<LegacyQueueMessage> getMessages(final int limit, final Class klass) {
         return new ArrayList<>();
     }
 
@@ -47,13 +47,13 @@ public class ImportQueueManager implements QueueManager {
 
 
     @Override
-    public void commitMessage( final QueueMessage queueMessage ) {
+    public void commitMessage( final LegacyQueueMessage queueMessage ) {
 
     }
 
 
     @Override
-    public void commitMessages( final List<QueueMessage> queueMessages ) {
+    public void commitMessages( final List<LegacyQueueMessage> queueMessages ) {
 
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/9016fd29/stack/services/src/main/java/org/apache/usergrid/services/queues/QueueListener.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/queues/QueueListener.java b/stack/services/src/main/java/org/apache/usergrid/services/queues/QueueListener.java
index 9d95d87..965e95e 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/queues/QueueListener.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/queues/QueueListener.java
@@ -24,8 +24,8 @@ import org.apache.usergrid.persistence.EntityManagerFactory;
 
 import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
 import org.apache.usergrid.persistence.queue.*;
-import org.apache.usergrid.persistence.queue.QueueManager;
-import org.apache.usergrid.persistence.queue.impl.QueueScopeImpl;
+import org.apache.usergrid.persistence.queue.LegacyQueueManager;
+import org.apache.usergrid.persistence.queue.impl.LegacyQueueScopeImpl;
 import org.apache.usergrid.services.ServiceManager;
 import org.apache.usergrid.services.ServiceManagerFactory;
 import org.slf4j.Logger;
@@ -43,7 +43,7 @@ import java.util.concurrent.atomic.AtomicInteger;
  */
 public abstract class QueueListener  {
     public  final int MESSAGE_TRANSACTION_TIMEOUT =  25 * 1000;
-    private final QueueManagerFactory queueManagerFactory;
+    private final LegacyQueueManagerFactory queueManagerFactory;
 
     public  long DEFAULT_SLEEP = 5000;
 
@@ -83,7 +83,7 @@ public abstract class QueueListener  {
      */
     public QueueListener(ServiceManagerFactory smf, EntityManagerFactory emf, Injector injector, Properties props){
         //TODO: change current injectors to use service module instead of CpSetup
-        this.queueManagerFactory = injector.getInstance( QueueManagerFactory.class );
+        this.queueManagerFactory = injector.getInstance( LegacyQueueManagerFactory.class );
         this.smf = smf;
         this.emf = injector.getInstance( EntityManagerFactory.class ); //emf;
         this.metricsService = injector.getInstance(MetricsFactory.class);
@@ -169,8 +169,8 @@ public abstract class QueueListener  {
         if (logger.isTraceEnabled()) {
             logger.trace("getting from queue {} ", queueName);
         }
-        QueueScope queueScope = new QueueScopeImpl( queueName, QueueScope.RegionImplementation.LOCAL);
-        QueueManager queueManager = queueManagerFactory.getQueueManager(queueScope);
+        LegacyQueueScope queueScope = new LegacyQueueScopeImpl( queueName, LegacyQueueScope.RegionImplementation.LOCAL);
+        LegacyQueueManager legacyQueueManager = queueManagerFactory.getQueueManager(queueScope);
         // run until there are no more active jobs
         long runCount = 0;
 
@@ -181,7 +181,7 @@ public abstract class QueueListener  {
                 Timer.Context timerContext = timer.time();
                 //Get the messages out of the queue.
                 //TODO: a model class to get generic queueMessages out of the queueManager. Ask Shawn what should go here.
-                rx.Observable.from( queueManager.getMessages(getBatchSize(), ImportQueueMessage.class))
+                rx.Observable.from( legacyQueueManager.getMessages(getBatchSize(), ImportQueueMessage.class))
                     .buffer(getBatchSize())
                     .doOnNext(messages -> {
                         try {
@@ -197,7 +197,7 @@ public abstract class QueueListener  {
                                 // asking for a onMessage call.
                                 onMessage(messages);
 
-                                queueManager.commitMessages(messages);
+                                legacyQueueManager.commitMessages(messages);
 
                                 meter.mark(messages.size());
                                 if (logger.isTraceEnabled()) {
@@ -267,7 +267,7 @@ public abstract class QueueListener  {
      * This will be the method that does the job dependant execution.
      * @param messages
      */
-    public abstract void onMessage(List<QueueMessage> messages) throws Exception;
+    public abstract void onMessage(List<LegacyQueueMessage> messages) throws Exception;
 
     public abstract String getQueueName();