From 8af8a33c9cec6bfb6a13fc56e6f8bfe54cab20d9 Mon Sep 17 00:00:00 2001 From: Saranya Somepalli Date: Fri, 4 Sep 2026 13:53:59 -0700 Subject: [PATCH] Additonal test changes --- ...iteKeysImmutableSchemaIntegrationTest.java | 20 ++++++++++--- ...ryGSICompositeKeysIntegrationTestBase.java | 20 ++++++++++--- .../SearchVectorsIntegrationTestBase.java | 30 +++++++++++-------- 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/services-custom/dynamodb-enhanced/src/it/java/software/amazon/awssdk/enhanced/dynamodb/QueryGSICompositeKeysImmutableSchemaIntegrationTest.java b/services-custom/dynamodb-enhanced/src/it/java/software/amazon/awssdk/enhanced/dynamodb/QueryGSICompositeKeysImmutableSchemaIntegrationTest.java index 36f2f3a9690e..1e87669ec94b 100644 --- a/services-custom/dynamodb-enhanced/src/it/java/software/amazon/awssdk/enhanced/dynamodb/QueryGSICompositeKeysImmutableSchemaIntegrationTest.java +++ b/services-custom/dynamodb-enhanced/src/it/java/software/amazon/awssdk/enhanced/dynamodb/QueryGSICompositeKeysImmutableSchemaIntegrationTest.java @@ -68,11 +68,23 @@ public static void teardown() { } private static void waitForGsiConsistency() { - try { - Thread.sleep(3000); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); + int expectedCount = COMPOSITE_RECORDS.size(); + for (int attempt = 0; attempt < 20; attempt++) { + int count = dynamoDbClient.scan(r -> r.tableName(mappedTable.tableName()) + .indexName("gsi1") + .limit(expectedCount + 1)) + .items().size(); + if (count >= expectedCount) { + return; + } + try { + Thread.sleep(Math.min(500L << Math.min(attempt, 3), 2_000L)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException(e); + } } + throw new AssertionError("GSI propagation timed out after retries"); } private static final java.util.List COMPOSITE_RECORDS = Arrays.asList( diff --git a/services-custom/dynamodb-enhanced/src/it/java/software/amazon/awssdk/enhanced/dynamodb/QueryGSICompositeKeysIntegrationTestBase.java b/services-custom/dynamodb-enhanced/src/it/java/software/amazon/awssdk/enhanced/dynamodb/QueryGSICompositeKeysIntegrationTestBase.java index 3e3a2c70211c..63fe5bb492ee 100644 --- a/services-custom/dynamodb-enhanced/src/it/java/software/amazon/awssdk/enhanced/dynamodb/QueryGSICompositeKeysIntegrationTestBase.java +++ b/services-custom/dynamodb-enhanced/src/it/java/software/amazon/awssdk/enhanced/dynamodb/QueryGSICompositeKeysIntegrationTestBase.java @@ -85,11 +85,23 @@ protected static void insertRecords() { } protected static void waitForGsiConsistency() { - try { - Thread.sleep(3000); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); + int expectedCount = COMPOSITE_RECORDS.size(); + for (int attempt = 0; attempt < 20; attempt++) { + int count = dynamoDbClient.scan(r -> r.tableName(mappedTable.tableName()) + .indexName("gsi1") + .limit(expectedCount + 1)) + .items().size(); + if (count >= expectedCount) { + return; + } + try { + Thread.sleep(Math.min(500L << Math.min(attempt, 3), 2_000L)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException(e); + } } + throw new AssertionError("GSI propagation timed out after retries"); } private static CompositeKeyRecord createRecord(String id, String sort, String pk1, Integer pk2, String pk3, diff --git a/services-custom/dynamodb-enhanced/src/it/java/software/amazon/awssdk/enhanced/dynamodb/SearchVectorsIntegrationTestBase.java b/services-custom/dynamodb-enhanced/src/it/java/software/amazon/awssdk/enhanced/dynamodb/SearchVectorsIntegrationTestBase.java index bea1bc2caeac..dc801f89b577 100644 --- a/services-custom/dynamodb-enhanced/src/it/java/software/amazon/awssdk/enhanced/dynamodb/SearchVectorsIntegrationTestBase.java +++ b/services-custom/dynamodb-enhanced/src/it/java/software/amazon/awssdk/enhanced/dynamodb/SearchVectorsIntegrationTestBase.java @@ -89,7 +89,6 @@ public abstract class SearchVectorsIntegrationTestBase extends DynamoDbEnhancedI "JavaTests-SearchVectors-FilterOnly"; private static final int DEFAULT_SEARCH_RETRY_ATTEMPTS = 15; - protected static final int POST_MUTATION_SEARCH_RETRY_ATTEMPTS = 8; private static final int QUICK_SEARCH_RETRY_ATTEMPTS = 3; private static final int TABLE_WARMUP_SEARCH_RETRY_ATTEMPTS = 20; private static final int VECTOR_INDEX_ACTIVE_WAIT_ATTEMPTS = 30; @@ -1053,7 +1052,7 @@ protected List> searchVectorsUntilContains( String expectedSortKey) { List> results = executeSearch(indexName, request); - for (int attempt = 0; attempt < POST_MUTATION_SEARCH_RETRY_ATTEMPTS; attempt++) { + for (int attempt = 0; attempt < DEFAULT_SEARCH_RETRY_ATTEMPTS; attempt++) { boolean found = results.stream() .anyMatch(r -> r.item() != null && expectedSortKey.equals( @@ -1073,7 +1072,7 @@ protected List> searchVectorsUntilAbsent( String absentSortKey) { List> results = executeSearch(indexName, request); - for (int attempt = 0; attempt < POST_MUTATION_SEARCH_RETRY_ATTEMPTS; attempt++) { + for (int attempt = 0; attempt < DEFAULT_SEARCH_RETRY_ATTEMPTS; attempt++) { boolean found = results.stream() .anyMatch(r -> r.item() != null && absentSortKey.equals( @@ -1894,15 +1893,22 @@ void writePath_updateNonVectorFieldsOnly_itemStillSearchable() { record.setDescription("Updated description only"); executePut(record); - List> results = - searchVectorsUntilContains( - COSINE_INDEX, request, "metadata-update-item"); - SearchResultItem result = results.stream() - .filter(r -> "metadata-update-item".equals( - r.item().getSk())) - .findFirst() - .orElseThrow(() -> new AssertionError( - "Expected metadata-update-item in search results")); + // Retry until the updated description is visible in search results, + // not just until the item exists (it may return stale data). + SearchResultItem result = null; + for (int attempt = 0; attempt < DEFAULT_SEARCH_RETRY_ATTEMPTS; attempt++) { + List> results = + executeSearch(COSINE_INDEX, request); + result = results.stream() + .filter(r -> "metadata-update-item".equals(r.item().getSk())) + .findFirst() + .orElse(null); + if (result != null && "Updated description only".equals(result.item().getDescription())) { + break; + } + sleepBetweenRetries(attempt); + } + assertThat(result).isNotNull(); assertThat(result.item().getDescription()) .isEqualTo("Updated description only"); } finally {