|
@@ -27,6 +27,7 @@ import org.elasticsearch.ElasticsearchParseException;
|
|
|
import org.elasticsearch.ExceptionsHelper;
|
|
|
import org.elasticsearch.action.ActionListener;
|
|
|
import org.elasticsearch.action.ActionRequest;
|
|
|
+import org.elasticsearch.action.DocumentRequest;
|
|
|
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
|
|
|
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
|
|
|
import org.elasticsearch.action.admin.indices.create.TransportCreateIndexAction;
|
|
@@ -40,6 +41,7 @@ import org.elasticsearch.action.update.UpdateRequest;
|
|
|
import org.elasticsearch.cluster.ClusterService;
|
|
|
import org.elasticsearch.cluster.ClusterState;
|
|
|
import org.elasticsearch.cluster.block.ClusterBlockLevel;
|
|
|
+import org.elasticsearch.cluster.metadata.IndexMetaData;
|
|
|
import org.elasticsearch.cluster.metadata.MappingMetaData;
|
|
|
import org.elasticsearch.cluster.metadata.MetaData;
|
|
|
import org.elasticsearch.cluster.routing.GroupShardsIterator;
|
|
@@ -47,8 +49,10 @@ import org.elasticsearch.cluster.routing.ShardIterator;
|
|
|
import org.elasticsearch.common.inject.Inject;
|
|
|
import org.elasticsearch.common.settings.Settings;
|
|
|
import org.elasticsearch.common.util.concurrent.AtomicArray;
|
|
|
+import org.elasticsearch.index.Index;
|
|
|
import org.elasticsearch.index.shard.ShardId;
|
|
|
import org.elasticsearch.indices.IndexAlreadyExistsException;
|
|
|
+import org.elasticsearch.indices.IndexClosedException;
|
|
|
import org.elasticsearch.rest.RestStatus;
|
|
|
import org.elasticsearch.threadpool.ThreadPool;
|
|
|
import org.elasticsearch.transport.TransportService;
|
|
@@ -96,26 +100,15 @@ public class TransportBulkAction extends HandledTransportAction<BulkRequest, Bul
|
|
|
if (autoCreateIndex.needToCheck()) {
|
|
|
final Set<String> indices = Sets.newHashSet();
|
|
|
for (ActionRequest request : bulkRequest.requests) {
|
|
|
- if (request instanceof IndexRequest) {
|
|
|
- IndexRequest indexRequest = (IndexRequest) request;
|
|
|
- if (!indices.contains(indexRequest.index())) {
|
|
|
- indices.add(indexRequest.index());
|
|
|
- }
|
|
|
- } else if (request instanceof DeleteRequest) {
|
|
|
- DeleteRequest deleteRequest = (DeleteRequest) request;
|
|
|
- if (!indices.contains(deleteRequest.index())) {
|
|
|
- indices.add(deleteRequest.index());
|
|
|
- }
|
|
|
- } else if (request instanceof UpdateRequest) {
|
|
|
- UpdateRequest updateRequest = (UpdateRequest) request;
|
|
|
- if (!indices.contains(updateRequest.index())) {
|
|
|
- indices.add(updateRequest.index());
|
|
|
+ if (request instanceof DocumentRequest) {
|
|
|
+ DocumentRequest req = (DocumentRequest) request;
|
|
|
+ if (!indices.contains(req.index())) {
|
|
|
+ indices.add(req.index());
|
|
|
}
|
|
|
} else {
|
|
|
throw new ElasticsearchException("Parsed unknown request in bulk actions: " + request.getClass().getSimpleName());
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
final AtomicInteger counter = new AtomicInteger(indices.size());
|
|
|
ClusterState state = clusterService.state();
|
|
|
for (final String index : indices) {
|
|
@@ -204,30 +197,33 @@ public class TransportBulkAction extends HandledTransportAction<BulkRequest, Bul
|
|
|
MetaData metaData = clusterState.metaData();
|
|
|
for (int i = 0; i < bulkRequest.requests.size(); i++) {
|
|
|
ActionRequest request = bulkRequest.requests.get(i);
|
|
|
- if (request instanceof IndexRequest) {
|
|
|
- IndexRequest indexRequest = (IndexRequest) request;
|
|
|
- String concreteIndex = concreteIndices.resolveIfAbsent(indexRequest.index(), indexRequest.indicesOptions());
|
|
|
- MappingMetaData mappingMd = null;
|
|
|
- if (metaData.hasIndex(concreteIndex)) {
|
|
|
- mappingMd = metaData.index(concreteIndex).mappingOrDefault(indexRequest.type());
|
|
|
+ if (request instanceof DocumentRequest) {
|
|
|
+ DocumentRequest req = (DocumentRequest) request;
|
|
|
+
|
|
|
+ if (addFailureIfIndexIsClosed(req, bulkRequest, responses, i, concreteIndices, metaData)) {
|
|
|
+ continue;
|
|
|
}
|
|
|
- try {
|
|
|
- indexRequest.process(metaData, mappingMd, allowIdGeneration, concreteIndex);
|
|
|
- } catch (ElasticsearchParseException e) {
|
|
|
- BulkItemResponse.Failure failure = new BulkItemResponse.Failure(concreteIndex, indexRequest.type(), indexRequest.id(), e);
|
|
|
- BulkItemResponse bulkItemResponse = new BulkItemResponse(i, "index", failure);
|
|
|
- responses.set(i, bulkItemResponse);
|
|
|
- // make sure the request gets never processed again
|
|
|
- bulkRequest.requests.set(i, null);
|
|
|
+
|
|
|
+ String concreteIndex = concreteIndices.resolveIfAbsent(req.index(), req.indicesOptions());
|
|
|
+ if (request instanceof IndexRequest) {
|
|
|
+ IndexRequest indexRequest = (IndexRequest) request;
|
|
|
+ MappingMetaData mappingMd = null;
|
|
|
+ if (metaData.hasIndex(concreteIndex)) {
|
|
|
+ mappingMd = metaData.index(concreteIndex).mappingOrDefault(indexRequest.type());
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ indexRequest.process(metaData, mappingMd, allowIdGeneration, concreteIndex);
|
|
|
+ } catch (ElasticsearchParseException e) {
|
|
|
+ BulkItemResponse.Failure failure = new BulkItemResponse.Failure(concreteIndex, indexRequest.type(), indexRequest.id(), e);
|
|
|
+ BulkItemResponse bulkItemResponse = new BulkItemResponse(i, "index", failure);
|
|
|
+ responses.set(i, bulkItemResponse);
|
|
|
+ // make sure the request gets never processed again
|
|
|
+ bulkRequest.requests.set(i, null);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ concreteIndices.resolveIfAbsent(req.index(), req.indicesOptions());
|
|
|
+ req.routing(clusterState.metaData().resolveIndexRouting(req.routing(), req.index()));
|
|
|
}
|
|
|
- } else if (request instanceof DeleteRequest) {
|
|
|
- DeleteRequest deleteRequest = (DeleteRequest) request;
|
|
|
- concreteIndices.resolveIfAbsent(deleteRequest.index(), deleteRequest.indicesOptions());
|
|
|
- deleteRequest.routing(clusterState.metaData().resolveIndexRouting(deleteRequest.routing(), deleteRequest.index()));
|
|
|
- } else if (request instanceof UpdateRequest) {
|
|
|
- UpdateRequest updateRequest = (UpdateRequest) request;
|
|
|
- concreteIndices.resolveIfAbsent(updateRequest.index(), updateRequest.indicesOptions());
|
|
|
- updateRequest.routing(clusterState.metaData().resolveIndexRouting(updateRequest.routing(), updateRequest.index()));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -343,8 +339,35 @@ public class TransportBulkAction extends HandledTransportAction<BulkRequest, Bul
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private static class ConcreteIndices {
|
|
|
+ private boolean addFailureIfIndexIsClosed(DocumentRequest request, BulkRequest bulkRequest, AtomicArray<BulkItemResponse> responses, int idx,
|
|
|
+ final ConcreteIndices concreteIndices,
|
|
|
+ final MetaData metaData) {
|
|
|
+ String concreteIndex = concreteIndices.getConcreteIndex(request.index());
|
|
|
+ boolean isClosed = false;
|
|
|
+ if (concreteIndex == null) {
|
|
|
+ try {
|
|
|
+ concreteIndex = concreteIndices.resolveIfAbsent(request.index(), request.indicesOptions());
|
|
|
+ } catch (IndexClosedException ice) {
|
|
|
+ isClosed = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!isClosed) {
|
|
|
+ IndexMetaData indexMetaData = metaData.index(concreteIndex);
|
|
|
+ isClosed = indexMetaData.getState() == IndexMetaData.State.CLOSE;
|
|
|
+ }
|
|
|
+ if (isClosed) {
|
|
|
+ BulkItemResponse.Failure failure = new BulkItemResponse.Failure(request.index(), request.type(), request.id(),
|
|
|
+ new IndexClosedException(new Index(metaData.index(request.index()).getIndex())));
|
|
|
+ BulkItemResponse bulkItemResponse = new BulkItemResponse(idx, "index", failure);
|
|
|
+ responses.set(idx, bulkItemResponse);
|
|
|
+ // make sure the request gets never processed again
|
|
|
+ bulkRequest.requests.set(idx, null);
|
|
|
+ }
|
|
|
+ return isClosed;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
+ private static class ConcreteIndices {
|
|
|
private final Map<String, String> indices = new HashMap<>();
|
|
|
private final MetaData metaData;
|
|
|
|