diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/SnapshotIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/SnapshotIT.java index f9679cf5eb61c..44562c2c16156 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/SnapshotIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/SnapshotIT.java @@ -146,7 +146,7 @@ public void testCleanupRepository() throws IOException { assertThat(response.result().blobs(), equalTo(0L)); } - public void testCreateSnapshot() throws IOException { + public void testCreateSnapshot() throws Exception { String repository = "test_repository"; assertTrue(createTestRepository(repository, FsRepository.TYPE, "{\"location\": \".\"}").isAcknowledged()); @@ -163,12 +163,23 @@ public void testCreateSnapshot() throws IOException { CreateSnapshotResponse response = createTestSnapshot(request); assertEquals(waitForCompletion ? RestStatus.OK : RestStatus.ACCEPTED, response.status()); if (waitForCompletion == false) { - // If we don't wait for the snapshot to complete we have to cancel it to not leak the snapshot task - AcknowledgedResponse deleteResponse = execute( - new DeleteSnapshotRequest(repository, snapshot), - highLevelClient().snapshot()::delete, highLevelClient().snapshot()::deleteAsync - ); - assertTrue(deleteResponse.isAcknowledged()); + // busy assert on the delete because a known race condition could cause the delete request to not see + // the snapshot if delete and snapshot finalization happen at the same time + // See https://github.com/elastic/elasticsearch/issues/53509#issuecomment-603899620 for details + // TODO: Remove busy assert in 7.x+ once this race is fixed + assertBusy(() -> { + // If we don't wait for the snapshot to complete we have to cancel it to not leak the snapshot task + AcknowledgedResponse deleteResponse; + try { + deleteResponse = execute( + new DeleteSnapshotRequest(repository, snapshot), + highLevelClient().snapshot()::delete, highLevelClient().snapshot()::deleteAsync + ); + } catch (Exception e) { + throw new AssertionError(e); + } + assertTrue(deleteResponse.isAcknowledged()); + }); } }