com.hubspot.singularity.data.zkmigrations.ZkDataMigrationRunner Maven / Gradle / Ivy
package com.hubspot.singularity.data.zkmigrations;
import java.util.List;
import javax.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Optional;
import com.google.inject.Inject;
import com.hubspot.mesos.JavaUtils;
import com.hubspot.singularity.data.MetadataManager;
@Singleton
public class ZkDataMigrationRunner {
private static final Logger LOG = LoggerFactory.getLogger(ZkDataMigrationRunner.class);
private final MetadataManager metadataManager;
private final List migrations;
@Inject
public ZkDataMigrationRunner(MetadataManager metadataManager, List migrations) {
this.metadataManager = metadataManager;
this.migrations = migrations;
}
public int checkMigrations() {
final long start = System.currentTimeMillis();
final Optional currentVersion = metadataManager.getZkDataVersion();
final int intVersionNumber = Integer.parseInt(currentVersion.or("0"));
LOG.info("Current ZK data version is {}, known migrations: {}", intVersionNumber, migrations);
int numMigrationsApplied = 0;
int lastAppliedMigration = intVersionNumber;
for (ZkDataMigration migration : migrations) {
if (migration.getMigrationNumber() > intVersionNumber) {
numMigrationsApplied++;
final long migrationStart = System.currentTimeMillis();
LOG.info("Applying {}", migration);
migration.applyMigration();
LOG.info("Applied {} in {}", migration, JavaUtils.duration(migrationStart));
lastAppliedMigration = migration.getMigrationNumber();
}
}
if (lastAppliedMigration > intVersionNumber) {
LOG.info("Setting new version to {}", lastAppliedMigration);
metadataManager.setZkDataVersion(Integer.toString(lastAppliedMigration));
}
LOG.info("Applied {} migrations in {}", numMigrationsApplied, JavaUtils.duration(start));
return numMigrationsApplied;
}
}