Add configurable max initialization attempts (#39)
* Add configurable max initialization attempts * Add maxInitializationAttempts to unit test setup
This commit is contained in:
parent
fdad20aff4
commit
6b474b7390
3 changed files with 24 additions and 4 deletions
|
|
@ -200,6 +200,11 @@ public class KinesisClientLibConfiguration {
|
||||||
*/
|
*/
|
||||||
public static final int DEFAULT_MAX_LIST_SHARDS_RETRY_ATTEMPTS = 50;
|
public static final int DEFAULT_MAX_LIST_SHARDS_RETRY_ATTEMPTS = 50;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of times the {@link Worker} will try to initialize before giving up.
|
||||||
|
*/
|
||||||
|
public static final int DEFAULT_MAX_INITIALIZATION_ATTEMPTS = 20;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private BillingMode billingMode;
|
private BillingMode billingMode;
|
||||||
private String applicationName;
|
private String applicationName;
|
||||||
|
|
@ -266,6 +271,9 @@ public class KinesisClientLibConfiguration {
|
||||||
@Getter
|
@Getter
|
||||||
private int maxListShardsRetryAttempts = DEFAULT_MAX_LIST_SHARDS_RETRY_ATTEMPTS;
|
private int maxListShardsRetryAttempts = DEFAULT_MAX_LIST_SHARDS_RETRY_ATTEMPTS;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private int maxInitializationAttempts = DEFAULT_MAX_INITIALIZATION_ATTEMPTS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
|
|
@ -1458,4 +1466,14 @@ public class KinesisClientLibConfiguration {
|
||||||
this.maxListShardsRetryAttempts = maxListShardsRetryAttempts;
|
this.maxListShardsRetryAttempts = maxListShardsRetryAttempts;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param maxInitializationAttempts Max number of Worker initialization attempts before giving up
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public KinesisClientLibConfiguration withMaxInitializationAttempts(int maxInitializationAttempts) {
|
||||||
|
checkIsValuePositive("maxInitializationAttempts", maxInitializationAttempts);
|
||||||
|
this.maxInitializationAttempts = maxInitializationAttempts;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -94,7 +94,6 @@ public class Worker implements Runnable {
|
||||||
|
|
||||||
// Default configs for periodic shard sync
|
// Default configs for periodic shard sync
|
||||||
private static final int SHARD_SYNC_SLEEP_FOR_PERIODIC_SHARD_SYNC = 0;
|
private static final int SHARD_SYNC_SLEEP_FOR_PERIODIC_SHARD_SYNC = 0;
|
||||||
private static final int MAX_INITIALIZATION_ATTEMPTS = 20;
|
|
||||||
private static final int PERIODIC_SHARD_SYNC_MAX_WORKERS_DEFAULT = 1; //Default for KCL.
|
private static final int PERIODIC_SHARD_SYNC_MAX_WORKERS_DEFAULT = 1; //Default for KCL.
|
||||||
static final long LEASE_TABLE_CHECK_FREQUENCY_MILLIS = 3 * 1000L;
|
static final long LEASE_TABLE_CHECK_FREQUENCY_MILLIS = 3 * 1000L;
|
||||||
static final long MIN_WAIT_TIME_FOR_LEASE_TABLE_CHECK_MILLIS = 1 * 1000L;
|
static final long MIN_WAIT_TIME_FOR_LEASE_TABLE_CHECK_MILLIS = 1 * 1000L;
|
||||||
|
|
@ -661,7 +660,8 @@ public class Worker implements Runnable {
|
||||||
initialize();
|
initialize();
|
||||||
LOG.info("Initialization complete. Starting worker loop.");
|
LOG.info("Initialization complete. Starting worker loop.");
|
||||||
} catch (RuntimeException e1) {
|
} catch (RuntimeException e1) {
|
||||||
LOG.error("Unable to initialize after " + MAX_INITIALIZATION_ATTEMPTS + " attempts. Shutting down.", e1);
|
LOG.error("Unable to initialize after " + config.getMaxInitializationAttempts() + " attempts. " +
|
||||||
|
"Shutting down.", e1);
|
||||||
shutdown();
|
shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -714,7 +714,7 @@ public class Worker implements Runnable {
|
||||||
boolean isDone = false;
|
boolean isDone = false;
|
||||||
Exception lastException = null;
|
Exception lastException = null;
|
||||||
|
|
||||||
for (int i = 0; (!isDone) && (i < MAX_INITIALIZATION_ATTEMPTS); i++) {
|
for (int i = 0; (!isDone) && (i < config.getMaxInitializationAttempts()); i++) {
|
||||||
try {
|
try {
|
||||||
LOG.info("Initialization attempt " + (i + 1));
|
LOG.info("Initialization attempt " + (i + 1));
|
||||||
LOG.info("Initializing LeaseCoordinator");
|
LOG.info("Initializing LeaseCoordinator");
|
||||||
|
|
|
||||||
|
|
@ -197,6 +197,7 @@ public class WorkerTest {
|
||||||
@Before
|
@Before
|
||||||
public void setup() {
|
public void setup() {
|
||||||
config = spy(new KinesisClientLibConfiguration("app", null, null, WORKER_ID));
|
config = spy(new KinesisClientLibConfiguration("app", null, null, WORKER_ID));
|
||||||
|
config.withMaxInitializationAttempts(1);
|
||||||
recordsFetcherFactory = spy(new SimpleRecordsFetcherFactory());
|
recordsFetcherFactory = spy(new SimpleRecordsFetcherFactory());
|
||||||
when(config.getRecordsFetcherFactory()).thenReturn(recordsFetcherFactory);
|
when(config.getRecordsFetcherFactory()).thenReturn(recordsFetcherFactory);
|
||||||
}
|
}
|
||||||
|
|
@ -435,6 +436,8 @@ public class WorkerTest {
|
||||||
String stageName = "testInitializationWorker";
|
String stageName = "testInitializationWorker";
|
||||||
IRecordProcessorFactory recordProcessorFactory = new TestStreamletFactory(null, null);
|
IRecordProcessorFactory recordProcessorFactory = new TestStreamletFactory(null, null);
|
||||||
config = new KinesisClientLibConfiguration(stageName, null, null, WORKER_ID);
|
config = new KinesisClientLibConfiguration(stageName, null, null, WORKER_ID);
|
||||||
|
config.withMaxInitializationAttempts(2);
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
when(proxy.getShardListWithFilter(any())).thenThrow(new RuntimeException(Integer.toString(count++)));
|
when(proxy.getShardListWithFilter(any())).thenThrow(new RuntimeException(Integer.toString(count++)));
|
||||||
int maxRecords = 2;
|
int maxRecords = 2;
|
||||||
|
|
@ -612,7 +615,6 @@ public class WorkerTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public final void testWorkerShutsDownOwnedResources() throws Exception {
|
public final void testWorkerShutsDownOwnedResources() throws Exception {
|
||||||
|
|
||||||
final long failoverTimeMillis = 20L;
|
final long failoverTimeMillis = 20L;
|
||||||
|
|
||||||
// Make sure that worker thread is run before invoking shutdown.
|
// Make sure that worker thread is run before invoking shutdown.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue