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 2015/11/17 23:05:21 UTC
[26/39] usergrid git commit: Added fix for rows that contain
duplicate valid existing columns.
Added fix for rows that contain duplicate valid existing columns.
Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/3d5ae464
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/3d5ae464
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/3d5ae464
Branch: refs/heads/1.x
Commit: 3d5ae464766a12b3fac1d82b67da667ef28d17fd
Parents: 00171f0
Author: George Reyes <gr...@apache.org>
Authored: Tue Nov 10 14:49:40 2015 -0800
Committer: George Reyes <gr...@apache.org>
Committed: Tue Nov 10 14:49:40 2015 -0800
----------------------------------------------------------------------
.../cassandra/EntityManagerImpl.java | 52 +++++++++++++++-----
1 file changed, 41 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/usergrid/blob/3d5ae464/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 ecd0f0a..76cb6d7 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
@@ -559,27 +559,45 @@ public class EntityManagerImpl implements EntityManager {
+ "property {} with value {}",
new Object[] { ownerEntityId, collectionNameInternal, propertyName, propertyValue } );
- //retreive up to 100 columns
+ //retrieve up to 100 columns
List<HColumn<ByteBuffer, ByteBuffer>> indexingColumns = cass.getColumns( cass.getApplicationKeyspace( applicationId ), ENTITY_UNIQUE, key, null, null, 100,
false );
+ Entity[] entities = new Entity[cols.size()];
+ int index = 0;
- //go through it column
for ( HColumn<ByteBuffer, ByteBuffer> col : indexingColumns ) {
UUID indexCorruptionUuid = ue.fromByteBuffer( col.getName());
- if (get( indexCorruptionUuid ) == null ) {
- UUID timestampUuid = newTimeUUID();
- long timestamp = getTimestampInMicros( timestampUuid );
- Keyspace ko = cass.getApplicationKeyspace( ownerEntityId );
- Mutator<ByteBuffer> mutator = createMutator( ko, be );
-
- addDeleteToMutator( mutator, ENTITY_UNIQUE, key, indexCorruptionUuid, timestamp );
- mutator.execute();
+
+ entities[index] = get(indexCorruptionUuid);
+
+ if (entities[index] == null ) {
+ deleteUniqueColumn( ownerEntityId, key, indexCorruptionUuid );
cols.remove( col );
}
else{
-
+ index++;
+ }
+ }
+ //this means that the same unique rowkey has two values associated with it
+ if(entities[0]!=null && entities[1]!=null){
+ Entity mostRecentEntity = entities[0];
+ for(Entity entity: entities){
+ if(mostRecentEntity.getModified() > entity.getModified()){
+ deleteEntity( entity.getUuid() );
+ logger.info( "Deleting " + entity.getUuid().toString()
+ + " because it shares older unique value with: " + propertyValue );
+ }
+ else if (mostRecentEntity.getModified() < entity.getModified()){
+ logger.info("Deleting "+mostRecentEntity.getUuid().toString()+" because it shares older unique value with: "+propertyValue);
+ deleteEntity( mostRecentEntity.getUuid() );
+ mostRecentEntity = entity;
+ }
+ else if (mostRecentEntity.getModified() == entity.getModified() && !mostRecentEntity.getUuid().equals( entity.getUuid() )){
+ logger.info("Entities with unique value: "+propertyValue+" has two or more entities with the same modified time."
+ + "Please manually resolve by query or changing names. ");
+ }
}
}
}
@@ -603,6 +621,18 @@ public class EntityManagerImpl implements EntityManager {
}
+ private void deleteUniqueColumn( final UUID ownerEntityId, final Object key, final UUID indexCorruptionUuid )
+ throws Exception {
+ UUID timestampUuid = newTimeUUID();
+ long timestamp = getTimestampInMicros( timestampUuid );
+ Keyspace ko = cass.getApplicationKeyspace( ownerEntityId );
+ Mutator<ByteBuffer> mutator = createMutator( ko, be );
+
+ addDeleteToMutator( mutator, ENTITY_UNIQUE, key, indexCorruptionUuid, timestamp );
+ mutator.execute();
+ }
+
+
/** Add this unique index to the delete */
private void uniquePropertyDelete( Mutator<ByteBuffer> m, String collectionName, String entityType,
String propertyName, Object propertyValue, UUID entityId, long timestamp )