Skip to content

Commit 926d142

Browse files
Fix GCS Mock Batch Delete Behavior (elastic#50034)
Batch deletes get a response for every delete request, not just those that actually hit an existing blob. The fact that we only responded for existing blobs leads to a degenerate response that throws a parse exception if a batch delete only contains non-existant blobs.
1 parent 64e1a77 commit 926d142

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

plugins/repository-gcs/src/test/java/org/elasticsearch/repositories/gcs/GoogleCloudStorageBlobStoreRepositoryTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import com.sun.net.httpserver.HttpHandler;
2727
import fixture.gcs.FakeOAuth2HttpHandler;
2828
import fixture.gcs.GoogleCloudStorageHttpHandler;
29+
import org.elasticsearch.action.ActionRunnable;
30+
import org.elasticsearch.action.support.PlainActionFuture;
2931
import org.elasticsearch.cluster.metadata.RepositoryMetaData;
3032
import org.elasticsearch.cluster.service.ClusterService;
3133
import org.elasticsearch.common.SuppressForbidden;
@@ -37,7 +39,9 @@
3739
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
3840
import org.elasticsearch.env.Environment;
3941
import org.elasticsearch.plugins.Plugin;
42+
import org.elasticsearch.repositories.RepositoriesService;
4043
import org.elasticsearch.repositories.Repository;
44+
import org.elasticsearch.repositories.blobstore.BlobStoreRepository;
4145
import org.elasticsearch.repositories.blobstore.ESMockAPIBasedRepositoryIntegTestCase;
4246
import org.threeten.bp.Duration;
4347

@@ -101,6 +105,15 @@ protected Settings nodeSettings(int nodeOrdinal) {
101105
return settings.build();
102106
}
103107

108+
public void testDeleteSingleItem() {
109+
final String repoName = createRepository(randomName());
110+
final RepositoriesService repositoriesService = internalCluster().getMasterNodeInstance(RepositoriesService.class);
111+
final BlobStoreRepository repository = (BlobStoreRepository) repositoriesService.repository(repoName);
112+
PlainActionFuture.get(f -> repository.threadPool().generic().execute(ActionRunnable.run(f, () ->
113+
repository.blobStore().blobContainer(repository.basePath()).deleteBlobsIgnoringIfNotExists(Collections.singletonList("foo"))
114+
)));
115+
}
116+
104117
public void testChunkSize() {
105118
// default chunk size
106119
RepositoryMetaData repositoryMetaData = new RepositoryMetaData("repo", GoogleCloudStorageRepository.TYPE, Settings.EMPTY);

test/fixtures/gcs-fixture/src/main/java/fixture/gcs/GoogleCloudStorageHttpHandler.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,9 @@ public void handle(final HttpExchange exchange) throws IOException {
167167
} else if (line.startsWith("DELETE")) {
168168
final String name = line.substring(line.indexOf(uri) + uri.length(), line.lastIndexOf(" HTTP"));
169169
if (Strings.hasText(name)) {
170-
if (blobs.entrySet().removeIf(blob -> blob.getKey().equals(URLDecoder.decode(name, UTF_8)))) {
171-
batch.append("HTTP/1.1 204 NO_CONTENT").append('\n');
172-
batch.append('\n');
173-
}
170+
blobs.remove(URLDecoder.decode(name, UTF_8));
171+
batch.append("HTTP/1.1 204 NO_CONTENT").append('\n');
172+
batch.append('\n');
174173
}
175174
}
176175
}

0 commit comments

Comments
 (0)