You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by mr...@apache.org on 2016/06/30 06:03:43 UTC

usergrid git commit: Expose option to perform the uniqueIndexRepair higher up to the callers. This allows better control of when the repair happens on the write path.

Repository: usergrid
Updated Branches:
  refs/heads/release-2.1.1 a6c307b28 -> 824287853


Expose option to perform the uniqueIndexRepair higher up to the callers.  This allows better control of when the repair happens on the write path.


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

Branch: refs/heads/release-2.1.1
Commit: 824287853137334cca134efbcfc61e6c797e7e0e
Parents: a6c307b
Author: Michael Russo <mr...@apigee.com>
Authored: Wed Jun 29 23:03:02 2016 -0700
Committer: Michael Russo <mr...@apigee.com>
Committed: Wed Jun 29 23:03:02 2016 -0700

----------------------------------------------------------------------
 .../usergrid/corepersistence/CpEntityManager.java |  9 +++++----
 .../usergrid/persistence/EntityManager.java       |  4 ++--
 .../apache/usergrid/persistence/PathQuery.java    |  3 ++-
 .../impl/EntityCollectionManagerImpl.java         |  8 +++++---
 .../mvcc/stage/write/WriteUniqueVerify.java       | 18 +++++++++++-------
 .../UniqueValueSerializationStrategy.java         | 18 +++++++++++++++++-
 .../UniqueValueSerializationStrategyImpl.java     |  8 ++++++++
 ...UniqueValueSerializationStrategyProxyImpl.java | 13 +++++++++++++
 .../services/AbstractCollectionService.java       |  9 ++++++---
 .../services/AbstractConnectionsService.java      |  5 ++++-
 10 files changed, 73 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/82428785/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java
index 3dc0d13..1ed05bd 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java
@@ -853,7 +853,7 @@ public class CpEntityManager implements EntityManager {
     }
 
     @Override
-    public Entity getUniqueEntityFromAlias(String collectionType, String aliasType, boolean useReadRepair){
+    public Entity getUniqueEntityFromAlias(String collectionType, String aliasType, boolean uniqueIndexRepair){
 
         String collName = Schema.defaultCollectionName( collectionType );
         String propertyName = Schema.getDefaultSchema().aliasProperty( collName );
@@ -866,7 +866,7 @@ public class CpEntityManager implements EntityManager {
         StringField uniqueLookupRepairField =  new StringField( propertyName, aliasType.toString());
 
         Observable<FieldSet> fieldSetObservable = ecm.getEntitiesFromFields(
-            Inflector.getInstance().singularize( collectionType ), Arrays.<Field>asList( uniqueLookupRepairField ), useReadRepair);
+            Inflector.getInstance().singularize( collectionType ), Arrays.<Field>asList( uniqueLookupRepairField ), uniqueIndexRepair);
 
         if(fieldSetObservable == null){
 
@@ -893,14 +893,15 @@ public class CpEntityManager implements EntityManager {
     }
 
     @Override
-    public UUID getUniqueIdFromAlias( String collectionType, String aliasType ){
+    public UUID getUniqueIdFromAlias(String collectionType, String aliasType, boolean uniqueIndexRepair){
 
         String collName = Schema.defaultCollectionName( collectionType );
         String propertyName = Schema.getDefaultSchema().aliasProperty( collName );
         StringField uniqueLookupRepairField =  new StringField( propertyName, aliasType);
 
         Observable<FieldSet> fieldSetObservable = ecm.getEntitiesFromFields(
-            Inflector.getInstance().singularize( collectionType ), Collections.singletonList(uniqueLookupRepairField), true);
+            Inflector.getInstance().singularize( collectionType ),
+            Collections.singletonList(uniqueLookupRepairField), uniqueIndexRepair);
 
         if(fieldSetObservable == null){
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/82428785/stack/core/src/main/java/org/apache/usergrid/persistence/EntityManager.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/EntityManager.java b/stack/core/src/main/java/org/apache/usergrid/persistence/EntityManager.java
index 7e25a80..874e618 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/EntityManager.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/EntityManager.java
@@ -721,9 +721,9 @@ public interface EntityManager {
     public void flushManagerCaches();
 
 
-    public Entity getUniqueEntityFromAlias(String aliasType, String aliasValue, boolean useReadRepair);
+    public Entity getUniqueEntityFromAlias(String aliasType, String aliasValue, boolean uniqueIndexRepair);
 
-    public UUID getUniqueIdFromAlias( String aliasType, String aliasValue );
+    public UUID getUniqueIdFromAlias(String aliasType, String aliasValue, boolean uniqueIndexRepair);
 
 
     /**

http://git-wip-us.apache.org/repos/asf/usergrid/blob/82428785/stack/core/src/main/java/org/apache/usergrid/persistence/PathQuery.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/PathQuery.java b/stack/core/src/main/java/org/apache/usergrid/persistence/PathQuery.java
index 30636ab..c5833af 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/PathQuery.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/PathQuery.java
@@ -128,7 +128,8 @@ public class PathQuery<E> {
             String name = query.getSingleNameOrEmailIdentifier();
             String entityType = InflectionUtils.singularize(query.getCollection());
 
-            UUID entityId = em.getUniqueIdFromAlias( entityType, name );
+            // don't use unique index repair on read only logic
+            UUID entityId = em.getUniqueIdFromAlias( entityType, name, false);
 
             if( entityId == null){
                 throw new

http://git-wip-us.apache.org/repos/asf/usergrid/blob/82428785/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
index 523b4df..658c68c 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
@@ -325,14 +325,16 @@ public class EntityCollectionManagerImpl implements EntityCollectionManager {
      * Retrieves all entities that correspond to each field given in the Collection.
      */
     @Override
-    public Observable<FieldSet> getEntitiesFromFields(final String type, final Collection<Field> fields, boolean useReadRepair) {
+    public Observable<FieldSet> getEntitiesFromFields(final String type, final Collection<Field> fields,
+                                                      boolean uniqueIndexRepair) {
         final Observable<FieldSet> fieldSetObservable = Observable.just( fields ).map( fields1 -> {
             try {
 
                 final UUID startTime = UUIDGenerator.newTimeUUID();
 
                 //Get back set of unique values that correspond to collection of fields
-                UniqueValueSet set = uniqueValueSerializationStrategy.load( applicationScope, type, fields1 );
+                UniqueValueSet set =
+                    uniqueValueSerializationStrategy.load( applicationScope, type, fields1 , uniqueIndexRepair);
 
                 //Short circuit if we don't have any uniqueValues from the given fields.
                 if ( !set.iterator().hasNext() ) {
@@ -407,7 +409,7 @@ public class EntityCollectionManagerImpl implements EntityCollectionManager {
                     response.addEntity( expectedUnique.getField(), entity );
                 }
 
-                if ( useReadRepair && deleteBatch.getRowCount() > 0 ) {
+                if ( deleteBatch.getRowCount() > 0 ) {
 
                     deleteBatch.execute();
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/82428785/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
index adbe03d..0ebb6a1 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
@@ -122,9 +122,9 @@ public class WriteUniqueVerify implements Action1<CollectionIoEvent<MvccEntity>>
             try {
 
                 // loading will retrieve the oldest unique value entry for the field
-                // purposely enable the read repair here to clean up before we write
-                UniqueValueSet set = uniqueValueStrat.load(scope, cassandraFig.getReadCL(),
-                    written.getEntityId().getType(), Collections.singletonList(written.getField()), true);
+                // don't use read repair on this pre-write check
+                UniqueValueSet set = uniqueValueStrat.load(scope, written.getEntityId().getType(),
+                    Collections.singletonList(written.getField()), false);
 
 
                 set.forEach(uniqueValue -> {
@@ -143,11 +143,15 @@ public class WriteUniqueVerify implements Action1<CollectionIoEvent<MvccEntity>>
                 throw new RuntimeException("Error connecting to cassandra", e);
             }
 
-            // use TTL in case something goes wrong before entity is finally committed
-            final MutationBatch mb = uniqueValueStrat.write( scope, written, serializationFig.getTimeout() );
+            // only build the batch statement if we don't have a violation for the field
+            if( preWriteUniquenessViolations.get(field.getName()) != null) {
 
-            batch.mergeShallow( mb );
-            uniqueFields.add(field);
+                // use TTL in case something goes wrong before entity is finally committed
+                final MutationBatch mb = uniqueValueStrat.write(scope, written, serializationFig.getTimeout());
+
+                batch.mergeShallow(mb);
+                uniqueFields.add(field);
+            }
         }
 
         if(preWriteUniquenessViolations.size() > 0 ){

http://git-wip-us.apache.org/repos/asf/usergrid/blob/82428785/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
index 35bb1b8..c6c70b9 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
@@ -70,7 +70,23 @@ public interface UniqueValueSerializationStrategy extends Migration, VersionedDa
      *
      * @throws ConnectionException on error connecting to Cassandra
      */
-    UniqueValueSet load( ApplicationScope applicationScope, String type, Collection<Field> fields ) throws ConnectionException;
+    UniqueValueSet load( ApplicationScope applicationScope, String type, Collection<Field> fields )
+        throws ConnectionException;
+
+    /**
+     * Load UniqueValue that matches field from collection or null if that value does not exist.  Returns the oldest
+     * unique value entry if more than 1 exists
+     *
+     * @param applicationScope scope in which to look for field name/value
+     * @param type The type the unique value exists within
+     * @param fields Field name/value to search for
+     *
+     * @return UniqueValueSet containing fields from the collection that exist in cassandra
+     *
+     * @throws ConnectionException on error connecting to Cassandra
+     */
+    UniqueValueSet load( ApplicationScope applicationScope, String type, Collection<Field> fields,
+                         boolean useReadRepair ) throws ConnectionException;
 
     /**
     * Load UniqueValue that matches field from collection or null if that value does not exist.

http://git-wip-us.apache.org/repos/asf/usergrid/blob/82428785/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 db93272..4456123 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
@@ -240,6 +240,14 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
         return load( colScope, ConsistencyLevel.valueOf( cassandraFig.getReadCL() ), type, fields, false);
     }
 
+    @Override
+    public UniqueValueSet load( final ApplicationScope colScope, final String type, final Collection<Field> fields,
+                                boolean useReadRepair)
+        throws ConnectionException {
+        return load( colScope, ConsistencyLevel.valueOf( cassandraFig.getReadCL() ), type, fields, useReadRepair);
+    }
+
+
 
     @Override
     public UniqueValueSet load(final ApplicationScope appScope, final ConsistencyLevel consistencyLevel,

http://git-wip-us.apache.org/repos/asf/usergrid/blob/82428785/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 b9c9999..f971b23 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
@@ -113,6 +113,19 @@ public class UniqueValueSerializationStrategyProxyImpl implements UniqueValueSer
         return migration.to.load( applicationScope, type, fields );
     }
 
+    @Override
+    public UniqueValueSet load( final ApplicationScope applicationScope, final String type,
+                                final Collection<Field> fields, boolean useReadRepair ) throws ConnectionException {
+
+        final MigrationRelationship<UniqueValueSerializationStrategy> migration = getMigrationRelationShip();
+
+        if ( migration.needsMigration() ) {
+            return migration.from.load( applicationScope, type, fields, useReadRepair );
+        }
+
+        return migration.to.load( applicationScope, type, fields, useReadRepair );
+    }
+
 
     @Override
     public UniqueValueSet load(final ApplicationScope applicationScope, final ConsistencyLevel consistencyLevel,

http://git-wip-us.apache.org/repos/asf/usergrid/blob/82428785/stack/services/src/main/java/org/apache/usergrid/services/AbstractCollectionService.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/AbstractCollectionService.java b/stack/services/src/main/java/org/apache/usergrid/services/AbstractCollectionService.java
index 1ed7255..8be86ab 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/AbstractCollectionService.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/AbstractCollectionService.java
@@ -82,7 +82,7 @@ public class AbstractCollectionService extends AbstractService {
             nameProperty = "name";
         }
 
-        Entity entity = em.getUniqueEntityFromAlias( getEntityType(), name, true);
+        Entity entity = em.getUniqueEntityFromAlias( getEntityType(), name, false);
         if ( entity != null ) {
             entity = importEntity( request, entity );
         }
@@ -172,7 +172,8 @@ public class AbstractCollectionService extends AbstractService {
     public ServiceResults getItemByName( ServiceContext context, String name ) throws Exception {
 
         // just get the UUID and then getItemById such that same results are being returned in both cases
-        UUID entityId = em.getUniqueIdFromAlias( getEntityType(), name );
+        // don't use uniqueIndexRepair on read only logic
+        UUID entityId = em.getUniqueIdFromAlias( getEntityType(), name, false);
 
         if ( entityId == null ) {
 
@@ -302,7 +303,7 @@ public class AbstractCollectionService extends AbstractService {
             return getItemByName( context, name );
         }
 
-       // EntityRef ref = em.getAlias( getEntityType(), name );
+        // use unique index repair here before any write logic if there are problems
         Entity entity = em.getUniqueEntityFromAlias( getEntityType(), name, true);
         if ( entity == null ) {
             // null entity ref means we tried to put a non-existing entity
@@ -516,6 +517,7 @@ public class AbstractCollectionService extends AbstractService {
             return super.postItemByName( context, name );
         }
 
+        // use unique index repair here before any write logic if there are problems
         Entity entity = em.getUniqueEntityFromAlias( getEntityType(), name, true);
         if ( entity == null ) {
             throw new ServiceResourceNotFoundException( context );
@@ -570,6 +572,7 @@ public class AbstractCollectionService extends AbstractService {
             return getItemByName( context, name );
         }
 
+        // use unique index repair here before any write logic if there are problems
         Entity entity = em.getUniqueEntityFromAlias( getEntityType(), name, true);
         if ( entity == null ) {
             throw new ServiceResourceNotFoundException( context );

http://git-wip-us.apache.org/repos/asf/usergrid/blob/82428785/stack/services/src/main/java/org/apache/usergrid/services/AbstractConnectionsService.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/AbstractConnectionsService.java b/stack/services/src/main/java/org/apache/usergrid/services/AbstractConnectionsService.java
index 5f7ca6b..3791644 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/AbstractConnectionsService.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/AbstractConnectionsService.java
@@ -271,7 +271,8 @@ public class AbstractConnectionsService extends AbstractService {
 
             //TODO T.N. USERGRID-1919 actually validate this is connected
 
-            Entity entity = em.getUniqueEntityFromAlias( query.getEntityType(), name, true);
+            // this is purely read only, don't use unique index repair
+            Entity entity = em.getUniqueEntityFromAlias( query.getEntityType(), name, false);
             if ( entity == null ) {
                 return null;
             }
@@ -372,6 +373,7 @@ public class AbstractConnectionsService extends AbstractService {
             if ( query.containsSingleNameOrEmailIdentifier() ) {
                 String name = query.getSingleNameOrEmailIdentifier();
 
+                // use unique index repair here before any write logic if there are problems
                 entity = em.getUniqueEntityFromAlias( query.getEntityType(), name, true);
                 if ( entity == null ) {
                     throw new ServiceResourceNotFoundException( context );
@@ -529,6 +531,7 @@ public class AbstractConnectionsService extends AbstractService {
                 nameProperty = "name";
             }
 
+            // use unique index repair here before any write logic if there are problems
             Entity entity = em.getUniqueEntityFromAlias( query.getEntityType(), name, true);
             if ( entity == null ) {
                 throw new ServiceResourceNotFoundException( context );