You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by gr...@apache.org on 2015/11/11 01:00:10 UTC

usergrid git commit: Added cleanup for false unique property cleanup if there were no corresponding entities Added test for 1000 such entities and verifying that they were indeed fixed correctly.

Repository: usergrid
Updated Branches:
  refs/heads/readRepairForIndexValues 3d5ae4647 -> b38f5bcb4


Added cleanup for false unique property cleanup if there were no corresponding entities
Added test for 1000 such entities and verifying that they were indeed fixed correctly.


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

Branch: refs/heads/readRepairForIndexValues
Commit: b38f5bcb48dd2603a0b095d2c651ba2575a006f1
Parents: 3d5ae46
Author: George Reyes <gr...@apache.org>
Authored: Tue Nov 10 16:00:08 2015 -0800
Committer: George Reyes <gr...@apache.org>
Committed: Tue Nov 10 16:00:08 2015 -0800

----------------------------------------------------------------------
 .../cassandra/EntityManagerImpl.java            |  12 +++
 .../usergrid/services/ServiceRequestIT.java     | 107 +++++++++++++++----
 2 files changed, 101 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/b38f5bcb/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/EntityManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/EntityManagerImpl.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/EntityManagerImpl.java
index 76cb6d7..bd7773a 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/EntityManagerImpl.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/EntityManagerImpl.java
@@ -547,6 +547,18 @@ public class EntityManagerImpl implements EntityManager {
                         false );
 
 
+        //check to see if the single value is valid. If it is not valid then it will be zero and go through
+        //the code below.
+        if(cols.size() == 1){
+            logger.info("Verifying that column is still valid, if not will be removed");
+            UUID indexCorruptionUuid = ue.fromByteBuffer( cols.get( 0 ).getName());
+
+            if (get(indexCorruptionUuid) == null ) {
+                deleteUniqueColumn( ownerEntityId, key, indexCorruptionUuid );
+                cols.remove( 0 );
+            }
+        }
+
         //No columns at all, it's unique
         if ( cols.size() == 0 ) {
             return Collections.emptySet();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b38f5bcb/stack/services/src/test/java/org/apache/usergrid/services/ServiceRequestIT.java
----------------------------------------------------------------------
diff --git a/stack/services/src/test/java/org/apache/usergrid/services/ServiceRequestIT.java b/stack/services/src/test/java/org/apache/usergrid/services/ServiceRequestIT.java
index d89536f..c678ba9 100644
--- a/stack/services/src/test/java/org/apache/usergrid/services/ServiceRequestIT.java
+++ b/stack/services/src/test/java/org/apache/usergrid/services/ServiceRequestIT.java
@@ -31,6 +31,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.commons.lang.RandomStringUtils;
+import org.apache.http.annotation.NotThreadSafe;
 
 import org.apache.usergrid.ServiceITSetup;
 import org.apache.usergrid.ServiceITSetupImpl;
@@ -41,6 +42,8 @@ import org.apache.usergrid.management.ApplicationInfo;
 import org.apache.usergrid.management.OrganizationOwnerInfo;
 import org.apache.usergrid.persistence.Entity;
 import org.apache.usergrid.persistence.EntityManager;
+import org.apache.usergrid.persistence.EntityRef;
+import org.apache.usergrid.persistence.SimpleEntityRef;
 import org.apache.usergrid.persistence.cassandra.CassandraPersistenceUtils;
 import org.apache.usergrid.persistence.cassandra.CassandraService;
 import org.apache.usergrid.persistence.entities.User;
@@ -64,7 +67,7 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 
 
-@Concurrent()
+@NotThreadSafe()
 public class ServiceRequestIT {
 
     private static final Logger logger = LoggerFactory.getLogger( ServiceRequestIT.class );
@@ -153,16 +156,9 @@ public class ServiceRequestIT {
         Entity entityToBeCorrupted = null;
         try {
             entityToBeCorrupted = entityManager.create( collectionName, userInfo );
-            fail();
-        }catch(DuplicateUniquePropertyExistsException dup){
-
+        }catch(Exception e){
+            fail("Create call should have worked");
         }
-        catch(Exception e){
-            fail("shouldn't throw something else i think");
-        }
-
-
-        entityToBeCorrupted = entityManager.create( collectionName,userInfo );
 
         assertNotNull( entityToBeCorrupted );
         assertEquals( username,( ( User ) entityToBeCorrupted ).getUsername() );
@@ -230,17 +226,92 @@ public class ServiceRequestIT {
             throw e;
         }
 
-        //should return null since we have duplicate alias. Will Cause index corruptions to be thrown.
-        //TODO: fix the below so that it fails everytime.
-        //50/50 chance to succeed or fail
-        //        assertNull( entityManager
-        //                .get( entityManager.getAlias( applicationInfo.getId(), collectionName, username ).getUuid() ) );
-
-
-
         //verifies it works now.
         assertNotNull( entityManager
                 .get( entityManager.getAlias( applicationInfo.getId(), collectionName, username ).getUuid() ) );
 
     }
+
+    //For this test you need to insert a dummy key with a dummy column that leads to nowhere
+    //then run the unique index cleanup.
+    //checks for bug when only column doesn't exist make sure to delete the row as well.
+    @Test
+    public void testRepairOfMultipleEntitiesAndRemainingEntities() throws Exception{
+        String rand = RandomStringUtils.randomAlphanumeric( 10 );
+
+        int numberOfEntitiesToCreate = 1000;
+
+        String orgName = "org_" + rand;
+        String appName = "app_" +rand;
+        String username = "username_" + rand;
+        String adminUsername = "admin_"+rand;
+        String email = username+"@derp.com";
+        String password = username;
+
+        String collectionName = "users";
+
+
+        OrganizationOwnerInfo organizationOwnerInfo = setup.getMgmtSvc().createOwnerAndOrganization( orgName,adminUsername,adminUsername,email,password );
+
+        ApplicationInfo applicationInfo = setup.getMgmtSvc().createApplication( organizationOwnerInfo.getOrganization().getUuid(),appName );
+
+        EntityManager entityManager = setup.getEmf().getEntityManager( applicationInfo.getId() );
+
+        String[] usernames = new String[numberOfEntitiesToCreate];
+        Entity[] entities = new Entity[numberOfEntitiesToCreate];
+
+        int index = 0;
+        while(index < numberOfEntitiesToCreate) {
+
+            usernames[index]=username+index;
+
+            Map<String, Object> userInfo = new HashMap<String, Object>();
+            userInfo.put( "username", usernames[index] );
+
+            CassandraService cass = setup.getCassSvc();
+
+            entities[index] = entityManager.create( collectionName,userInfo );
+
+            Object key = CassandraPersistenceUtils.key( applicationInfo.getId(), collectionName, "username", usernames[index] );
+
+            Keyspace ko = cass.getApplicationKeyspace( applicationInfo.getId() );
+            Mutator<ByteBuffer> m = createMutator( ko, be );
+
+            UUID testEntityUUID = UUIDUtils.newTimeUUID();
+            //this below calll should make the column family AND the column name
+            addInsertToMutator( m, ENTITY_UNIQUE, key, testEntityUUID, 0, createTimestamp() );
+
+            m.execute();
+            index++;
+
+            //the below works but not needed for this test.
+            //assertNull( entityManager.getAlias("user",username));
+
+            //verify that we cannot recreate the entity due to duplicate unique property exception
+            Entity entityToBeCorrupted = null;
+            try {
+                entityToBeCorrupted = entityManager.create( collectionName, userInfo );
+                fail();
+            }catch(DuplicateUniquePropertyExistsException dup){
+
+            }
+            catch(Exception e){
+                fail("shouldn't throw something else i think");
+            }
+
+        }
+
+
+        for(String user:usernames ) {
+            Map<String, Object> userInfo = new HashMap<String, Object>();
+            userInfo.put( "username", user);
+
+
+            EntityRef entityRef = entityManager.getAlias( collectionName,user );
+
+            Entity entityToBeCorrupted = entityManager.get( entityRef );
+            assertNotNull( entityToBeCorrupted );
+            assertEquals( user, ( ( User ) entityToBeCorrupted ).getUsername() );
+        }
+    }
 }