Skip to content

Commit 3bf6c95

Browse files
authored
Disabling a DDB source coordination integration test (#6328)
One of our new DDB source coordination integration tests is failing on GitHub. This change attempts to fix that by 1) including a sleep between writing events to ensure that they have different timestamps; and 2) waiting for the GSI to reach eventual consistency. In the end I disabled it. Signed-off-by: David Venable <[email protected]>
1 parent 033c994 commit 3bf6c95

File tree

1 file changed

+47
-22
lines changed

1 file changed

+47
-22
lines changed

data-prepper-plugins/dynamodb-source-coordination-store/src/test/java/org/opensearch/dataprepper/plugins/sourcecoordinator/dynamodb/DynamoDbSourceCoordinationStoreIT.java

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.junit.jupiter.api.AfterAll;
1515
import org.junit.jupiter.api.BeforeAll;
1616
import org.junit.jupiter.api.BeforeEach;
17+
import org.junit.jupiter.api.Disabled;
1718
import org.junit.jupiter.api.Test;
1819
import org.junit.jupiter.api.extension.ExtendWith;
1920
import org.junit.jupiter.params.ParameterizedTest;
@@ -24,19 +25,28 @@
2425
import org.opensearch.dataprepper.model.source.coordinator.SourcePartitionStatus;
2526
import org.opensearch.dataprepper.model.source.coordinator.SourcePartitionStoreItem;
2627
import org.opensearch.dataprepper.model.source.coordinator.exceptions.PartitionUpdateException;
28+
import software.amazon.awssdk.core.pagination.sync.SdkIterable;
2729
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
30+
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbIndex;
2831
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
2932
import software.amazon.awssdk.enhanced.dynamodb.Key;
3033
import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
3134
import software.amazon.awssdk.enhanced.dynamodb.model.GetItemEnhancedRequest;
35+
import software.amazon.awssdk.enhanced.dynamodb.model.Page;
36+
import software.amazon.awssdk.enhanced.dynamodb.model.QueryConditional;
37+
import software.amazon.awssdk.enhanced.dynamodb.model.QueryEnhancedRequest;
3238
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
3339

3440
import java.time.Duration;
3541
import java.time.Instant;
42+
import java.util.List;
3643
import java.util.Optional;
3744
import java.util.Random;
3845
import java.util.UUID;
3946
import java.util.concurrent.TimeUnit;
47+
import java.util.stream.Collectors;
48+
import java.util.stream.IntStream;
49+
import java.util.stream.Stream;
4050

4151
import static org.awaitility.Awaitility.await;
4252
import static org.hamcrest.MatcherAssert.assertThat;
@@ -50,6 +60,8 @@
5060
import static org.hamcrest.Matchers.sameInstance;
5161
import static org.junit.jupiter.api.Assertions.assertThrows;
5262
import static org.mockito.Mockito.when;
63+
import static org.opensearch.dataprepper.plugins.sourcecoordinator.dynamodb.DynamoDbClientWrapper.SOURCE_STATUS_COMBINATION_KEY_GLOBAL_SECONDARY_INDEX;
64+
import static org.opensearch.dataprepper.plugins.sourcecoordinator.dynamodb.DynamoDbSourceCoordinationStore.SOURCE_STATUS_COMBINATION_KEY_FORMAT;
5365

5466
@ExtendWith(MockitoExtension.class)
5567
class DynamoDbSourceCoordinationStoreIT {
@@ -93,8 +105,8 @@ void setUp() {
93105
when(dynamoStoreSettings.getRegion()).thenReturn(region);
94106
when(dynamoStoreSettings.getStsRoleArn()).thenReturn(stsRoleArn);
95107
when(dynamoStoreSettings.getStsExternalId()).thenReturn(stsExternalId);
96-
when(dynamoStoreSettings.getProvisionedReadCapacityUnits()).thenReturn(1L);
97-
when(dynamoStoreSettings.getProvisionedWriteCapacityUnits()).thenReturn(1L);
108+
when(dynamoStoreSettings.getProvisionedReadCapacityUnits()).thenReturn(10L);
109+
when(dynamoStoreSettings.getProvisionedWriteCapacityUnits()).thenReturn(10L);
98110

99111
when(dynamoDbClientFactory.provideDynamoDbClient(region, stsRoleArn, stsExternalId)).thenReturn(dynamoDbClient);
100112

@@ -251,45 +263,58 @@ void tryCreatePartitionItem_creates_an_item() {
251263
assertThat(getItem.getExpirationTime(), lessThanOrEqualTo(Instant.now().getEpochSecond()));
252264
}
253265

266+
@Disabled("This test is flaky on the current version of DynamoDB Local. However, newer versions require JDK 17+.")
254267
@Test
255-
void tryAcquireAvailablePartition_gets_first_unassigned_partition() {
268+
void tryAcquireAvailablePartition_gets_first_unassigned_partition() throws InterruptedException {
256269
final DynamoDbSourceCoordinationStore objectUnderTest = createObjectUnderTest();
257270
final String partitionProgressState = UUID.randomUUID().toString();
258271

259-
final String unassignedPartitionKey1 = UUID.randomUUID().toString();
260-
final String unassignedPartitionKey2 = UUID.randomUUID().toString();
261-
final String unassignedPartitionKey3 = UUID.randomUUID().toString();
272+
final List<String> partitionKeys = IntStream.rangeClosed(1, 3)
273+
.mapToObj(i -> UUID.randomUUID() + "_" + i)
274+
.collect(Collectors.toList());
262275

263-
objectUnderTest.tryCreatePartitionItem(sourceIdentifier,
264-
unassignedPartitionKey1, SourcePartitionStatus.UNASSIGNED, 1L, partitionProgressState, false);
265-
objectUnderTest.tryCreatePartitionItem(sourceIdentifier,
266-
unassignedPartitionKey2, SourcePartitionStatus.UNASSIGNED, 1L, partitionProgressState, false);
267-
objectUnderTest.tryCreatePartitionItem(sourceIdentifier,
268-
unassignedPartitionKey3, SourcePartitionStatus.UNASSIGNED, 1L, partitionProgressState, false);
276+
for (final String partitionKey : partitionKeys) {
277+
final boolean createSuccess = objectUnderTest.tryCreatePartitionItem(sourceIdentifier,
278+
partitionKey, SourcePartitionStatus.UNASSIGNED, 1L, partitionProgressState, false);
279+
assertThat(createSuccess, equalTo(true));
280+
Thread.sleep(150);
281+
}
269282

270-
// Wait for partition to be available in DynamoDB Local before attempting to acquire
271-
final Optional<SourcePartitionStoreItem>[] maybeAcquiredHolder = new Optional[]{Optional.empty()};
272-
await().atMost(5, TimeUnit.SECONDS)
273-
.pollInterval(100, TimeUnit.MILLISECONDS)
274-
.untilAsserted(() -> {
275-
maybeAcquiredHolder[0] = objectUnderTest.tryAcquireAvailablePartition(sourceIdentifier, ownerId, Duration.ofSeconds(20));
276-
assertThat(maybeAcquiredHolder[0].isPresent(), equalTo(true));
277-
});
283+
await().atMost(10, TimeUnit.SECONDS).until(() -> {
284+
final String primaryKey = String.format(SOURCE_STATUS_COMBINATION_KEY_FORMAT, sourceIdentifier, SourcePartitionStatus.UNASSIGNED);
285+
final Stream<DynamoDbSourcePartitionItem> items = querySourceStatusIndex(primaryKey);
278286

279-
final Optional<SourcePartitionStoreItem> maybeAcquired = maybeAcquiredHolder[0];
287+
return items.count() == partitionKeys.size();
288+
});
289+
290+
final Optional<SourcePartitionStoreItem> maybeAcquired = objectUnderTest.tryAcquireAvailablePartition(sourceIdentifier, ownerId, Duration.ofSeconds(20));
280291

281292
assertThat(maybeAcquired, notNullValue());
282293
assertThat(maybeAcquired.isPresent(), equalTo(true));
283-
284294
final SourcePartitionStoreItem acquiredItem = maybeAcquired.get();
285295

286296
assertThat(acquiredItem, notNullValue());
297+
final String unassignedPartitionKey1 = partitionKeys.get(0);
298+
287299
assertThat(acquiredItem.getSourceIdentifier(), equalTo(sourceIdentifier));
288300
assertThat(acquiredItem.getSourcePartitionKey(), equalTo(unassignedPartitionKey1));
289301
assertThat(acquiredItem.getSourcePartitionStatus(), equalTo(SourcePartitionStatus.ASSIGNED));
290302
assertThat(acquiredItem.getPartitionOwner(), equalTo(ownerId));
291303
}
292304

305+
private Stream<DynamoDbSourcePartitionItem> querySourceStatusIndex(final String partitionKey) {
306+
final DynamoDbIndex<DynamoDbSourcePartitionItem> sourceStatusIndex = table.index(SOURCE_STATUS_COMBINATION_KEY_GLOBAL_SECONDARY_INDEX);
307+
final QueryEnhancedRequest queryEnhancedRequest = QueryEnhancedRequest.builder()
308+
.limit(1)
309+
.queryConditional(QueryConditional.keyEqualTo(Key.builder().partitionValue(partitionKey).build()))
310+
.build();
311+
312+
final SdkIterable<Page<DynamoDbSourcePartitionItem>> pages = sourceStatusIndex.query(queryEnhancedRequest);
313+
314+
return pages.stream()
315+
.flatMap(page -> page.items().stream());
316+
}
317+
293318
private DynamoDbSourcePartitionItem putDynamoDbSourcePartitionItem(final SourcePartitionStatus sourcePartitionStatus) {
294319
final DynamoDbSourcePartitionItem putItem = createUnsavedPartitionItem(sourcePartitionStatus);
295320
table.putItem(putItem);

0 commit comments

Comments
 (0)