Skip to content
This repository has been archived by the owner on Jan 5, 2022. It is now read-only.

Commit

Permalink
Updated graph migration
Browse files Browse the repository at this point in the history
  • Loading branch information
Todd Nine committed Mar 3, 2015
1 parent a55c784 commit fa69be8
Show file tree
Hide file tree
Showing 18 changed files with 464 additions and 273 deletions.
Expand Up @@ -28,9 +28,9 @@
* Versions of data as they exist across our system * Versions of data as they exist across our system
*/ */
public enum CollectionDataVersions{ public enum CollectionDataVersions{
ZERO(0), INITIAL(0),
ONE(1), BUFFER_SHORT_FIX(1),
TWO(2); LOG_REMOVAL(2);


private final int version; private final int version;


Expand Down
Expand Up @@ -187,7 +187,7 @@ public Collection<MultiTennantColumnFamilyDefinition> getColumnFamilies() {


@Override @Override
public int getImplementationVersion() { public int getImplementationVersion() {
return 0; throw new UnsupportedOperationException("Not supported in the proxy");
} }
} }


Expand Up @@ -26,7 +26,6 @@
import org.apache.usergrid.persistence.collection.MvccEntity; import org.apache.usergrid.persistence.collection.MvccEntity;
import org.apache.usergrid.persistence.collection.exception.DataCorruptionException; import org.apache.usergrid.persistence.collection.exception.DataCorruptionException;
import org.apache.usergrid.persistence.collection.serialization.SerializationFig; import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
import org.apache.usergrid.persistence.core.astyanax.CassandraFig; import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer; import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;
import org.apache.usergrid.persistence.core.astyanax.MultiTennantColumnFamily; import org.apache.usergrid.persistence.core.astyanax.MultiTennantColumnFamily;
Expand Down Expand Up @@ -90,7 +89,7 @@ protected MultiTennantColumnFamily<ScopedRowKey<CollectionPrefixedKey<Id>>, UUID


@Override @Override
public int getImplementationVersion() { public int getImplementationVersion() {
return CollectionDataVersions.ZERO.getVersion(); return CollectionDataVersions.INITIAL.getVersion();
} }




Expand Down
Expand Up @@ -93,7 +93,7 @@ protected MultiTennantColumnFamily<ScopedRowKey<CollectionPrefixedKey<Id>>, UUID


@Override @Override
public int getImplementationVersion() { public int getImplementationVersion() {
return CollectionDataVersions.ONE.getVersion(); return CollectionDataVersions.BUFFER_SHORT_FIX.getVersion();
} }




Expand Down
Expand Up @@ -14,8 +14,6 @@


import org.apache.cassandra.db.marshal.BooleanType; import org.apache.cassandra.db.marshal.BooleanType;
import org.apache.cassandra.db.marshal.BytesType; import org.apache.cassandra.db.marshal.BytesType;
import org.apache.cassandra.db.marshal.ReversedType;
import org.apache.cassandra.db.marshal.UUIDType;


import org.apache.usergrid.persistence.collection.CollectionScope; import org.apache.usergrid.persistence.collection.CollectionScope;
import org.apache.usergrid.persistence.collection.EntitySet; import org.apache.usergrid.persistence.collection.EntitySet;
Expand Down Expand Up @@ -44,8 +42,6 @@


import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.smile.SmileFactory; import com.fasterxml.jackson.dataformat.smile.SmileFactory;
import com.fasterxml.uuid.UUIDComparator;
import com.fasterxml.uuid.impl.UUIDUtil;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.google.inject.Inject; import com.google.inject.Inject;
Expand Down Expand Up @@ -383,7 +379,7 @@ private MutationBatch doWrite( final CollectionScope collectionScope, final Id e


@Override @Override
public int getImplementationVersion() { public int getImplementationVersion() {
return CollectionDataVersions.TWO.getVersion(); return CollectionDataVersions.LOG_REMOVAL.getVersion();
} }




Expand Down
Expand Up @@ -35,6 +35,7 @@
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Key; import com.google.inject.Key;
import com.google.inject.Provider; import com.google.inject.Provider;
import com.google.inject.Provides;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import com.google.inject.TypeLiteral; import com.google.inject.TypeLiteral;
import com.google.inject.multibindings.Multibinder; import com.google.inject.multibindings.Multibinder;
Expand Down Expand Up @@ -64,10 +65,6 @@ protected void configure() {
bind( MvccEntitySerializationStrategyV3Impl.class ); bind( MvccEntitySerializationStrategyV3Impl.class );




bind( new TypeLiteral<VersionedMigrationSet<MvccEntitySerializationStrategy>>() {} )
.toProvider( MvccEntitySerializationStrategyProvider.class );


//migrations //migrations
//we want to make sure our generics are retained, so we use a typeliteral //we want to make sure our generics are retained, so we use a typeliteral
Multibinder<DataMigration2<EntityIdScope>> dataMigrationMultibinder = Multibinder<DataMigration2<EntityIdScope>> dataMigrationMultibinder =
Expand Down Expand Up @@ -99,50 +96,36 @@ protected void configure() {
bind( SettingsValidation.class ).asEagerSingleton(); bind( SettingsValidation.class ).asEagerSingleton();
} }


/**
* Configure via explicit declaration the migration path we can follow
* @param v1
* @param v2
* @param v3
* @return
*/
@Singleton
@Inject
@Provides
public VersionedMigrationSet<MvccEntitySerializationStrategy> getVersions(final MvccEntitySerializationStrategyV1Impl v1, final MvccEntitySerializationStrategyV2Impl v2, final MvccEntitySerializationStrategyV3Impl v3){


@Singleton
public static final class MvccEntitySerializationStrategyProvider
implements Provider<VersionedMigrationSet<MvccEntitySerializationStrategy>> {


private final MvccEntitySerializationStrategyV1Impl v1;
private final MvccEntitySerializationStrategyV2Impl v2;
private final MvccEntitySerializationStrategyV3Impl v3;


//we must perform a migration from v1 to v3 in order to maintain consistency
MigrationRelationship<MvccEntitySerializationStrategy> v1Tov3 = new MigrationRelationship<>( v1, v3 );


@Inject //we must migrate from 2 to 3, this is a bridge that must happen to maintain data consistency
public MvccEntitySerializationStrategyProvider( final MvccEntitySerializationStrategyV1Impl v1,
final MvccEntitySerializationStrategyV2Impl v2,
final MvccEntitySerializationStrategyV3Impl v3 ) {
this.v1 = v1;
this.v2 = v2;
this.v3 = v3;
}


MigrationRelationship<MvccEntitySerializationStrategy> v2Tov3 = new MigrationRelationship<>( v2, v3 );


@Override
public VersionedMigrationSet<MvccEntitySerializationStrategy> get() {


//we must perform a migration from v1 to v3 in order to maintain consistency //note that we MUST migrate to v3 before our next migration, if v4 and v5 is implemented we will need a v3->v5 and a v4->v5 set
MigrationRelationship<MvccEntitySerializationStrategy> v1Tov3 = new MigrationRelationship<>( v1, v3 ); MigrationRelationship<MvccEntitySerializationStrategy> current = new MigrationRelationship<MvccEntitySerializationStrategy>( v3, v3 );


//we must migrate from 2 to 3, this is a bridge that must happen to maintain data consistency


MigrationRelationship<MvccEntitySerializationStrategy> v2Tov3 = new MigrationRelationship<>( v2, v3 ); //now create our set of versions
VersionedMigrationSet<MvccEntitySerializationStrategy> set = new VersionedMigrationSet<>( v1Tov3, v2Tov3, current );


return set;


//note that we MUST migrate to v3 before our next migration, if v4 and v5 is implemented we will need a }
// v3->v5 and a v4->v5 set
MigrationRelationship<MvccEntitySerializationStrategy> current =
new MigrationRelationship<MvccEntitySerializationStrategy>( v3, v3 );



//now create our set of versions
VersionedMigrationSet<MvccEntitySerializationStrategy> set =
new VersionedMigrationSet<>( v1Tov3, v2Tov3, current );


return set;
}
}
} }
Expand Up @@ -26,15 +26,10 @@


import java.util.Set; import java.util.Set;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.apache.usergrid.persistence.core.migration.data.DataMigrationException;
import org.apache.usergrid.persistence.core.migration.data.MigrationInfoSerialization; import org.apache.usergrid.persistence.core.migration.data.MigrationInfoSerialization;
import org.apache.usergrid.persistence.core.migration.data.newimpls.AbstractMigrationPlugin;
import org.apache.usergrid.persistence.core.migration.data.newimpls.DataMigration2; import org.apache.usergrid.persistence.core.migration.data.newimpls.DataMigration2;
import org.apache.usergrid.persistence.core.migration.data.newimpls.MigrationDataProvider; import org.apache.usergrid.persistence.core.migration.data.newimpls.MigrationDataProvider;
import org.apache.usergrid.persistence.core.migration.data.newimpls.MigrationPlugin;
import org.apache.usergrid.persistence.core.migration.data.newimpls.ProgressObserver;


import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton; import com.google.inject.Singleton;
Expand All @@ -44,25 +39,17 @@
* Migration plugin for the collection module * Migration plugin for the collection module
*/ */
@Singleton @Singleton
public class CollectionMigrationPlugin implements MigrationPlugin { public class CollectionMigrationPlugin extends AbstractMigrationPlugin<EntityIdScope> {


private static final Logger LOG = LoggerFactory.getLogger( CollectionMigrationPlugin.class );


public static final String PLUGIN_NAME = "collections-entity-data"; public static final String PLUGIN_NAME = "collections-entity-data";


private final Set<DataMigration2<EntityIdScope>> entityDataMigrations;
private final MigrationDataProvider<EntityIdScope> entityIdScopeDataMigrationProvider;
private final MigrationInfoSerialization migrationInfoSerialization;




@Inject @Inject
public CollectionMigrationPlugin( final Set<DataMigration2<EntityIdScope>> entityDataMigrations, public CollectionMigrationPlugin( final Set<DataMigration2<EntityIdScope>> entityDataMigrations,
final MigrationDataProvider<EntityIdScope> entityIdScopeDataMigrationProvider, final MigrationDataProvider<EntityIdScope> entityIdScopeDataMigrationProvider,
final MigrationInfoSerialization migrationInfoSerialization ) { final MigrationInfoSerialization migrationInfoSerialization ) {
this.entityDataMigrations = entityDataMigrations; super( entityDataMigrations, entityIdScopeDataMigrationProvider, migrationInfoSerialization );
this.entityIdScopeDataMigrationProvider = entityIdScopeDataMigrationProvider;
this.migrationInfoSerialization = migrationInfoSerialization;
} }




Expand All @@ -72,68 +59,4 @@ public String getName() {
} }




@Override
public void run( final ProgressObserver observer ) {

//run until complete
while(runMigration( observer )){
LOG.info( "Migration complete, checking for next run" );
}

}


@Override
public int getMaxVersion() {

int max = 0;

for(DataMigration2<EntityIdScope> entityMigration: entityDataMigrations){
max = Math.max( max, entityMigration.getMaxVersion() );
}

return max;
}


/**
* Try to run the migration
*
* @return True if we ran a migration
*/
private boolean runMigration( final ProgressObserver po ) {
DataMigration2<EntityIdScope> migrationToExecute = null;


final int version = migrationInfoSerialization.getVersion( PLUGIN_NAME );

for ( DataMigration2<EntityIdScope> entityMigration : entityDataMigrations ) {
if ( entityMigration.supports( version ) ) {
if ( migrationToExecute != null ) {
throw new DataMigrationException(
"Two migrations attempted to migration the same version, this is not allowed. Class '"
+ migrationToExecute.getClass().getName() + "' and class '" + entityMigration
.getClass().getName()
+ "' both support this version. This means something is wired incorrectly" );
}

migrationToExecute = entityMigration;
}
}

if(migrationToExecute == null){
LOG.info( "No migrations found to execute" );
return false;
}

//run the migration
final int newSystemVersion = migrationToExecute.migrate( version, entityIdScopeDataMigrationProvider, po );

migrationInfoSerialization.setVersion( PLUGIN_NAME, newSystemVersion );

//signal we've run a migration and return
return true;


}
} }
Expand Up @@ -73,7 +73,6 @@ public class MvccEntityDataMigrationImpl implements DataMigration2<EntityIdScope
private final Keyspace keyspace; private final Keyspace keyspace;
private final VersionedMigrationSet<MvccEntitySerializationStrategy> allVersions; private final VersionedMigrationSet<MvccEntitySerializationStrategy> allVersions;
private final UniqueValueSerializationStrategy uniqueValueSerializationStrategy; private final UniqueValueSerializationStrategy uniqueValueSerializationStrategy;
private final MigrationInfoSerialization migrationInfoSerialization;
private final EntityVersionCleanupFactory entityVersionCleanupFactory; private final EntityVersionCleanupFactory entityVersionCleanupFactory;
private final MvccEntitySerializationStrategyV3Impl mvccEntitySerializationStrategyV3; private final MvccEntitySerializationStrategyV3Impl mvccEntitySerializationStrategyV3;


Expand All @@ -82,14 +81,12 @@ public class MvccEntityDataMigrationImpl implements DataMigration2<EntityIdScope
public MvccEntityDataMigrationImpl( final Keyspace keyspace, public MvccEntityDataMigrationImpl( final Keyspace keyspace,
final VersionedMigrationSet<MvccEntitySerializationStrategy> allVersions, final VersionedMigrationSet<MvccEntitySerializationStrategy> allVersions,
final UniqueValueSerializationStrategy uniqueValueSerializationStrategy, final UniqueValueSerializationStrategy uniqueValueSerializationStrategy,
final MigrationInfoSerialization migrationInfoSerialization,
final EntityVersionCleanupFactory entityVersionCleanupFactory, final EntityVersionCleanupFactory entityVersionCleanupFactory,
final MvccEntitySerializationStrategyV3Impl mvccEntitySerializationStrategyV3 ) { final MvccEntitySerializationStrategyV3Impl mvccEntitySerializationStrategyV3 ) {


this.keyspace = keyspace; this.keyspace = keyspace;
this.allVersions = allVersions; this.allVersions = allVersions;
this.uniqueValueSerializationStrategy = uniqueValueSerializationStrategy; this.uniqueValueSerializationStrategy = uniqueValueSerializationStrategy;
this.migrationInfoSerialization = migrationInfoSerialization;
this.entityVersionCleanupFactory = entityVersionCleanupFactory; this.entityVersionCleanupFactory = entityVersionCleanupFactory;
this.mvccEntitySerializationStrategyV3 = mvccEntitySerializationStrategyV3; this.mvccEntitySerializationStrategyV3 = mvccEntitySerializationStrategyV3;
} }
Expand Down

0 comments on commit fa69be8

Please sign in to comment.