Skip to content

Commit 251b331

Browse files
authored
PeriodicShardSyncManager Changes Needed for DynamoDBStreamsKinesisAdapter Compatibility (#970)
* Interface and Rename for PeriodicShardSyncManager * Removed Automatic Indents * More Auto Indent Fixes
1 parent 8dceb3f commit 251b331

9 files changed

+459
-20
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.amazonaws.services.kinesis.clientlibrary.lib.worker;
2+
3+
import com.google.common.annotations.VisibleForTesting;
4+
import lombok.Value;
5+
import lombok.experimental.Accessors;
6+
7+
public interface IPeriodicShardSyncManager {
8+
9+
TaskResult start();
10+
11+
/**
12+
* Runs ShardSync once, without scheduling further periodic ShardSyncs.
13+
* @return TaskResult from shard sync
14+
*/
15+
TaskResult syncShardsOnce();
16+
17+
void stop();
18+
19+
@Value
20+
@Accessors(fluent = true)
21+
@VisibleForTesting
22+
class ShardSyncResponse {
23+
private final boolean shouldDoShardSync;
24+
private final boolean isHoleDetected;
25+
private final String reasonForDecision;
26+
}
27+
}
28+

src/main/java/com/amazonaws/services/kinesis/clientlibrary/lib/worker/ITask.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
* Interface for shard processing tasks.
2121
* A task may execute an application callback (e.g. initialize, process, shutdown).
2222
*/
23-
interface ITask extends Callable<TaskResult> {
23+
public interface ITask extends Callable<TaskResult> {
2424

2525
/**
2626
* Perform task logic.

src/main/java/com/amazonaws/services/kinesis/clientlibrary/lib/worker/KinesisPeriodicShardSyncManager.java

+403
Large diffs are not rendered by default.

src/main/java/com/amazonaws/services/kinesis/clientlibrary/lib/worker/MetricsCollectingTaskDecorator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
/**
2222
* Decorates an ITask and reports metrics about its timing and success/failure.
2323
*/
24-
class MetricsCollectingTaskDecorator implements ITask {
24+
public class MetricsCollectingTaskDecorator implements ITask {
2525

2626
private final ITask other;
2727
private final IMetricsFactory factory;

src/main/java/com/amazonaws/services/kinesis/clientlibrary/lib/worker/PeriodicShardSyncStrategy.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
*/
77
class PeriodicShardSyncStrategy implements ShardSyncStrategy {
88

9-
private PeriodicShardSyncManager periodicShardSyncManager;
9+
private IPeriodicShardSyncManager periodicShardSyncManager;
1010

11-
PeriodicShardSyncStrategy(PeriodicShardSyncManager periodicShardSyncManager) {
11+
PeriodicShardSyncStrategy(IPeriodicShardSyncManager periodicShardSyncManager) {
1212
this.periodicShardSyncManager = periodicShardSyncManager;
1313
}
1414

src/main/java/com/amazonaws/services/kinesis/clientlibrary/lib/worker/ShardEndShardSyncStrategy.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ class ShardEndShardSyncStrategy implements ShardSyncStrategy {
1717
private ShardSyncTaskManager shardSyncTaskManager;
1818

1919
/** Runs periodic shard sync jobs in the background as an auditor process for shard-end syncs. */
20-
private PeriodicShardSyncManager periodicShardSyncManager;
20+
private IPeriodicShardSyncManager periodicShardSyncManager;
2121

2222
ShardEndShardSyncStrategy(ShardSyncTaskManager shardSyncTaskManager,
23-
PeriodicShardSyncManager periodicShardSyncManager) {
23+
IPeriodicShardSyncManager periodicShardSyncManager) {
2424
this.shardSyncTaskManager = shardSyncTaskManager;
2525
this.periodicShardSyncManager = periodicShardSyncManager;
2626
}

src/main/java/com/amazonaws/services/kinesis/clientlibrary/lib/worker/ShardSyncTask.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
* It will clean up leases/activities for shards that have been completely processed (if
3131
* cleanupLeasesUponShardCompletion is true).
3232
*/
33-
class ShardSyncTask implements ITask {
33+
public class ShardSyncTask implements ITask {
3434

3535
private static final Log LOG = LogFactory.getLog(ShardSyncTask.class);
3636

@@ -56,7 +56,7 @@ class ShardSyncTask implements ITask {
5656
* @param shardSyncer shardSyncer instance used to check and create new leases
5757
* @param latestShards latest snapshot of shards to reuse
5858
*/
59-
ShardSyncTask(IKinesisProxy kinesisProxy,
59+
public ShardSyncTask(IKinesisProxy kinesisProxy,
6060
ILeaseManager<KinesisClientLease> leaseManager,
6161
InitialPositionInStreamExtended initialPositionInStream,
6262
boolean cleanupLeasesUponShardCompletion,

src/main/java/com/amazonaws/services/kinesis/clientlibrary/lib/worker/TaskResult.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
* Used to capture information from a task that we want to communicate back to the higher layer.
2323
* E.g. exception thrown when executing the task, if we reach end of a shard.
2424
*/
25-
class TaskResult {
25+
public class TaskResult {
2626

2727
// Did we reach the end of the shard while processing this task.
2828
private boolean shardEndReached;
@@ -38,7 +38,7 @@ class TaskResult {
3838
/**
3939
* @return the shardEndReached
4040
*/
41-
protected boolean isShardEndReached() {
41+
public boolean isShardEndReached() {
4242
return shardEndReached;
4343
}
4444

@@ -77,7 +77,7 @@ public Exception getException() {
7777
/**
7878
* @param e Any exception encountered when running the process task.
7979
*/
80-
TaskResult(Exception e) {
80+
public TaskResult(Exception e) {
8181
this(e, false);
8282
}
8383

src/main/java/com/amazonaws/services/kinesis/clientlibrary/lib/worker/Worker.java

+17-9
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ public class Worker implements Runnable {
156156
// Periodic Shard Sync related fields
157157
private LeaderDecider leaderDecider;
158158
private ShardSyncStrategy shardSyncStrategy;
159-
private PeriodicShardSyncManager leaderElectedPeriodicShardSyncManager;
159+
private IPeriodicShardSyncManager leaderElectedPeriodicShardSyncManager;
160160

161161
private final LeaseCleanupManager leaseCleanupManager;
162162

@@ -533,7 +533,7 @@ config, getStreamConfig(config, kinesisClient),
533533
IMetricsFactory metricsFactory, long taskBackoffTimeMillis, long failoverTimeMillis,
534534
boolean skipShardSyncAtWorkerInitializationIfLeasesExist, ShardPrioritization shardPrioritization,
535535
Optional<Integer> retryGetRecordsInSeconds, Optional<Integer> maxGetRecordsThreadPool, WorkerStateChangeListener workerStateChangeListener,
536-
LeaseCleanupValidator leaseCleanupValidator, LeaderDecider leaderDecider, PeriodicShardSyncManager periodicShardSyncManager) {
536+
LeaseCleanupValidator leaseCleanupValidator, LeaderDecider leaderDecider, IPeriodicShardSyncManager periodicShardSyncManager) {
537537
this(applicationName, recordProcessorFactory, config, streamConfig, initialPositionInStream,
538538
parentShardPollIntervalMillis, shardSyncIdleTimeMillis, cleanupLeasesUponShardCompletion, checkpoint,
539539
leaseCoordinator, execService, metricsFactory, taskBackoffTimeMillis, failoverTimeMillis,
@@ -550,7 +550,7 @@ maxGetRecordsThreadPool, workerStateChangeListener, new KinesisShardSyncer(lease
550550
boolean skipShardSyncAtWorkerInitializationIfLeasesExist, ShardPrioritization shardPrioritization,
551551
Optional<Integer> retryGetRecordsInSeconds, Optional<Integer> maxGetRecordsThreadPool,
552552
WorkerStateChangeListener workerStateChangeListener, ShardSyncer shardSyncer, LeaderDecider leaderDecider,
553-
PeriodicShardSyncManager periodicShardSyncManager) {
553+
IPeriodicShardSyncManager periodicShardSyncManager) {
554554
this.applicationName = applicationName;
555555
this.recordProcessorFactory = recordProcessorFactory;
556556
this.config = config;
@@ -590,7 +590,7 @@ maxGetRecordsThreadPool, workerStateChangeListener, new KinesisShardSyncer(lease
590590
*/
591591
private void createShardSyncStrategy(ShardSyncStrategyType strategyType,
592592
LeaderDecider leaderDecider,
593-
PeriodicShardSyncManager periodicShardSyncManager) {
593+
IPeriodicShardSyncManager periodicShardSyncManager) {
594594
switch (strategyType) {
595595
case PERIODIC:
596596
this.leaderDecider = getOrCreateLeaderDecider(leaderDecider);
@@ -652,7 +652,7 @@ LeaderDecider getLeaderDecider() {
652652
/**
653653
* @return the leaderElectedPeriodicShardSyncManager
654654
*/
655-
PeriodicShardSyncManager getPeriodicShardSyncManager() {
655+
IPeriodicShardSyncManager getPeriodicShardSyncManager() {
656656
return leaderElectedPeriodicShardSyncManager;
657657
}
658658

@@ -1224,7 +1224,7 @@ StreamConfig getStreamConfig() {
12241224
* KinesisClientLibConfiguration
12251225
* @return Returns metrics factory based on the config.
12261226
*/
1227-
private static IMetricsFactory getMetricsFactory(AmazonCloudWatch cloudWatchClient,
1227+
public static IMetricsFactory getMetricsFactory(AmazonCloudWatch cloudWatchClient,
12281228
KinesisClientLibConfiguration config) {
12291229
IMetricsFactory metricsFactory;
12301230
if (config.getMetricsLevel() == MetricsLevel.NONE) {
@@ -1278,13 +1278,13 @@ private LeaderDecider getOrCreateLeaderDecider(LeaderDecider leaderDecider) {
12781278

12791279
/** A non-null PeriodicShardSyncManager can only provided from unit tests. Any application code will create the
12801280
* PeriodicShardSyncManager for the first time here. */
1281-
private PeriodicShardSyncManager getOrCreatePeriodicShardSyncManager(PeriodicShardSyncManager periodicShardSyncManager,
1281+
private IPeriodicShardSyncManager getOrCreatePeriodicShardSyncManager(IPeriodicShardSyncManager periodicShardSyncManager,
12821282
boolean isAuditorMode) {
12831283
if (periodicShardSyncManager != null) {
12841284
return periodicShardSyncManager;
12851285
}
12861286

1287-
return new PeriodicShardSyncManager(config.getWorkerIdentifier(),
1287+
return new KinesisPeriodicShardSyncManager(config.getWorkerIdentifier(),
12881288
leaderDecider,
12891289
new ShardSyncTask(streamConfig.getStreamProxy(),
12901290
leaseCoordinator.getLeaseManager(),
@@ -1353,6 +1353,8 @@ public static class Builder {
13531353
@Setter @Accessors(fluent = true)
13541354
private IKinesisProxy kinesisProxy;
13551355
@Setter @Accessors(fluent = true)
1356+
private IPeriodicShardSyncManager periodicShardSyncManager;
1357+
@Setter @Accessors(fluent = true)
13561358
private WorkerStateChangeListener workerStateChangeListener;
13571359
@Setter @Accessors(fluent = true)
13581360
private LeaseCleanupValidator leaseCleanupValidator;
@@ -1421,6 +1423,12 @@ public Worker build() {
14211423
throw new IllegalArgumentException(
14221424
"Kinesis Client Library configuration needs to be provided to build Worker");
14231425
}
1426+
if (periodicShardSyncManager != null) {
1427+
if (leaseManager == null || shardSyncer == null || metricsFactory == null || leaderDecider == null) {
1428+
1429+
throw new IllegalArgumentException("LeaseManager, ShardSyncer, MetricsFactory, and LeaderDecider must be provided if PeriodicShardSyncManager is provided");
1430+
}
1431+
}
14241432
if (recordProcessorFactory == null) {
14251433
throw new IllegalArgumentException("A Record Processor Factory needs to be provided to build Worker");
14261434
}
@@ -1546,7 +1554,7 @@ public Worker build() {
15461554
workerStateChangeListener,
15471555
shardSyncer,
15481556
leaderDecider,
1549-
null /* PeriodicShardSyncManager */);
1557+
periodicShardSyncManager);
15501558
}
15511559

15521560
<R, T extends AwsClientBuilder<T, R>> R createClient(final T builder,

0 commit comments

Comments
 (0)