Fix for #475
This commit is contained in:
parent
8a01abbf43
commit
3e32ff1906
4 changed files with 59 additions and 9 deletions
|
|
@ -202,6 +202,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 sleep time between initialization attempts for the scheduler.
|
||||||
|
*/
|
||||||
|
public static final long DEFAULT_SCHEDULER_INITIALIZATION_BACKOFF_TIME_MILLIS = 1000;
|
||||||
|
|
||||||
private String applicationName;
|
private String applicationName;
|
||||||
private String tableName;
|
private String tableName;
|
||||||
private String streamName;
|
private String streamName;
|
||||||
|
|
@ -262,6 +267,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 long schedulerInitializationBackoffTimeMillis = DEFAULT_SCHEDULER_INITIALIZATION_BACKOFF_TIME_MILLIS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
|
|
@ -308,7 +316,8 @@ public class KinesisClientLibConfiguration {
|
||||||
DEFAULT_DONT_CALL_PROCESS_RECORDS_FOR_EMPTY_RECORD_LIST, DEFAULT_PARENT_SHARD_POLL_INTERVAL_MILLIS,
|
DEFAULT_DONT_CALL_PROCESS_RECORDS_FOR_EMPTY_RECORD_LIST, DEFAULT_PARENT_SHARD_POLL_INTERVAL_MILLIS,
|
||||||
DEFAULT_SHARD_SYNC_INTERVAL_MILLIS, DEFAULT_CLEANUP_LEASES_UPON_SHARDS_COMPLETION,
|
DEFAULT_SHARD_SYNC_INTERVAL_MILLIS, DEFAULT_CLEANUP_LEASES_UPON_SHARDS_COMPLETION,
|
||||||
DEFAULT_TASK_BACKOFF_TIME_MILLIS, DEFAULT_METRICS_BUFFER_TIME_MILLIS, DEFAULT_METRICS_MAX_QUEUE_SIZE,
|
DEFAULT_TASK_BACKOFF_TIME_MILLIS, DEFAULT_METRICS_BUFFER_TIME_MILLIS, DEFAULT_METRICS_MAX_QUEUE_SIZE,
|
||||||
DEFAULT_VALIDATE_SEQUENCE_NUMBER_BEFORE_CHECKPOINTING, null, DEFAULT_SHUTDOWN_GRACE_MILLIS);
|
DEFAULT_VALIDATE_SEQUENCE_NUMBER_BEFORE_CHECKPOINTING, null, DEFAULT_SHUTDOWN_GRACE_MILLIS,
|
||||||
|
DEFAULT_SCHEDULER_INITIALIZATION_BACKOFF_TIME_MILLIS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -362,6 +371,8 @@ public class KinesisClientLibConfiguration {
|
||||||
* The region name for the service
|
* The region name for the service
|
||||||
* @param shutdownGraceMillis
|
* @param shutdownGraceMillis
|
||||||
* The number of milliseconds before graceful shutdown terminates forcefully
|
* The number of milliseconds before graceful shutdown terminates forcefully
|
||||||
|
* @param schedulerInitializationBackoffTimeMillis
|
||||||
|
* Interval in milliseconds between retrying the scheduler initialization.
|
||||||
*/
|
*/
|
||||||
// CHECKSTYLE:IGNORE HiddenFieldCheck FOR NEXT 26 LINES
|
// CHECKSTYLE:IGNORE HiddenFieldCheck FOR NEXT 26 LINES
|
||||||
// CHECKSTYLE:IGNORE ParameterNumber FOR NEXT 26 LINES
|
// CHECKSTYLE:IGNORE ParameterNumber FOR NEXT 26 LINES
|
||||||
|
|
@ -372,13 +383,13 @@ public class KinesisClientLibConfiguration {
|
||||||
boolean callProcessRecordsEvenForEmptyRecordList, long parentShardPollIntervalMillis,
|
boolean callProcessRecordsEvenForEmptyRecordList, long parentShardPollIntervalMillis,
|
||||||
long shardSyncIntervalMillis, boolean cleanupTerminatedShardsBeforeExpiry, long taskBackoffTimeMillis,
|
long shardSyncIntervalMillis, boolean cleanupTerminatedShardsBeforeExpiry, long taskBackoffTimeMillis,
|
||||||
long metricsBufferTimeMillis, int metricsMaxQueueSize, boolean validateSequenceNumberBeforeCheckpointing,
|
long metricsBufferTimeMillis, int metricsMaxQueueSize, boolean validateSequenceNumberBeforeCheckpointing,
|
||||||
String regionName, long shutdownGraceMillis) {
|
String regionName, long shutdownGraceMillis, long schedulerInitializationBackoffTimeMillis) {
|
||||||
this(applicationName, streamName, kinesisEndpoint, null, initialPositionInStream, kinesisCredentialsProvider,
|
this(applicationName, streamName, kinesisEndpoint, null, initialPositionInStream, kinesisCredentialsProvider,
|
||||||
dynamoDBCredentialsProvider, cloudWatchCredentialsProvider, failoverTimeMillis, workerId, maxRecords,
|
dynamoDBCredentialsProvider, cloudWatchCredentialsProvider, failoverTimeMillis, workerId, maxRecords,
|
||||||
idleTimeBetweenReadsInMillis, callProcessRecordsEvenForEmptyRecordList, parentShardPollIntervalMillis,
|
idleTimeBetweenReadsInMillis, callProcessRecordsEvenForEmptyRecordList, parentShardPollIntervalMillis,
|
||||||
shardSyncIntervalMillis, cleanupTerminatedShardsBeforeExpiry, taskBackoffTimeMillis,
|
shardSyncIntervalMillis, cleanupTerminatedShardsBeforeExpiry, taskBackoffTimeMillis,
|
||||||
metricsBufferTimeMillis, metricsMaxQueueSize, validateSequenceNumberBeforeCheckpointing, regionName,
|
metricsBufferTimeMillis, metricsMaxQueueSize, validateSequenceNumberBeforeCheckpointing, regionName,
|
||||||
shutdownGraceMillis);
|
shutdownGraceMillis, schedulerInitializationBackoffTimeMillis);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -432,6 +443,8 @@ public class KinesisClientLibConfiguration {
|
||||||
* {@link ShardRecordProcessorCheckpointer#checkpoint(String)}
|
* {@link ShardRecordProcessorCheckpointer#checkpoint(String)}
|
||||||
* @param regionName
|
* @param regionName
|
||||||
* The region name for the service
|
* The region name for the service
|
||||||
|
* @param schedulerInitializationBackoffTimeMillis
|
||||||
|
* Interval in milliseconds between retrying the scheduler initialization.
|
||||||
*/
|
*/
|
||||||
// CHECKSTYLE:IGNORE HiddenFieldCheck FOR NEXT 26 LINES
|
// CHECKSTYLE:IGNORE HiddenFieldCheck FOR NEXT 26 LINES
|
||||||
// CHECKSTYLE:IGNORE ParameterNumber FOR NEXT 26 LINES
|
// CHECKSTYLE:IGNORE ParameterNumber FOR NEXT 26 LINES
|
||||||
|
|
@ -443,7 +456,7 @@ public class KinesisClientLibConfiguration {
|
||||||
long parentShardPollIntervalMillis, long shardSyncIntervalMillis,
|
long parentShardPollIntervalMillis, long shardSyncIntervalMillis,
|
||||||
boolean cleanupTerminatedShardsBeforeExpiry, long taskBackoffTimeMillis, long metricsBufferTimeMillis,
|
boolean cleanupTerminatedShardsBeforeExpiry, long taskBackoffTimeMillis, long metricsBufferTimeMillis,
|
||||||
int metricsMaxQueueSize, boolean validateSequenceNumberBeforeCheckpointing, String regionName,
|
int metricsMaxQueueSize, boolean validateSequenceNumberBeforeCheckpointing, String regionName,
|
||||||
long shutdownGraceMillis) {
|
long shutdownGraceMillis, long schedulerInitializationBackoffTimeMillis) {
|
||||||
// Check following values are greater than zero
|
// Check following values are greater than zero
|
||||||
checkIsValuePositive("FailoverTimeMillis", failoverTimeMillis);
|
checkIsValuePositive("FailoverTimeMillis", failoverTimeMillis);
|
||||||
checkIsValuePositive("IdleTimeBetweenReadsInMillis", idleTimeBetweenReadsInMillis);
|
checkIsValuePositive("IdleTimeBetweenReadsInMillis", idleTimeBetweenReadsInMillis);
|
||||||
|
|
@ -454,6 +467,7 @@ public class KinesisClientLibConfiguration {
|
||||||
checkIsValuePositive("MetricsBufferTimeMills", metricsBufferTimeMillis);
|
checkIsValuePositive("MetricsBufferTimeMills", metricsBufferTimeMillis);
|
||||||
checkIsValuePositive("MetricsMaxQueueSize", (long) metricsMaxQueueSize);
|
checkIsValuePositive("MetricsMaxQueueSize", (long) metricsMaxQueueSize);
|
||||||
checkIsValuePositive("ShutdownGraceMillis", shutdownGraceMillis);
|
checkIsValuePositive("ShutdownGraceMillis", shutdownGraceMillis);
|
||||||
|
checkIsValuePositive("schedulerInitializationBackoffTimeMillis", schedulerInitializationBackoffTimeMillis);
|
||||||
checkIsRegionNameValid(regionName);
|
checkIsRegionNameValid(regionName);
|
||||||
this.applicationName = applicationName;
|
this.applicationName = applicationName;
|
||||||
this.tableName = applicationName;
|
this.tableName = applicationName;
|
||||||
|
|
@ -485,6 +499,7 @@ public class KinesisClientLibConfiguration {
|
||||||
this.skipShardSyncAtWorkerInitializationIfLeasesExist = DEFAULT_SKIP_SHARD_SYNC_AT_STARTUP_IF_LEASES_EXIST;
|
this.skipShardSyncAtWorkerInitializationIfLeasesExist = DEFAULT_SKIP_SHARD_SYNC_AT_STARTUP_IF_LEASES_EXIST;
|
||||||
this.shardPrioritization = DEFAULT_SHARD_PRIORITIZATION;
|
this.shardPrioritization = DEFAULT_SHARD_PRIORITIZATION;
|
||||||
this.recordsFetcherFactory = new SimpleRecordsFetcherFactory();
|
this.recordsFetcherFactory = new SimpleRecordsFetcherFactory();
|
||||||
|
this.schedulerInitializationBackoffTimeMillis = schedulerInitializationBackoffTimeMillis;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -538,6 +553,8 @@ public class KinesisClientLibConfiguration {
|
||||||
* {@link ShardRecordProcessorCheckpointer#checkpoint(String)}
|
* {@link ShardRecordProcessorCheckpointer#checkpoint(String)}
|
||||||
* @param regionName
|
* @param regionName
|
||||||
* The region name for the service
|
* The region name for the service
|
||||||
|
* @param schedulerInitializationBackoffTimeMillis
|
||||||
|
* Interval in milliseconds between retrying the scheduler initialization.
|
||||||
*/
|
*/
|
||||||
// CHECKSTYLE:IGNORE HiddenFieldCheck FOR NEXT 26 LINES
|
// CHECKSTYLE:IGNORE HiddenFieldCheck FOR NEXT 26 LINES
|
||||||
// CHECKSTYLE:IGNORE ParameterNumber FOR NEXT 26 LINES
|
// CHECKSTYLE:IGNORE ParameterNumber FOR NEXT 26 LINES
|
||||||
|
|
@ -549,7 +566,7 @@ public class KinesisClientLibConfiguration {
|
||||||
long parentShardPollIntervalMillis, long shardSyncIntervalMillis,
|
long parentShardPollIntervalMillis, long shardSyncIntervalMillis,
|
||||||
boolean cleanupTerminatedShardsBeforeExpiry, long taskBackoffTimeMillis, long metricsBufferTimeMillis,
|
boolean cleanupTerminatedShardsBeforeExpiry, long taskBackoffTimeMillis, long metricsBufferTimeMillis,
|
||||||
int metricsMaxQueueSize, boolean validateSequenceNumberBeforeCheckpointing, String regionName,
|
int metricsMaxQueueSize, boolean validateSequenceNumberBeforeCheckpointing, String regionName,
|
||||||
RecordsFetcherFactory recordsFetcherFactory) {
|
RecordsFetcherFactory recordsFetcherFactory, long schedulerInitializationBackoffTimeMillis) {
|
||||||
// Check following values are greater than zero
|
// Check following values are greater than zero
|
||||||
checkIsValuePositive("FailoverTimeMillis", failoverTimeMillis);
|
checkIsValuePositive("FailoverTimeMillis", failoverTimeMillis);
|
||||||
checkIsValuePositive("IdleTimeBetweenReadsInMillis", idleTimeBetweenReadsInMillis);
|
checkIsValuePositive("IdleTimeBetweenReadsInMillis", idleTimeBetweenReadsInMillis);
|
||||||
|
|
@ -559,6 +576,7 @@ public class KinesisClientLibConfiguration {
|
||||||
checkIsValuePositive("TaskBackoffTimeMillis", taskBackoffTimeMillis);
|
checkIsValuePositive("TaskBackoffTimeMillis", taskBackoffTimeMillis);
|
||||||
checkIsValuePositive("MetricsBufferTimeMills", metricsBufferTimeMillis);
|
checkIsValuePositive("MetricsBufferTimeMills", metricsBufferTimeMillis);
|
||||||
checkIsValuePositive("MetricsMaxQueueSize", (long) metricsMaxQueueSize);
|
checkIsValuePositive("MetricsMaxQueueSize", (long) metricsMaxQueueSize);
|
||||||
|
checkIsValuePositive("schedulerInitializationBackoffTimeMillis", schedulerInitializationBackoffTimeMillis);
|
||||||
checkIsRegionNameValid(regionName);
|
checkIsRegionNameValid(regionName);
|
||||||
this.applicationName = applicationName;
|
this.applicationName = applicationName;
|
||||||
this.tableName = applicationName;
|
this.tableName = applicationName;
|
||||||
|
|
@ -594,6 +612,7 @@ public class KinesisClientLibConfiguration {
|
||||||
this.shardPrioritization = DEFAULT_SHARD_PRIORITIZATION;
|
this.shardPrioritization = DEFAULT_SHARD_PRIORITIZATION;
|
||||||
this.recordsFetcherFactory = recordsFetcherFactory;
|
this.recordsFetcherFactory = recordsFetcherFactory;
|
||||||
this.shutdownGraceMillis = shutdownGraceMillis;
|
this.shutdownGraceMillis = shutdownGraceMillis;
|
||||||
|
this.schedulerInitializationBackoffTimeMillis = schedulerInitializationBackoffTimeMillis;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if value is positive, otherwise throw an exception
|
// Check if value is positive, otherwise throw an exception
|
||||||
|
|
@ -863,6 +882,13 @@ public class KinesisClientLibConfiguration {
|
||||||
return shutdownGraceMillis;
|
return shutdownGraceMillis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Interval in milliseconds between retrying the scheduler initialization.
|
||||||
|
*/
|
||||||
|
public long getSchedulerInitializationBackoffTimeMillis() {
|
||||||
|
return schedulerInitializationBackoffTimeMillis;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* // CHECKSTYLE:IGNORE HiddenFieldCheck FOR NEXT 190 LINES
|
* // CHECKSTYLE:IGNORE HiddenFieldCheck FOR NEXT 190 LINES
|
||||||
* /**
|
* /**
|
||||||
|
|
@ -1381,4 +1407,15 @@ public class KinesisClientLibConfiguration {
|
||||||
this.maxListShardsRetryAttempts = maxListShardsRetryAttempts;
|
this.maxListShardsRetryAttempts = maxListShardsRetryAttempts;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param schedulerInitializationBackoffTimeMillis
|
||||||
|
* Interval in milliseconds between retrying the scheduler initialization.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public KinesisClientLibConfiguration withSchedulerInitializationBackoffTimeMillis(long schedulerInitializationBackoffTimeMillis) {
|
||||||
|
checkIsValuePositive("schedulerInitializationBackoffTimeMillis", schedulerInitializationBackoffTimeMillis);
|
||||||
|
this.schedulerInitializationBackoffTimeMillis = schedulerInitializationBackoffTimeMillis;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -130,6 +130,8 @@ public class MultiLangDaemonConfiguration {
|
||||||
private ShardPrioritization shardPrioritization;
|
private ShardPrioritization shardPrioritization;
|
||||||
@ConfigurationSettable(configurationClass = CoordinatorConfig.class)
|
@ConfigurationSettable(configurationClass = CoordinatorConfig.class)
|
||||||
private boolean skipShardSyncAtWorkerInitializationIfLeasesExist;
|
private boolean skipShardSyncAtWorkerInitializationIfLeasesExist;
|
||||||
|
@ConfigurationSettable(configurationClass = CoordinatorConfig.class)
|
||||||
|
private long schedulerInitializationBackoffTimeMillis;
|
||||||
|
|
||||||
@ConfigurationSettable(configurationClass = LifecycleConfig.class)
|
@ConfigurationSettable(configurationClass = LifecycleConfig.class)
|
||||||
private long taskBackoffTimeMillis;
|
private long taskBackoffTimeMillis;
|
||||||
|
|
|
||||||
|
|
@ -90,4 +90,11 @@ public class CoordinatorConfig {
|
||||||
|
|
||||||
private CoordinatorFactory coordinatorFactory = new SchedulerCoordinatorFactory();
|
private CoordinatorFactory coordinatorFactory = new SchedulerCoordinatorFactory();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interval in milliseconds between retrying the scheduler initialization.
|
||||||
|
*
|
||||||
|
* <p>Default value: 1000L</p>
|
||||||
|
*/
|
||||||
|
private long schedulerInitializationBackoffTimeMillis = 1000L;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -118,6 +118,7 @@ public class Scheduler implements Runnable {
|
||||||
private final boolean ignoreUnexpetedChildShards;
|
private final boolean ignoreUnexpetedChildShards;
|
||||||
private final AggregatorUtil aggregatorUtil;
|
private final AggregatorUtil aggregatorUtil;
|
||||||
private final HierarchicalShardSyncer hierarchicalShardSyncer;
|
private final HierarchicalShardSyncer hierarchicalShardSyncer;
|
||||||
|
private final long schedulerInitializationBackoffTimeMillis;
|
||||||
|
|
||||||
// Holds consumers for shards the worker is currently tracking. Key is shard
|
// Holds consumers for shards the worker is currently tracking. Key is shard
|
||||||
// info, value is ShardConsumer.
|
// info, value is ShardConsumer.
|
||||||
|
|
@ -220,6 +221,7 @@ public class Scheduler implements Runnable {
|
||||||
this.ignoreUnexpetedChildShards = this.leaseManagementConfig.ignoreUnexpectedChildShards();
|
this.ignoreUnexpetedChildShards = this.leaseManagementConfig.ignoreUnexpectedChildShards();
|
||||||
this.aggregatorUtil = this.lifecycleConfig.aggregatorUtil();
|
this.aggregatorUtil = this.lifecycleConfig.aggregatorUtil();
|
||||||
this.hierarchicalShardSyncer = leaseManagementConfig.hierarchicalShardSyncer();
|
this.hierarchicalShardSyncer = leaseManagementConfig.hierarchicalShardSyncer();
|
||||||
|
this.schedulerInitializationBackoffTimeMillis = this.coordinatorConfig.schedulerInitializationBackoffTimeMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -291,10 +293,12 @@ public class Scheduler implements Runnable {
|
||||||
lastException = e;
|
lastException = e;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
if (!isDone) {
|
||||||
Thread.sleep(parentShardPollIntervalMillis);
|
try {
|
||||||
} catch (InterruptedException e) {
|
Thread.sleep(schedulerInitializationBackoffTimeMillis);
|
||||||
log.debug("Sleep interrupted while initializing worker.");
|
} catch (InterruptedException e) {
|
||||||
|
log.debug("Sleep interrupted while initializing worker.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue