You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by to...@apache.org on 2014/08/29 19:34:04 UTC

[06/20] git commit: Implemented New rolling shard algorithm. This should allow eventual shard consistency between all clients without the need for an external locking allocation system

Implemented New rolling shard algorithm.  This should allow eventual shard consistency between all clients without the need for an external locking allocation system

Cleanup of code


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

Branch: refs/heads/two-dot-o
Commit: 72684dfca1f39caef01c3c184a07e6e0842b7874
Parents: 71cb9c2
Author: Todd Nine <tn...@apigee.com>
Authored: Wed Jul 2 09:35:36 2014 -0600
Committer: Todd Nine <to...@apache.org>
Committed: Thu Aug 14 11:58:25 2014 -0600

----------------------------------------------------------------------
 .../UniqueValueSerializationStrategyImpl.java   |   2 +-
 .../persistence/core/astyanax/ColumnTypes.java  |   3 +
 .../astyanax/MultiKeyColumnNameIterator.java    | 217 +++++
 .../core/astyanax/MultiTennantColumnFamily.java |  13 +-
 .../persistence/core/rx/OrderedMerge.java       |   3 +
 .../core/scope/ApplicationScopeImpl.java        |   3 +-
 .../apache/usergrid/persistence/graph/Edge.java |   1 -
 .../usergrid/persistence/graph/GraphFig.java    |  30 +-
 .../persistence/graph/SearchByEdge.java         |   2 -
 .../persistence/graph/SearchByEdgeType.java     |   2 -
 .../persistence/graph/guice/GraphModule.java    |  37 +-
 .../graph/impl/GraphManagerImpl.java            |   6 +-
 .../persistence/graph/impl/SimpleEdge.java      |   7 +-
 .../graph/impl/SimpleMarkedEdge.java            |   2 -
 .../graph/impl/SimpleSearchByEdge.java          |   6 +-
 .../graph/impl/SimpleSearchByEdgeType.java      |   6 +-
 .../graph/impl/SimpleSearchByIdType.java        |   2 -
 .../impl/stage/EdgeDeleteListenerImpl.java      |   3 -
 .../graph/impl/stage/EdgeMetaRepair.java        |   2 -
 .../graph/impl/stage/EdgeMetaRepairImpl.java    |   4 +-
 .../EdgeMetadataSerialization.java              |   3 +-
 .../graph/serialization/EdgeSerialization.java  |   3 +-
 .../graph/serialization/NodeSerialization.java  |   3 +-
 .../impl/EdgeMetadataSerializationImpl.java     |   8 +-
 .../impl/EdgeSerializationImpl.java             | 945 +------------------
 .../impl/NodeSerializationImpl.java             |  22 +-
 .../serialization/impl/shard/DirectedEdge.java  |  41 +
 .../impl/shard/DirectedEdgeMeta.java            | 405 ++++++++
 .../impl/shard/EdgeColumnFamilies.java          |  60 ++
 .../serialization/impl/shard/EdgeRowKey.java    |  44 +
 .../impl/shard/EdgeShardSerialization.java      |  24 +-
 .../impl/shard/EdgeShardStrategy.java           |  45 +-
 .../impl/shard/NodeShardAllocation.java         |  21 +-
 .../impl/shard/NodeShardApproximation.java      |  31 +-
 .../impl/shard/NodeShardCache.java              |  21 +-
 .../serialization/impl/shard/NodeType.java      |  66 ++
 .../graph/serialization/impl/shard/RowKey.java  |  45 +
 .../serialization/impl/shard/RowKeyType.java    |  61 ++
 .../graph/serialization/impl/shard/Shard.java   | 142 +++
 .../impl/shard/ShardEntryGroup.java             | 268 ++++++
 .../impl/shard/ShardGroupCompaction.java        |  43 +
 .../impl/shard/ShardedEdgeSerialization.java    | 119 +++
 .../serialization/impl/shard/count/Counter.java |   8 +-
 .../shard/count/NodeShardApproximationImpl.java | 174 ++--
 .../count/NodeShardCounterSerialization.java    |   2 +-
 .../NodeShardCounterSerializationImpl.java      |  80 +-
 .../impl/shard/count/ShardKey.java              |  53 +-
 .../impl/shard/impl/EdgeRowKey.java             |  46 -
 .../impl/shard/impl/EdgeRowKeySerializer.java   |  17 +-
 .../impl/shard/impl/EdgeSearcher.java           | 143 +++
 .../impl/shard/impl/EdgeSerializer.java         |  77 ++
 .../shard/impl/EdgeShardRowKeySerializer.java   | 103 ++
 .../shard/impl/EdgeShardSerializationImpl.java  |  89 +-
 .../shard/impl/NodeShardAllocationImpl.java     | 237 +++--
 .../impl/shard/impl/NodeShardCacheImpl.java     | 263 ++++--
 .../impl/shard/impl/RowSerializer.java          |  63 ++
 .../impl/shard/impl/RowTypeSerializer.java      |  62 ++
 .../shard/impl/ShardEntryGroupIterator.java     | 100 ++
 .../shard/impl/ShardGroupCompactionImpl.java    |  75 ++
 .../impl/shard/impl/ShardRowIterator.java       | 134 +++
 .../impl/ShardedEdgeSerializationImpl.java      | 654 +++++++++++++
 .../shard/impl/SizebasedEdgeColumnFamilies.java | 150 +++
 .../shard/impl/SizebasedEdgeShardStrategy.java  |  51 +-
 .../impl/shard/impl/SourceEdgeSearcher.java     |  22 +
 .../graph/serialization/util/EdgeHasher.java    |  86 --
 .../graph/serialization/util/EdgeUtils.java     | 132 ---
 .../serialization/util/GraphValidation.java     | 189 ++++
 .../graph/ComittedGraphManagerIT.java           | 138 ---
 .../graph/CommittedGraphManagerIT.java          | 135 +++
 .../persistence/graph/GraphManagerIT.java       |   3 -
 .../persistence/graph/GraphManagerLoadTest.java |   3 +-
 .../graph/GraphManagerShardingIT.java           |  46 +-
 .../graph/GraphManagerStressTest.java           |   3 +-
 .../usergrid/persistence/graph/SimpleTest.java  |  18 +-
 .../EdgeMetadataSerializationTest.java          |   2 +-
 .../EdgeSerializationChopTest.java              |   5 +-
 .../serialization/NodeSerializationTest.java    |   3 +-
 .../PermanentSerializationTest.java             |   1 -
 .../graph/serialization/TestCount.java          |   1 -
 .../impl/shard/EdgeShardSerializationTest.java  | 108 ++-
 .../impl/shard/NodeShardAllocationTest.java     | 420 ++++++---
 .../impl/shard/NodeShardCacheTest.java          | 231 ++---
 .../impl/shard/ShardEntryGroupTest.java         | 421 +++++++++
 .../shard/count/NodeShardApproximationTest.java | 106 ++-
 .../NodeShardCounterSerializationTest.java      |   8 +-
 .../shard/impl/ShardEntryGroupIteratorTest.java | 232 +++++
 .../serialization/util/EdgeHasherTest.java      | 501 ----------
 .../graph/test/util/EdgeTestUtils.java          |   6 -
 stack/corepersistence/pom.xml                   |   2 +-
 89 files changed, 5475 insertions(+), 2699 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/UniqueValueSerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/UniqueValueSerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/UniqueValueSerializationStrategyImpl.java
index 73c038e..b7e113e 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/UniqueValueSerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/UniqueValueSerializationStrategyImpl.java
@@ -56,7 +56,7 @@ public class UniqueValueSerializationStrategyImpl
 
     private static final EntityVersionSerializer ENTITY_VERSION_SER = new EntityVersionSerializer();
 
-    private static final MultiTennantColumnFamily<CollectionScope, Field, EntityVersion> 
+    private static final MultiTennantColumnFamily<CollectionScope, Field, EntityVersion>
         CF_UNIQUE_VALUES =
             new MultiTennantColumnFamily<CollectionScope, Field, EntityVersion>( "Unique_Values",
                 ROW_KEY_SER,

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/ColumnTypes.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/ColumnTypes.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/ColumnTypes.java
index b5e41ff..a055ca7 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/ColumnTypes.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/ColumnTypes.java
@@ -1,6 +1,7 @@
 package org.apache.usergrid.persistence.core.astyanax;
 
 
+import org.apache.cassandra.db.marshal.BooleanType;
 import org.apache.cassandra.db.marshal.DynamicCompositeType;
 
 
@@ -19,6 +20,8 @@ public class ColumnTypes {
 
     public static final String UUID_TYPE_REVERSED = "UUIDType(reversed=true)";
 
+    public static final String BOOLEAN = "BooleanType";
+
 
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIterator.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIterator.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIterator.java
new file mode 100644
index 0000000..c5a8c95
--- /dev/null
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIterator.java
@@ -0,0 +1,217 @@
+/*
+ *
+ *  * 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.astyanax;
+
+
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.NoSuchElementException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Exchanger;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+import org.apache.usergrid.persistence.core.rx.OrderedMerge;
+
+import com.amazonaws.services.redshift.model.UnsupportedOptionException;
+import com.google.common.base.Preconditions;
+
+import rx.Observable;
+import rx.Subscriber;
+import rx.schedulers.Schedulers;
+
+
+/**
+ * Simple iterator that wraps a collection of ColumnNameIterators.  We do this because we can't page with a
+ * multiRangeScan correctly for multiple round trips.  As a result, we do this since only 1 iterator with minimum values
+ * could potentially feed the entire result set.
+ *
+ * Compares the parsed values and puts them in order. If more than one row key emits the same value the first value is
+ * selected, and ignored from subsequent iterators.
+ */
+public class MultiKeyColumnNameIterator<C, T> implements Iterable<T>, Iterator<T> {
+
+
+    private InnerIterator<T> iterator;
+
+
+    public MultiKeyColumnNameIterator( final Collection<ColumnNameIterator<C, T>> columnNameIterators,
+                                       final Comparator<T> comparator, final int bufferSize ) {
+
+
+        Observable<T>[] observables = new Observable[columnNameIterators.size()];
+
+        int i = 0;
+
+        for ( ColumnNameIterator<C, T> columnNameIterator : columnNameIterators ) {
+
+            observables[i] = Observable.from( columnNameIterator, Schedulers.io() );
+
+            i++;
+        }
+
+
+        //merge them into 1 observable, and remove duplicates from the stream
+        Observable<T> merged = OrderedMerge.orderedMerge( comparator, bufferSize, observables ).distinctUntilChanged();
+
+
+        iterator = new InnerIterator(bufferSize);
+
+        merged.subscribe( iterator );
+    }
+
+
+    @Override
+    public Iterator<T> iterator() {
+        return this;
+    }
+
+
+    @Override
+    public boolean hasNext() {
+        return iterator.hasNext();
+    }
+
+
+    @Override
+    public T next() {
+        return iterator.next();
+    }
+
+
+    @Override
+    public void remove() {
+        throw new UnsupportedOperationException( "You cannot remove elements from a merged iterator, it is read only" );
+    }
+
+
+    /**
+     * Internal iterator that will put next elements into a blocking queue until it reaches capacity. At this point it
+     * will block then emitting thread until more elements are taken.  Assumed the Observable is run on a I/O thread,
+     * NOT the current thread.
+     */
+    private final class InnerIterator<T> extends Subscriber<T> implements Iterator<T> {
+
+        private CountDownLatch startLatch = new CountDownLatch( 1 );
+
+        private final LinkedBlockingQueue<T> queue;
+
+
+        private Throwable error;
+        private boolean done = false;
+
+        private T next;
+
+
+        private InnerIterator( int maxSize ) {
+            queue = new LinkedBlockingQueue<>( maxSize );
+        }
+
+
+        @Override
+        public boolean hasNext() {
+
+
+            //we're done
+            if ( next != null ) {
+                return true;
+            }
+
+
+            try {
+                startLatch.await();
+            }
+            catch ( InterruptedException e ) {
+                throw new RuntimeException( "Unable to wait for start of submission" );
+            }
+
+
+
+            //this is almost a busy wait, and is intentional, if we have nothing to poll, we want to get it as soon
+            //as it's available.  We generally only hit this once
+            do {
+                next = queue.poll();
+            }
+            while ( next == null && !done );
+
+
+            return next != null;
+        }
+
+
+        @Override
+        public T next() {
+
+            if ( error != null ) {
+                throw new RuntimeException( "An error occurred when populating the iterator", error );
+            }
+
+            if ( !hasNext() ) {
+                throw new NoSuchElementException( "No more elements are present" );
+            }
+
+
+            T toReturn = next;
+            next = null;
+            return toReturn;
+        }
+
+
+        @Override
+        public void remove() {
+            throw new UnsupportedOptionException( "Remove is unsupported" );
+        }
+
+
+        @Override
+        public void onCompleted() {
+            done = true;
+            startLatch.countDown();
+        }
+
+
+        @Override
+        public void onError( final Throwable e ) {
+            error = e;
+            done = true;
+            startLatch.countDown();
+        }
+
+
+        @Override
+        public void onNext( final T t ) {
+
+            //may block if we get full, that's expected behavior
+            try {
+                queue.put( t );
+            }
+            catch ( InterruptedException e ) {
+                throw new RuntimeException( "Unable to take from queue" );
+            }
+
+            startLatch.countDown();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/MultiTennantColumnFamily.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/MultiTennantColumnFamily.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/MultiTennantColumnFamily.java
index 19e5aae..6234184 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/MultiTennantColumnFamily.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/MultiTennantColumnFamily.java
@@ -33,20 +33,15 @@ import com.netflix.astyanax.model.ColumnFamily;
 public class MultiTennantColumnFamily<S extends ApplicationScope, K, V>
     extends ColumnFamily<ScopedRowKey<S, K>, V> {
 
-    public MultiTennantColumnFamily( 
-            final String columnFamilyName, 
-            final Serializer<ScopedRowKey<S, K>> keySerializer,
-            final Serializer<V> columnSerializer ) {
+    public MultiTennantColumnFamily( final String columnFamilyName, final Serializer<ScopedRowKey<S, K>> keySerializer,
+                                     final Serializer<V> columnSerializer ) {
 
         super( columnFamilyName, keySerializer, columnSerializer );
     }
 
 
-    public MultiTennantColumnFamily( 
-            final String columnFamilyName, 
-            final Serializer<ScopedRowKey<S, K>> keySerializer,
-            final Serializer<V> columnSerializer,
-            final Serializer<?> defaultValueSerializer ) {
+    public MultiTennantColumnFamily( final String columnFamilyName, final Serializer<ScopedRowKey<S, K>> keySerializer,
+                                     final Serializer<V> columnSerializer, final Serializer<?> defaultValueSerializer ) {
 
         super( columnFamilyName, keySerializer, columnSerializer, defaultValueSerializer );
     }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/rx/OrderedMerge.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/rx/OrderedMerge.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/rx/OrderedMerge.java
index 5ba3fbb..4032176 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/rx/OrderedMerge.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/rx/OrderedMerge.java
@@ -181,6 +181,9 @@ public final class OrderedMerge<T> implements Observable.OnSubscribe<T> {
                     InnerObserver<T> maxObserver = null;
                     T max = null;
 
+                    /**
+                     * TODO T.N. change this to be an 0(1) for min and O(log n) to update after pop rather than O(n*inner)
+                     */
                     for ( InnerObserver<T> inner : innerSubscribers ) {
 
                         //nothing to do, this inner

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/scope/ApplicationScopeImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/scope/ApplicationScopeImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/scope/ApplicationScopeImpl.java
index 692ba49..4e067c2 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/scope/ApplicationScopeImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/scope/ApplicationScopeImpl.java
@@ -33,7 +33,8 @@ public class ApplicationScopeImpl implements ApplicationScope {
 
 
     public ApplicationScopeImpl( final Id application ) {
-        this.application = application;}
+        this.application = application;
+    }
 
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/Edge.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/Edge.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/Edge.java
index 21f804a..5613ae9 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/Edge.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/Edge.java
@@ -21,7 +21,6 @@ package org.apache.usergrid.persistence.graph;
 
 
 import java.io.Serializable;
-import java.util.UUID;
 
 import org.apache.usergrid.persistence.model.entity.Id;
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/GraphFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/GraphFig.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/GraphFig.java
index e0ce45c..45064c9 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/GraphFig.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/GraphFig.java
@@ -39,11 +39,26 @@ public interface GraphFig extends GuicyFig {
 
     public static final String SHARD_CACHE_SIZE = "usergrid.graph.shard.cache.size";
 
+
+    /**
+     * Get the cache timeout.  The local cache will exist for this amount of time max (in millis).
+     */
     public static final String SHARD_CACHE_TIMEOUT = "usergrid.graph.shard.cache.timeout";
 
-    public static final String COUNTER_WRITE_FLUSH_COUNT = "usergrid.graph.shard.counter.flush.count";
+    /**
+     * The minimum amount of time than can occur (in millis) between shard allocation.  Must be at least 2x the cache timeout.
+     *
+     * Note that you should also pad this for node clock drift.  A good value for this would be 2x the shard cache timeout + 30 seconds,
+     * assuming you have NTP and allow a max drift of 30 seconds
+     */
+    public static final String SHARD_MIN_DELTA = "usergrid.graph.shard.min.delta";
+
+
+    public static final String COUNTER_WRITE_FLUSH_COUNT = "usergrid.graph.shard.counter.beginFlush.count";
 
-    public static final String COUNTER_WRITE_FLUSH_INTERVAL = "usergrid.graph.shard.counter.flush.interval";
+    public static final String COUNTER_WRITE_FLUSH_INTERVAL = "usergrid.graph.shard.counter.beginFlush.interval";
+
+    public static final String COUNTER_WRITE_FLUSH_QUEUE_SIZE = "usergrid.graph.shard.counter.queue.size";
 
 
 
@@ -69,11 +84,18 @@ public interface GraphFig extends GuicyFig {
     @Key(SHARD_CACHE_TIMEOUT)
     long getShardCacheTimeout();
 
+    @Default("60000")
+    @Key( SHARD_MIN_DELTA )
+    long getShardMinDelta();
+
+
     @Default( "250000" )
     @Key( SHARD_CACHE_SIZE )
     long getShardCacheSize();
 
 
+
+
     @Default( "10000" )
     @Key( COUNTER_WRITE_FLUSH_COUNT )
     long getCounterFlushCount();
@@ -82,5 +104,9 @@ public interface GraphFig extends GuicyFig {
     @Default( "30000" )
     @Key( COUNTER_WRITE_FLUSH_INTERVAL )
     long getCounterFlushInterval();
+
+    @Default( "1000" )
+    @Key(COUNTER_WRITE_FLUSH_QUEUE_SIZE  )
+    int getCounterFlushQueueSize();
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/SearchByEdge.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/SearchByEdge.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/SearchByEdge.java
index 8deeb69..7e589f2 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/SearchByEdge.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/SearchByEdge.java
@@ -20,8 +20,6 @@
 package org.apache.usergrid.persistence.graph;
 
 
-import java.util.UUID;
-
 import org.apache.usergrid.persistence.model.entity.Id;
 
 import com.google.common.base.Optional;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/SearchByEdgeType.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/SearchByEdgeType.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/SearchByEdgeType.java
index 97c01c0..29cc3f5 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/SearchByEdgeType.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/SearchByEdgeType.java
@@ -20,8 +20,6 @@
 package org.apache.usergrid.persistence.graph;
 
 
-import java.util.UUID;
-
 import org.apache.usergrid.persistence.model.entity.Id;
 
 import com.google.common.base.Optional;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/guice/GraphModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/guice/GraphModule.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/guice/GraphModule.java
index aca8d00..ca7c270 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/guice/GraphModule.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/guice/GraphModule.java
@@ -43,17 +43,21 @@ import org.apache.usergrid.persistence.graph.serialization.NodeSerialization;
 import org.apache.usergrid.persistence.graph.serialization.impl.EdgeMetadataSerializationImpl;
 import org.apache.usergrid.persistence.graph.serialization.impl.EdgeSerializationImpl;
 import org.apache.usergrid.persistence.graph.serialization.impl.NodeSerializationImpl;
+import org.apache.usergrid.persistence.graph.serialization.impl.shard.EdgeColumnFamilies;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.EdgeShardSerialization;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.EdgeShardStrategy;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.NodeShardAllocation;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.NodeShardApproximation;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.NodeShardCache;
+import org.apache.usergrid.persistence.graph.serialization.impl.shard.ShardedEdgeSerialization;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.count.NodeShardApproximationImpl;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.count.NodeShardCounterSerialization;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.count.NodeShardCounterSerializationImpl;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.EdgeShardSerializationImpl;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.NodeShardAllocationImpl;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.NodeShardCacheImpl;
+import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.ShardedEdgeSerializationImpl;
+import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.SizebasedEdgeColumnFamilies;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.SizebasedEdgeShardStrategy;
 
 import com.google.inject.AbstractModule;
@@ -101,7 +105,6 @@ public class GraphModule extends AbstractModule {
         bind( EdgeShardSerialization.class ).to( EdgeShardSerializationImpl.class );
 
 
-
         //Repair/cleanup classes.
         bind( EdgeMetaRepair.class ).to( EdgeMetaRepairImpl.class );
         bind( EdgeDeleteRepair.class ).to( EdgeDeleteRepairImpl.class );
@@ -111,7 +114,9 @@ public class GraphModule extends AbstractModule {
          * Add our listeners
          */
         bind( NodeDeleteListener.class ).to( NodeDeleteListenerImpl.class );
-        bind( EdgeDeleteListener.class).to( EdgeDeleteListenerImpl.class );
+        bind( EdgeDeleteListener.class ).to( EdgeDeleteListenerImpl.class );
+
+
 
 
         /**
@@ -129,7 +134,7 @@ public class GraphModule extends AbstractModule {
         migrationBinding.addBinding().to( Key.get( EdgeMetadataSerialization.class ) );
 
         //bind each singleton to the multi set.  Otherwise we won't migrate properly
-        migrationBinding.addBinding().to( Key.get( EdgeSerialization.class, StorageEdgeSerialization.class ) );
+        migrationBinding.addBinding().to( Key.get( EdgeColumnFamilies.class, StorageEdgeSerialization.class ) );
 
         migrationBinding.addBinding().to( Key.get( EdgeShardSerialization.class ) );
         migrationBinding.addBinding().to( Key.get( NodeShardCounterSerialization.class ) );
@@ -143,22 +148,36 @@ public class GraphModule extends AbstractModule {
     @Singleton
     @Inject
     @StorageEdgeSerialization
-    public EdgeSerialization permanentStorageSerialization( final NodeShardCache cache, final Keyspace keyspace,
-                                                            final CassandraConfig cassandraConfig,
-                                                            final GraphFig graphFig,
-                                                            final NodeShardApproximation shardApproximation) {
+    public EdgeSerialization storageSerialization( final NodeShardCache cache, final Keyspace keyspace,
+                                                   final CassandraConfig cassandraConfig, final GraphFig graphFig,
+                                                   final NodeShardApproximation shardApproximation,
+                                                   final TimeService timeService,
+                                                   @StorageEdgeSerialization
+                                                   final EdgeColumnFamilies edgeColumnFamilies ) {
 
         final EdgeShardStrategy sizeBasedStrategy = new SizebasedEdgeShardStrategy( cache, shardApproximation );
 
+
+        final ShardedEdgeSerialization serialization = new ShardedEdgeSerializationImpl(keyspace, cassandraConfig, graphFig, sizeBasedStrategy,
+                timeService );
+
+
         final EdgeSerializationImpl edgeSerialization =
-                new EdgeSerializationImpl( keyspace, cassandraConfig, graphFig, sizeBasedStrategy );
+                new EdgeSerializationImpl( keyspace, cassandraConfig, graphFig, sizeBasedStrategy, edgeColumnFamilies,
+                        serialization );
 
 
         return edgeSerialization;
     }
 
 
-
+    @Provides
+    @Singleton
+    @Inject
+    @StorageEdgeSerialization
+    public EdgeColumnFamilies storageSerializationColumnFamilies() {
+        return new SizebasedEdgeColumnFamilies();
+    }
 }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/GraphManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/GraphManagerImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/GraphManagerImpl.java
index b7689a2..473f49e 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/GraphManagerImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/GraphManagerImpl.java
@@ -46,7 +46,7 @@ import org.apache.usergrid.persistence.graph.impl.stage.NodeDeleteListener;
 import org.apache.usergrid.persistence.graph.serialization.EdgeMetadataSerialization;
 import org.apache.usergrid.persistence.graph.serialization.EdgeSerialization;
 import org.apache.usergrid.persistence.graph.serialization.NodeSerialization;
-import org.apache.usergrid.persistence.graph.serialization.util.EdgeUtils;
+import org.apache.usergrid.persistence.graph.serialization.util.GraphValidation;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.util.UUIDGenerator;
 
@@ -121,7 +121,7 @@ public class GraphManagerImpl implements GraphManager {
 
     @Override
     public Observable<Edge> writeEdge( final Edge edge ) {
-        EdgeUtils.validateEdge( edge );
+        GraphValidation.validateEdge( edge );
 
         final MarkedEdge markedEdge = new SimpleMarkedEdge( edge, false );
 
@@ -155,7 +155,7 @@ public class GraphManagerImpl implements GraphManager {
 
     @Override
     public Observable<Edge> deleteEdge( final Edge edge ) {
-        EdgeUtils.validateEdge( edge );
+        GraphValidation.validateEdge( edge );
 
         final MarkedEdge markedEdge = new SimpleMarkedEdge( edge, true );
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleEdge.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleEdge.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleEdge.java
index 576d9dd..8579579 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleEdge.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleEdge.java
@@ -20,11 +20,8 @@
 package org.apache.usergrid.persistence.graph.impl;
 
 
-import java.util.UUID;
-
-import org.apache.usergrid.persistence.core.util.ValidationUtils;
 import org.apache.usergrid.persistence.graph.Edge;
-import org.apache.usergrid.persistence.graph.serialization.util.EdgeUtils;
+import org.apache.usergrid.persistence.graph.serialization.util.GraphValidation;
 import org.apache.usergrid.persistence.model.entity.Id;
 
 
@@ -46,7 +43,7 @@ public class SimpleEdge implements Edge {
         this.targetNode = targetNode;
         this.timestamp = timestamp;
 
-        EdgeUtils.validateEdge( this );
+        GraphValidation.validateEdge( this );
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleMarkedEdge.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleMarkedEdge.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleMarkedEdge.java
index a5b4f2e..12192fc 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleMarkedEdge.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleMarkedEdge.java
@@ -20,8 +20,6 @@
 package org.apache.usergrid.persistence.graph.impl;
 
 
-import java.util.UUID;
-
 import org.apache.usergrid.persistence.graph.Edge;
 import org.apache.usergrid.persistence.graph.MarkedEdge;
 import org.apache.usergrid.persistence.model.entity.Id;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByEdge.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByEdge.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByEdge.java
index e0dbc29..e8971f6 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByEdge.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByEdge.java
@@ -20,12 +20,10 @@
 package org.apache.usergrid.persistence.graph.impl;
 
 
-import java.util.UUID;
-
 import org.apache.usergrid.persistence.core.util.ValidationUtils;
 import org.apache.usergrid.persistence.graph.Edge;
 import org.apache.usergrid.persistence.graph.SearchByEdge;
-import org.apache.usergrid.persistence.graph.serialization.util.EdgeUtils;
+import org.apache.usergrid.persistence.graph.serialization.util.GraphValidation;
 import org.apache.usergrid.persistence.model.entity.Id;
 
 import com.google.common.base.Optional;
@@ -56,7 +54,7 @@ public class SimpleSearchByEdge implements SearchByEdge {
         ValidationUtils.verifyIdentity(sourceNode);
         ValidationUtils.verifyIdentity(targetNode);
         ValidationUtils.verifyString( type, "type" );
-        EdgeUtils.validateTimestamp(  maxTimestamp, "maxTimestamp" );
+        GraphValidation.validateTimestamp( maxTimestamp, "maxTimestamp" );
 
 
         this.sourceNode = sourceNode;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByEdgeType.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByEdgeType.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByEdgeType.java
index 75e9217..9e7dcde 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByEdgeType.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByEdgeType.java
@@ -20,12 +20,10 @@
 package org.apache.usergrid.persistence.graph.impl;
 
 
-import java.util.UUID;
-
 import org.apache.usergrid.persistence.core.util.ValidationUtils;
 import org.apache.usergrid.persistence.graph.Edge;
 import org.apache.usergrid.persistence.graph.SearchByEdgeType;
-import org.apache.usergrid.persistence.graph.serialization.util.EdgeUtils;
+import org.apache.usergrid.persistence.graph.serialization.util.GraphValidation;
 import org.apache.usergrid.persistence.model.entity.Id;
 
 import com.google.common.base.Optional;
@@ -53,7 +51,7 @@ public class SimpleSearchByEdgeType implements SearchByEdgeType{
     public SimpleSearchByEdgeType( final Id node, final String type, final long maxTimestamp, final Edge last ) {
         ValidationUtils.verifyIdentity(node);
         ValidationUtils.verifyString( type, "type" );
-        EdgeUtils.validateTimestamp(maxTimestamp, "maxTimestamp");
+        GraphValidation.validateTimestamp( maxTimestamp, "maxTimestamp" );
 
 
         this.node = node;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByIdType.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByIdType.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByIdType.java
index 6d5fb9f..4249ae7 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByIdType.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/SimpleSearchByIdType.java
@@ -20,8 +20,6 @@
 package org.apache.usergrid.persistence.graph.impl;
 
 
-import java.util.UUID;
-
 import org.apache.usergrid.persistence.core.util.ValidationUtils;
 import org.apache.usergrid.persistence.graph.Edge;
 import org.apache.usergrid.persistence.graph.SearchByIdType;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeDeleteListenerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeDeleteListenerImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeDeleteListenerImpl.java
index 55ab25b..7e42293 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeDeleteListenerImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeDeleteListenerImpl.java
@@ -23,8 +23,6 @@ import java.util.UUID;
 
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.graph.MarkedEdge;
-import org.apache.usergrid.persistence.graph.impl.stage.EdgeDeleteRepair;
-import org.apache.usergrid.persistence.graph.impl.stage.EdgeMetaRepair;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -48,7 +46,6 @@ public class EdgeDeleteListenerImpl implements EdgeDeleteListener {
     @Inject
     public EdgeDeleteListenerImpl(
                                final EdgeDeleteRepair edgeDeleteRepair, final EdgeMetaRepair edgeMetaRepair ) {
-
         this.edgeDeleteRepair = edgeDeleteRepair;
         this.edgeMetaRepair = edgeMetaRepair;
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeMetaRepair.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeMetaRepair.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeMetaRepair.java
index f98b0fa..5ba822b 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeMetaRepair.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeMetaRepair.java
@@ -20,8 +20,6 @@
 package org.apache.usergrid.persistence.graph.impl.stage;
 
 
-import java.util.UUID;
-
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.model.entity.Id;
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeMetaRepairImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeMetaRepairImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeMetaRepairImpl.java
index 272f54b..a0769f5 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeMetaRepairImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/stage/EdgeMetaRepairImpl.java
@@ -38,7 +38,7 @@ import org.apache.usergrid.persistence.graph.impl.SimpleSearchByIdType;
 import org.apache.usergrid.persistence.graph.impl.SimpleSearchIdType;
 import org.apache.usergrid.persistence.graph.serialization.EdgeMetadataSerialization;
 import org.apache.usergrid.persistence.graph.serialization.EdgeSerialization;
-import org.apache.usergrid.persistence.graph.serialization.util.EdgeUtils;
+import org.apache.usergrid.persistence.graph.serialization.util.GraphValidation;
 import org.apache.usergrid.persistence.model.entity.Id;
 
 import com.google.common.base.Preconditions;
@@ -111,7 +111,7 @@ public class EdgeMetaRepairImpl implements EdgeMetaRepair {
         ValidationUtils.validateApplicationScope( scope );
         ValidationUtils.verifyIdentity( node );
         Preconditions.checkNotNull( edgeType, "edge type is required" );
-        EdgeUtils.validateTimestamp( maxTimestamp, "maxTimestamp" );
+        GraphValidation.validateTimestamp( maxTimestamp, "maxTimestamp" );
         Preconditions.checkNotNull( serialization, "serialization is required" );
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/EdgeMetadataSerialization.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/EdgeMetadataSerialization.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/EdgeMetadataSerialization.java
index cc62a42..9e0beb5 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/EdgeMetadataSerialization.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/EdgeMetadataSerialization.java
@@ -21,10 +21,9 @@ package org.apache.usergrid.persistence.graph.serialization;
 
 
 import java.util.Iterator;
-import java.util.UUID;
 
-import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.migration.Migration;
+import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.graph.Edge;
 import org.apache.usergrid.persistence.graph.SearchEdgeType;
 import org.apache.usergrid.persistence.graph.SearchIdType;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/EdgeSerialization.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/EdgeSerialization.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/EdgeSerialization.java
index b80b7ab..8d28304 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/EdgeSerialization.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/EdgeSerialization.java
@@ -24,7 +24,6 @@ import java.util.Iterator;
 import java.util.UUID;
 
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
-import org.apache.usergrid.persistence.core.migration.Migration;
 import org.apache.usergrid.persistence.graph.MarkedEdge;
 import org.apache.usergrid.persistence.graph.SearchByEdge;
 import org.apache.usergrid.persistence.graph.SearchByEdgeType;
@@ -36,7 +35,7 @@ import com.netflix.astyanax.MutationBatch;
 /**
  * Simple interface for serializing ONLY an edge
  */
-public interface EdgeSerialization extends Migration {
+public interface EdgeSerialization {
 
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/NodeSerialization.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/NodeSerialization.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/NodeSerialization.java
index 96f869d..77e53c8 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/NodeSerialization.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/NodeSerialization.java
@@ -22,10 +22,9 @@ package org.apache.usergrid.persistence.graph.serialization;
 
 import java.util.Collection;
 import java.util.Map;
-import java.util.UUID;
 
-import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.migration.Migration;
+import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.graph.Edge;
 import org.apache.usergrid.persistence.model.entity.Id;
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/72684dfc/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationImpl.java
index 0fc3035..924eddb 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationImpl.java
@@ -44,7 +44,7 @@ import org.apache.usergrid.persistence.graph.GraphFig;
 import org.apache.usergrid.persistence.graph.SearchEdgeType;
 import org.apache.usergrid.persistence.graph.SearchIdType;
 import org.apache.usergrid.persistence.graph.serialization.EdgeMetadataSerialization;
-import org.apache.usergrid.persistence.graph.serialization.util.EdgeUtils;
+import org.apache.usergrid.persistence.graph.serialization.util.GraphValidation;
 import org.apache.usergrid.persistence.model.entity.Id;
 
 import com.google.common.base.Preconditions;
@@ -131,7 +131,7 @@ public class EdgeMetadataSerializationImpl implements EdgeMetadataSerialization,
     public MutationBatch writeEdge( final ApplicationScope scope, final Edge edge ) {
 
         ValidationUtils.validateApplicationScope( scope );
-        EdgeUtils.validateEdge( edge );
+        GraphValidation.validateEdge( edge );
 
 
         final Id source = edge.getSourceNode();
@@ -315,7 +315,7 @@ public class EdgeMetadataSerializationImpl implements EdgeMetadataSerialization,
     private Iterator<String> getEdgeTypes( final ApplicationScope scope, final SearchEdgeType search,
                                            final MultiTennantColumnFamily<ApplicationScope, Id, String> cf ) {
         ValidationUtils.validateApplicationScope( scope );
-        EdgeUtils.validateSearchEdgeType( search );
+        GraphValidation.validateSearchEdgeType( search );
 
 
         final ScopedRowKey<ApplicationScope, Id> sourceKey = new ScopedRowKey<>( scope, search.getNode() );
@@ -350,7 +350,7 @@ public class EdgeMetadataSerializationImpl implements EdgeMetadataSerialization,
     public Iterator<String> getIdTypes( final ApplicationScope scope, final SearchIdType search,
                                         final MultiTennantColumnFamily<ApplicationScope, EdgeIdTypeKey, String> cf ) {
         ValidationUtils.validateApplicationScope( scope );
-        EdgeUtils.validateSearchEdgeIdType( search );
+        GraphValidation.validateSearchEdgeIdType( search );
 
 
         final ScopedRowKey<ApplicationScope, EdgeIdTypeKey> sourceTypeKey =