From d3a4fd55697df71f9c7ec7cf3505861af9f5eb96 Mon Sep 17 00:00:00 2001 From: furq-aws Date: Wed, 15 Mar 2023 14:21:50 -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. --- .../coordinator/PeriodicShardSyncManagerTest.java | 14 +++++++++++++- 1 file changed, 13 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..0da0f3e9 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,12 @@ 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) { + finishInProgressParents(leases); + isHoleInHashRanges = periodicShardSyncManager.hasHoleInLeases(streamIdentifier, leases).isPresent(); + } + Assert.assertFalse(isHoleInHashRanges); } } @@ -569,6 +574,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; }