From c23d83dc9a7b00e895c1b22b6e4735da5974f120 Mon Sep 17 00:00:00 2001 From: furq-aws Date: Thu, 16 Mar 2023 04:52:56 -0700 Subject: [PATCH] Fix flaky HashRangesAreAlwaysComplete test Adds mechanism to allow in-progress parents to finish (marked as SHARD_END) if testFor1000DifferentValidReshardHierarchyTreeWithSomeInProgressParentsTheHashRangesAreAlwaysComplete detects hole due to merged parent shards still holding an active lease. --- .../PeriodicShardSyncManagerTest.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) 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; }