diff --git a/amazon-kinesis-client/src/test/java/software/amazon/kinesis/coordinator/PeriodicShardSyncManagerTest.java b/amazon-kinesis-client/src/test/java/software/amazon/kinesis/coordinator/PeriodicShardSyncManagerTest.java index a2047a6b..d66217ab 100644 --- a/amazon-kinesis-client/src/test/java/software/amazon/kinesis/coordinator/PeriodicShardSyncManagerTest.java +++ b/amazon-kinesis-client/src/test/java/software/amazon/kinesis/coordinator/PeriodicShardSyncManagerTest.java @@ -459,7 +459,15 @@ public class PeriodicShardSyncManagerTest { List leases = generateInitialLeases(maxInitialLeaseCount); reshard(leases, 5, ReshardType.ANY, maxInitialLeaseCount, true); Collections.shuffle(leases); - Assert.assertFalse(periodicShardSyncManager.hasHoleInLeases(streamIdentifier, leases).isPresent()); + boolean isHoleInHashRanges = periodicShardSyncManager.hasHoleInLeases(streamIdentifier, leases).isPresent(); + if (isHoleInHashRanges) { + // In-progress parents may result in a lease having the highest startingHashKey value while not having + // an endingHashKey value of MAX_HASH_KEY. This is detected as a "hole" in the hash key range, + // so mark the in-progress parents as finished (SHARD_END) and recheck for holes. + finishInProgressParents(leases); + isHoleInHashRanges = periodicShardSyncManager.hasHoleInLeases(streamIdentifier, leases).isPresent(); + } + Assert.assertFalse(isHoleInHashRanges); } } @@ -569,6 +577,13 @@ public class PeriodicShardSyncManagerTest { return leaseCounter; } + private void finishInProgressParents(List leases) { + leases.stream() + .filter(l -> l.checkpoint() != null && !l.checkpoint().equals(ExtendedSequenceNumber.SHARD_END) && + l.childShardIds() != null && !l.childShardIds().isEmpty()) + .forEach(l -> l.checkpoint(ExtendedSequenceNumber.SHARD_END)); + } + private boolean isHeads() { return Math.random() <= 0.5; }