diff --git a/priam/src/main/java/com/netflix/priam/PriamServer.java b/priam/src/main/java/com/netflix/priam/PriamServer.java index 69d0cd811..1c8b772f2 100644 --- a/priam/src/main/java/com/netflix/priam/PriamServer.java +++ b/priam/src/main/java/com/netflix/priam/PriamServer.java @@ -22,6 +22,7 @@ import com.netflix.priam.backup.BackupService; import com.netflix.priam.backupv2.BackupV2Service; import com.netflix.priam.cluster.management.ClusterManagementService; +import com.netflix.priam.config.IBackupRestoreConfig; import com.netflix.priam.config.IConfiguration; import com.netflix.priam.config.PriamConfigurationPersister; import com.netflix.priam.defaultimpl.ICassandraProcess; @@ -42,6 +43,7 @@ public class PriamServer implements IService { private final PriamScheduler scheduler; private final IConfiguration config; + private final IBackupRestoreConfig backupRestoreConfig; private final InstanceIdentity instanceIdentity; private final Sleeper sleeper; private final ICassandraProcess cassProcess; @@ -56,6 +58,7 @@ public class PriamServer implements IService { @Inject public PriamServer( IConfiguration config, + IBackupRestoreConfig backupRestoreConfig, PriamScheduler scheduler, InstanceIdentity id, Sleeper sleeper, @@ -66,6 +69,7 @@ public PriamServer( CassandraTunerService cassandraTunerService, ClusterManagementService clusterManagementService) { this.config = config; + this.backupRestoreConfig = backupRestoreConfig; this.scheduler = scheduler; this.instanceIdentity = id; this.sleeper = sleeper; @@ -111,25 +115,48 @@ public void scheduleService() throws Exception { UpdateSecuritySettings.getTimer(instanceIdentity)); } - // Set up cassandra tuning. - cassandraTunerService.scheduleService(); + // Set up the background configuration dumping thread + scheduleTask( + scheduler, + PriamConfigurationPersister.class, + PriamConfigurationPersister.getTimer(config)); + + boolean shouldStartCassandra = false; - // Determine if we need to restore from backup else start cassandra. - if (restoreContext.isRestoreEnabled()) { + // Determine if we need to restore from backup. + if (restoreContext.isRestoreEnabled(config, instanceIdentity.getInstanceInfo())) { restoreContext.restore(); - } else { // no restores needed - logger.info("No restore needed, task not scheduled"); - if (!config.doesCassandraStartManually()) cassProcess.start(true); // Start cassandra. - else - logger.info( - "config.doesCassandraStartManually() is set to True, hence Cassandra needs to be started manually ..."); + // Start cassandra only if restore is successful. + shouldStartCassandra = true; + } else { + if (instanceIdentity.isReplace() + && backupRestoreConfig.enableBypassCassandraStreaming()) { + logger.info("Trying to download data instead of streaming from Cassandra."); + try { + restoreContext.restore(); + instanceIdentity.setReplacedIp(""); + } catch (Exception e) { + logger.error( + "Error while trying to rebuild the node from backup. Maybe backup not available or disk full? Trying normal path of cassandra streaming"); + // Clean the data folder. + SystemUtils.cleanupDir(config.getDataFileLocation(), null); + } finally { + shouldStartCassandra = true; + } + } else { + // no restores needed + logger.info("No restore needed, task not scheduled"); + shouldStartCassandra = true; + } } - /* - * Run the delayed task (after 10 seconds) to Monitor Cassandra - * If Restore option is chosen, then Running Cassandra instance is stopped - * Hence waiting for Cassandra to stop - */ + // Tune Cassandra. + cassandraTunerService.scheduleService(); + + // Start Cassandra. + if (shouldStartCassandra) startCassandra(); + + // Run the delayed task (after 10 seconds) to Monitor Cassandra scheduler.addTaskWithDelay( CassandraMonitor.JOBNAME, CassandraMonitor.class, @@ -139,12 +166,6 @@ public void scheduleService() throws Exception { // Set up management services like flush, compactions etc. clusterManagementService.scheduleService(); - // Set up the background configuration dumping thread - scheduleTask( - scheduler, - PriamConfigurationPersister.class, - PriamConfigurationPersister.getTimer(config)); - // Set up V1 Snapshot Service backupService.scheduleService(); @@ -152,6 +173,13 @@ public void scheduleService() throws Exception { backupV2Service.scheduleService(); } + private void startCassandra() throws IOException { + if (!config.doesCassandraStartManually()) cassProcess.start(true); // Start cassandra. + else + logger.info( + "config.doesCassandraStartManually() is set to True, hence Cassandra needs to be started manually ..."); + } + @Override public void updateServicePre() throws Exception {} diff --git a/priam/src/main/java/com/netflix/priam/config/IBackupRestoreConfig.java b/priam/src/main/java/com/netflix/priam/config/IBackupRestoreConfig.java index ac39b6915..5172d81e3 100644 --- a/priam/src/main/java/com/netflix/priam/config/IBackupRestoreConfig.java +++ b/priam/src/main/java/com/netflix/priam/config/IBackupRestoreConfig.java @@ -97,4 +97,18 @@ default int getBackupVerificationSLOInHours() { default boolean enableV2Restore() { return false; } + + /** + * Build the instance from backups by using restore process in case of an instance replacements. + * Note that we prefer this when data size is HUGE. C* streaming is super slow and for instances + * with big data size can lead to C* streaming for multiple days. Note that this is a little bit + * dangerous as you "will" some of the writes accepted by old instance but not uploaded to + * backup file system. Also we do not plan to run local repair on the replaced instance, so data + * will be stale. We hope that repair will take care of the inconsistency. + * + * @return use restore for replacements (bypassing cassandra streaming), if backup is available. + */ + default boolean enableBypassCassandraStreaming() { + return true; + } } diff --git a/priam/src/main/java/com/netflix/priam/identity/InstanceIdentity.java b/priam/src/main/java/com/netflix/priam/identity/InstanceIdentity.java index 5141c1c65..0e978bb40 100644 --- a/priam/src/main/java/com/netflix/priam/identity/InstanceIdentity.java +++ b/priam/src/main/java/com/netflix/priam/identity/InstanceIdentity.java @@ -345,6 +345,7 @@ public String getReplacedIp() { public void setReplacedIp(String replacedIp) { this.replacedIp = replacedIp; if (!replacedIp.isEmpty()) this.isReplace = true; + else this.isReplace = false; } private static boolean isInstanceDummy(PriamInstance instance) { diff --git a/priam/src/main/java/com/netflix/priam/restore/AbstractRestore.java b/priam/src/main/java/com/netflix/priam/restore/AbstractRestore.java index 25a0275d2..b5e363415 100644 --- a/priam/src/main/java/com/netflix/priam/restore/AbstractRestore.java +++ b/priam/src/main/java/com/netflix/priam/restore/AbstractRestore.java @@ -26,8 +26,6 @@ import com.netflix.priam.defaultimpl.ICassandraProcess; import com.netflix.priam.health.InstanceState; import com.netflix.priam.identity.InstanceIdentity; -import com.netflix.priam.identity.config.InstanceInfo; -import com.netflix.priam.scheduler.Task; import com.netflix.priam.utils.*; import java.io.File; import java.io.IOException; @@ -38,19 +36,16 @@ import java.util.*; import java.util.concurrent.Future; import javax.inject.Named; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * A means to perform a restore. This class contains the following characteristics: - It is agnostic - * to the source type of the restore, this is determine by the injected IBackupFileSystem. - This - * class can be scheduled, i.e. it is a "Task". - When this class is executed, it uses its own - * thread pool to execute the restores. + * to the source type of the restore, this is determine by the injected IBackupFileSystem. When this + * class is executed, it uses its own thread pool to restore the restores. */ -public abstract class AbstractRestore extends Task implements IRestoreStrategy { +public abstract class AbstractRestore implements IRestoreStrategy { private static final Logger logger = LoggerFactory.getLogger(AbstractRestore.class); private static final String JOBNAME = "AbstractRestore"; private static final String SYSTEM_KEYSPACE = "system"; @@ -65,6 +60,7 @@ public abstract class AbstractRestore extends Task implements IRestoreStrategy { private final InstanceState instanceState; private final MetaData metaData; private final IPostRestoreHook postRestoreHook; + private final IConfiguration config; @Inject @Named("v1") @@ -88,7 +84,7 @@ public AbstractRestore( MetaData metaData, InstanceState instanceState, IPostRestoreHook postRestoreHook) { - super(config); + this.config = config; this.fs = fs; this.sleeper = sleeper; this.pathProvider = pathProvider; @@ -103,14 +99,6 @@ public AbstractRestore( this.postRestoreHook = postRestoreHook; } - public static final boolean isRestoreEnabled(IConfiguration conf, InstanceInfo instanceInfo) { - boolean isRestoreMode = StringUtils.isNotBlank(conf.getRestoreSnapshot()); - boolean isBackedupRac = - (CollectionUtils.isEmpty(conf.getBackupRacs()) - || conf.getBackupRacs().contains(instanceInfo.getRac())); - return (isRestoreMode && isBackedupRac); - } - public void setRestoreConfiguration(String restoreIncludeCFList, String restoreExcludeCFList) { backupRestoreUtil.setFilters(restoreIncludeCFList, restoreExcludeCFList); } @@ -171,9 +159,7 @@ private void stopCassProcess() throws IOException { } @Override - public void execute() throws Exception { - if (!isRestoreEnabled(config, instanceIdentity.getInstanceInfo())) return; - + public void restore() throws Exception { logger.info("Starting restore for {}", config.getRestoreSnapshot()); final DateUtil.DateRange dateRange = new DateUtil.DateRange(config.getRestoreSnapshot()); new RetryableCallable() { @@ -280,12 +266,6 @@ public void restore(DateUtil.DateRange dateRange) throws Exception { // Declare restore as finished. instanceState.getRestoreStatus().setExecutionEndTime(LocalDateTime.now()); instanceState.setRestoreStatus(Status.FINISHED); - - // Start cassandra if restore is successful. - if (!config.doesCassandraStartManually()) cassProcess.start(true); - else - logger.info( - "config.doesCassandraStartManually() is set to True, hence Cassandra needs to be started manually ..."); } catch (Exception e) { instanceState.setRestoreStatus(Status.FAILED); instanceState.getRestoreStatus().setExecutionEndTime(LocalDateTime.now()); diff --git a/priam/src/main/java/com/netflix/priam/restore/AwsCrossAccountCryptographyRestoreStrategy.java b/priam/src/main/java/com/netflix/priam/restore/AwsCrossAccountCryptographyRestoreStrategy.java index 010648b78..353500d62 100755 --- a/priam/src/main/java/com/netflix/priam/restore/AwsCrossAccountCryptographyRestoreStrategy.java +++ b/priam/src/main/java/com/netflix/priam/restore/AwsCrossAccountCryptographyRestoreStrategy.java @@ -27,8 +27,6 @@ import com.netflix.priam.defaultimpl.ICassandraProcess; import com.netflix.priam.health.InstanceState; import com.netflix.priam.identity.InstanceIdentity; -import com.netflix.priam.scheduler.SimpleTimer; -import com.netflix.priam.scheduler.TaskTimer; import com.netflix.priam.utils.Sleeper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -78,9 +76,4 @@ public AwsCrossAccountCryptographyRestoreStrategy( instanceState, postRestoreHook); } - - /** @return a timer used by the scheduler to determine when "this" should be run. */ - public static TaskTimer getTimer() { - return new SimpleTimer(JOBNAME); - } } diff --git a/priam/src/main/java/com/netflix/priam/restore/EncryptedRestoreStrategy.java b/priam/src/main/java/com/netflix/priam/restore/EncryptedRestoreStrategy.java index fdef4f4ad..c2be03594 100755 --- a/priam/src/main/java/com/netflix/priam/restore/EncryptedRestoreStrategy.java +++ b/priam/src/main/java/com/netflix/priam/restore/EncryptedRestoreStrategy.java @@ -27,8 +27,6 @@ import com.netflix.priam.defaultimpl.ICassandraProcess; import com.netflix.priam.health.InstanceState; import com.netflix.priam.identity.InstanceIdentity; -import com.netflix.priam.scheduler.SimpleTimer; -import com.netflix.priam.scheduler.TaskTimer; import com.netflix.priam.utils.Sleeper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -73,11 +71,4 @@ public EncryptedRestoreStrategy( instanceState, postRestoreHook); } - - /* - * @return a timer used by the scheduler to determine when "this" should be run. - */ - public static TaskTimer getTimer() { - return new SimpleTimer(JOBNAME); - } } diff --git a/priam/src/main/java/com/netflix/priam/restore/GoogleCryptographyRestoreStrategy.java b/priam/src/main/java/com/netflix/priam/restore/GoogleCryptographyRestoreStrategy.java index 1c0fc9d79..c7b17a04d 100755 --- a/priam/src/main/java/com/netflix/priam/restore/GoogleCryptographyRestoreStrategy.java +++ b/priam/src/main/java/com/netflix/priam/restore/GoogleCryptographyRestoreStrategy.java @@ -27,8 +27,6 @@ import com.netflix.priam.defaultimpl.ICassandraProcess; import com.netflix.priam.health.InstanceState; import com.netflix.priam.identity.InstanceIdentity; -import com.netflix.priam.scheduler.SimpleTimer; -import com.netflix.priam.scheduler.TaskTimer; import com.netflix.priam.utils.Sleeper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -70,9 +68,4 @@ public GoogleCryptographyRestoreStrategy( instanceState, postRestoreHook); } - - /** @return a timer used by the scheduler to determine when "this" should be run. */ - public static TaskTimer getTimer() { - return new SimpleTimer(JOBNAME); - } } diff --git a/priam/src/main/java/com/netflix/priam/restore/IRestoreStrategy.java b/priam/src/main/java/com/netflix/priam/restore/IRestoreStrategy.java index 1da3a7677..f07639ebc 100755 --- a/priam/src/main/java/com/netflix/priam/restore/IRestoreStrategy.java +++ b/priam/src/main/java/com/netflix/priam/restore/IRestoreStrategy.java @@ -17,5 +17,7 @@ * A means to restore C* files from various source types (e.g. Google, AWS bucket whose objects are not owned by the current IAM role), and encrypted / non-encrypted data. */ public interface IRestoreStrategy { - // public void restore(Date startTime, Date endTime) throws Exception; + void restore() throws Exception; + + String getName(); } diff --git a/priam/src/main/java/com/netflix/priam/restore/Restore.java b/priam/src/main/java/com/netflix/priam/restore/Restore.java index ac0a27f66..72f1f0f90 100644 --- a/priam/src/main/java/com/netflix/priam/restore/Restore.java +++ b/priam/src/main/java/com/netflix/priam/restore/Restore.java @@ -27,8 +27,6 @@ import com.netflix.priam.defaultimpl.ICassandraProcess; import com.netflix.priam.health.InstanceState; import com.netflix.priam.identity.InstanceIdentity; -import com.netflix.priam.scheduler.SimpleTimer; -import com.netflix.priam.scheduler.TaskTimer; import com.netflix.priam.utils.Sleeper; import java.io.File; import java.nio.file.Path; @@ -76,10 +74,6 @@ protected final Future downloadFile( Paths.get(path.getRemotePath()), Paths.get(restoreLocation.getAbsolutePath()), 5); } - public static TaskTimer getTimer() { - return new SimpleTimer(JOBNAME); - } - @Override public String getName() { return JOBNAME; diff --git a/priam/src/main/java/com/netflix/priam/restore/RestoreContext.java b/priam/src/main/java/com/netflix/priam/restore/RestoreContext.java index ba54a819d..4faca69ad 100755 --- a/priam/src/main/java/com/netflix/priam/restore/RestoreContext.java +++ b/priam/src/main/java/com/netflix/priam/restore/RestoreContext.java @@ -15,8 +15,9 @@ import com.google.inject.Inject; import com.netflix.priam.config.IConfiguration; -import com.netflix.priam.scheduler.PriamScheduler; +import com.netflix.priam.identity.config.InstanceInfo; import com.netflix.priam.scheduler.UnsupportedTypeException; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,62 +26,77 @@ * At run-time, determine the source type to restore from. */ public class RestoreContext { - private final PriamScheduler scheduler; private final IConfiguration config; + private final IRestoreStrategy restore; + private final IRestoreStrategy encryptedRestoreStrategy; + private final IRestoreStrategy awsCrossAccountCryptographyRestoreStrategy; + private final IRestoreStrategy googleCryptographyRestoreStrategy; private static final Logger logger = LoggerFactory.getLogger(RestoreContext.class); @Inject - public RestoreContext(IConfiguration config, PriamScheduler scheduler) { + public RestoreContext( + IConfiguration config, + Restore restore, + EncryptedRestoreStrategy encryptedRestoreStrategy, + AwsCrossAccountCryptographyRestoreStrategy awsCrossAccountCryptographyRestoreStrategy, + GoogleCryptographyRestoreStrategy googleCryptographyRestoreStrategy) { this.config = config; - this.scheduler = scheduler; + this.restore = restore; + this.awsCrossAccountCryptographyRestoreStrategy = + awsCrossAccountCryptographyRestoreStrategy; + this.encryptedRestoreStrategy = encryptedRestoreStrategy; + this.googleCryptographyRestoreStrategy = googleCryptographyRestoreStrategy; } - public boolean isRestoreEnabled() { - return !StringUtils.isEmpty(config.getRestoreSnapshot()); + /** + * Find if restore is required based on input set. + * + * @param conf configuration parameters. + * @param instanceInfo InstanceInfo to find if backup was enabled on this rac. + * @return boolean value indicating if restore is feasible/enabled. + */ + public static boolean isRestoreEnabled(IConfiguration conf, InstanceInfo instanceInfo) { + boolean isRestoreMode = StringUtils.isNotBlank(conf.getRestoreSnapshot()); + boolean isBackedupRac = + (CollectionUtils.isEmpty(conf.getBackupRacs()) + || conf.getBackupRacs().contains(instanceInfo.getRac())); + return (isRestoreMode && isBackedupRac); } + /** + * Perform the restore based on the configuration provided. Note that this method do not check + * if restore is required or not. We leave that decision to the caller. + * + * @throws Exception + */ public void restore() throws Exception { - if (!isRestoreEnabled()) return; + IRestoreStrategy restoreStrategy = getRestoreStrategy(); + if (restoreStrategy != null) { + logger.info("Restore using {}", restoreStrategy.getClass()); + restoreStrategy.restore(); + } + } - // Restore is required. + private IRestoreStrategy getRestoreStrategy() throws Exception { if (StringUtils.isEmpty(config.getRestoreSourceType()) && !config.isRestoreEncrypted()) { // Restore is needed and it will be done from the primary AWS account - scheduler.addTask( - Restore.JOBNAME, - Restore.class, - Restore.getTimer()); // restore from the AWS primary acct - logger.info("Scheduled task " + Restore.JOBNAME); + return restore; } else if (config.isRestoreEncrypted()) { SourceType sourceType = SourceType.lookup(config.getRestoreSourceType(), true, false); if (sourceType == null) { - scheduler.addTask( - EncryptedRestoreStrategy.JOBNAME, - EncryptedRestoreStrategy.class, - EncryptedRestoreStrategy.getTimer()); - logger.info("Scheduled task " + Restore.JOBNAME); - return; + return encryptedRestoreStrategy; } switch (sourceType) { case AWSCROSSACCT: - scheduler.addTask( - AwsCrossAccountCryptographyRestoreStrategy.JOBNAME, - AwsCrossAccountCryptographyRestoreStrategy.class, - AwsCrossAccountCryptographyRestoreStrategy.getTimer()); - logger.info( - "Scheduled task " + AwsCrossAccountCryptographyRestoreStrategy.JOBNAME); - break; + return awsCrossAccountCryptographyRestoreStrategy; case GOOGLE: - scheduler.addTask( - GoogleCryptographyRestoreStrategy.JOBNAME, - GoogleCryptographyRestoreStrategy.class, - GoogleCryptographyRestoreStrategy.getTimer()); - logger.info("Scheduled task " + GoogleCryptographyRestoreStrategy.JOBNAME); - break; + return googleCryptographyRestoreStrategy; } } + return null; } enum SourceType { diff --git a/priam/src/main/java/com/netflix/priam/tuner/StandardTuner.java b/priam/src/main/java/com/netflix/priam/tuner/StandardTuner.java index e45e3a9dd..f80b3cc9b 100644 --- a/priam/src/main/java/com/netflix/priam/tuner/StandardTuner.java +++ b/priam/src/main/java/com/netflix/priam/tuner/StandardTuner.java @@ -16,10 +16,11 @@ import com.google.common.collect.Lists; import com.google.inject.Inject; import com.netflix.priam.backup.IncrementalBackup; +import com.netflix.priam.backup.Status; import com.netflix.priam.config.IBackupRestoreConfig; import com.netflix.priam.config.IConfiguration; +import com.netflix.priam.health.InstanceState; import com.netflix.priam.identity.config.InstanceInfo; -import com.netflix.priam.restore.Restore; import java.io.*; import java.util.HashMap; import java.util.List; @@ -36,15 +37,18 @@ public class StandardTuner implements ICassandraTuner { protected final IConfiguration config; protected final IBackupRestoreConfig backupRestoreConfig; private final InstanceInfo instanceInfo; + private final InstanceState instanceState; @Inject public StandardTuner( IConfiguration config, IBackupRestoreConfig backupRestoreConfig, - InstanceInfo instanceInfo) { + InstanceInfo instanceInfo, + InstanceState instanceState) { this.config = config; this.backupRestoreConfig = backupRestoreConfig; this.instanceInfo = instanceInfo; + this.instanceState = instanceState; } public void writeAllProperties(String yamlLocation, String hostname, String seedProvider) @@ -63,11 +67,13 @@ public void writeAllProperties(String yamlLocation, String hostname, String seed map.put("native_transport_port", config.getNativeTransportPort()); map.put("listen_address", hostname); map.put("rpc_address", hostname); + // Dont bootstrap in restore mode - if (!Restore.isRestoreEnabled(config, instanceInfo)) { - map.put("auto_bootstrap", config.getAutoBoostrap()); - } else { + if (instanceState.getRestoreStatus() != null + && instanceState.getRestoreStatus().getStatus() == Status.FINISHED) { map.put("auto_bootstrap", false); + } else { + map.put("auto_bootstrap", config.getAutoBoostrap()); } map.put("saved_caches_directory", config.getCacheLocation()); diff --git a/priam/src/main/java/com/netflix/priam/tuner/dse/DseTuner.java b/priam/src/main/java/com/netflix/priam/tuner/dse/DseTuner.java index 047d06052..3ed72fafb 100644 --- a/priam/src/main/java/com/netflix/priam/tuner/dse/DseTuner.java +++ b/priam/src/main/java/com/netflix/priam/tuner/dse/DseTuner.java @@ -19,6 +19,7 @@ import com.google.inject.Inject; import com.netflix.priam.config.IBackupRestoreConfig; import com.netflix.priam.config.IConfiguration; +import com.netflix.priam.health.InstanceState; import com.netflix.priam.identity.config.InstanceInfo; import com.netflix.priam.tuner.StandardTuner; import java.io.FileReader; @@ -46,8 +47,9 @@ public DseTuner( IBackupRestoreConfig backupRestoreConfig, IDseConfiguration dseConfig, IAuditLogTuner auditLogTuner, - InstanceInfo instanceInfo) { - super(config, backupRestoreConfig, instanceInfo); + InstanceInfo instanceInfo, + InstanceState instanceState) { + super(config, backupRestoreConfig, instanceInfo, instanceState); this.dseConfig = dseConfig; this.auditLogTuner = auditLogTuner; } diff --git a/priam/src/main/resources/Priam.properties b/priam/src/main/resources/Priam.properties index 741c89886..96ec17f6f 100644 --- a/priam/src/main/resources/Priam.properties +++ b/priam/src/main/resources/Priam.properties @@ -1,4 +1 @@ priam.clustername=cass_cluster -priam.direct.memory.size.m1.large=1G -priam.heap.newgen.size.m1.large=2G -priam.heap.size.m1.large=4G \ No newline at end of file diff --git a/priam/src/test/java/com/netflix/priam/tuner/StandardTunerTest.java b/priam/src/test/java/com/netflix/priam/tuner/StandardTunerTest.java index ada2d7cf5..7567bf341 100644 --- a/priam/src/test/java/com/netflix/priam/tuner/StandardTunerTest.java +++ b/priam/src/test/java/com/netflix/priam/tuner/StandardTunerTest.java @@ -21,10 +21,12 @@ import com.google.common.io.Files; import com.google.inject.Guice; +import com.google.inject.Injector; import com.netflix.priam.backup.BRTestModule; import com.netflix.priam.config.BackupRestoreConfig; import com.netflix.priam.config.FakeConfiguration; import com.netflix.priam.config.IBackupRestoreConfig; +import com.netflix.priam.health.InstanceState; import com.netflix.priam.identity.config.InstanceInfo; import java.io.File; import java.io.FileInputStream; @@ -47,15 +49,16 @@ public class StandardTunerTest { private final StandardTuner tuner; private final InstanceInfo instanceInfo; + private final InstanceState instanceState; private final IBackupRestoreConfig backupRestoreConfig; private final File target = new File("/tmp/priam_test.yaml"); public StandardTunerTest() { - this.tuner = Guice.createInjector(new BRTestModule()).getInstance(StandardTuner.class); - this.instanceInfo = - Guice.createInjector(new BRTestModule()).getInstance(InstanceInfo.class); - this.backupRestoreConfig = - Guice.createInjector(new BRTestModule()).getInstance(BackupRestoreConfig.class); + Injector injector = Guice.createInjector(new BRTestModule()); + this.tuner = injector.getInstance(StandardTuner.class); + this.instanceInfo = injector.getInstance(InstanceInfo.class); + this.backupRestoreConfig = injector.getInstance(BackupRestoreConfig.class); + this.instanceState = injector.getInstance(InstanceState.class); } @Test @@ -137,7 +140,8 @@ public void addExtraParams() throws Exception { new StandardTuner( new TunerConfiguration(extraConfigParam, extraParamValues), backupRestoreConfig, - instanceInfo); + instanceInfo, + instanceState); Files.copy(new File("src/main/resources/incr-restore-cassandra.yaml"), target); tuner.writeAllProperties(target.getAbsolutePath(), "your_host", "YourSeedProvider");