Skip to content

Commit 5df3384

Browse files
committed
Add test for batch delete failure metrics/behaviour
1 parent e3cb397 commit 5df3384

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

modules/repository-azure/src/internalClusterTest/java/org/elasticsearch/repositories/azure/AzureBlobStoreRepositoryMetricsTests.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
import com.sun.net.httpserver.HttpHandler;
1414

1515
import org.elasticsearch.cluster.node.DiscoveryNode;
16+
import org.elasticsearch.common.Randomness;
1617
import org.elasticsearch.common.blobstore.BlobContainer;
1718
import org.elasticsearch.common.blobstore.BlobPath;
1819
import org.elasticsearch.common.blobstore.OperationPurpose;
20+
import org.elasticsearch.common.bytes.BytesArray;
1921
import org.elasticsearch.common.bytes.BytesReference;
2022
import org.elasticsearch.core.SuppressForbidden;
2123
import org.elasticsearch.plugins.PluginsService;
@@ -31,6 +33,7 @@
3133
import java.io.IOException;
3234
import java.nio.ByteBuffer;
3335
import java.nio.charset.StandardCharsets;
36+
import java.util.ArrayList;
3437
import java.util.List;
3538
import java.util.Map;
3639
import java.util.Queue;
@@ -43,6 +46,7 @@
4346
import java.util.stream.IntStream;
4447

4548
import static org.elasticsearch.repositories.azure.AbstractAzureServerTestCase.randomBlobContent;
49+
import static org.elasticsearch.repositories.blobstore.BlobStoreTestUtil.randomPurpose;
4650
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
4751
import static org.hamcrest.Matchers.hasSize;
4852
import static org.hamcrest.Matchers.lessThanOrEqualTo;
@@ -225,6 +229,34 @@ public void testRequestTimeIsAccurate() throws IOException {
225229
assertThat(recordedRequestTime, lessThanOrEqualTo(elapsedTimeMillis));
226230
}
227231

232+
public void testBatchDeleteFailure() throws IOException {
233+
final String repository = createRepository(randomRepositoryName());
234+
final String dataNodeName = internalCluster().getNodeNameThat(DiscoveryNode::canContainData);
235+
final BlobContainer container = getBlobContainer(dataNodeName, repository);
236+
237+
final List<String> blobsToDelete = new ArrayList<>();
238+
for (int i = 0; i < 10; i++) {
239+
byte[] bytes = randomBytes(randomInt(100));
240+
String blobName = "index-" + randomAlphaOfLength(10);
241+
container.writeBlob(randomPurpose(), blobName, new BytesArray(bytes), false);
242+
blobsToDelete.add(blobName);
243+
}
244+
Randomness.shuffle(blobsToDelete);
245+
clearMetrics(dataNodeName);
246+
247+
// Exhaust the retries
248+
IntStream.range(0, MAX_RETRIES + 1).forEach(i -> requestHandlers.offer(new FixedRequestHandler(RestStatus.INTERNAL_SERVER_ERROR)));
249+
250+
final OperationPurpose deletePurpose = randomPurpose();
251+
assertThrows(IOException.class, () -> container.deleteBlobsIgnoringIfNotExists(deletePurpose, blobsToDelete.iterator()));
252+
253+
metricsAsserter(dataNodeName, deletePurpose, AzureBlobStore.Operation.BLOB_BATCH, repository).expectMetrics()
254+
.withRequests(MAX_RETRIES + 1)
255+
.withExceptions(MAX_RETRIES + 1)
256+
.withThrottles(0)
257+
.forResult(MetricsAsserter.Result.Exception);
258+
}
259+
228260
private void clearMetrics(String discoveryNode) {
229261
internalCluster().getInstance(PluginsService.class, discoveryNode)
230262
.filterPlugins(TestTelemetryPlugin.class)

0 commit comments

Comments
 (0)