|
27 | 27 | import org.elasticsearch.ExceptionsHelper;
|
28 | 28 | import org.elasticsearch.action.ActionListener;
|
29 | 29 | import org.elasticsearch.action.ActionRequest;
|
| 30 | +import org.elasticsearch.action.DocumentRequest; |
30 | 31 | import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
|
31 | 32 | import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
|
32 | 33 | import org.elasticsearch.action.admin.indices.create.TransportCreateIndexAction;
|
|
40 | 41 | import org.elasticsearch.cluster.ClusterService;
|
41 | 42 | import org.elasticsearch.cluster.ClusterState;
|
42 | 43 | import org.elasticsearch.cluster.block.ClusterBlockLevel;
|
| 44 | +import org.elasticsearch.cluster.metadata.IndexMetaData; |
43 | 45 | import org.elasticsearch.cluster.metadata.MappingMetaData;
|
44 | 46 | import org.elasticsearch.cluster.metadata.MetaData;
|
45 | 47 | import org.elasticsearch.cluster.routing.GroupShardsIterator;
|
46 | 48 | import org.elasticsearch.cluster.routing.ShardIterator;
|
47 | 49 | import org.elasticsearch.common.inject.Inject;
|
48 | 50 | import org.elasticsearch.common.settings.Settings;
|
49 | 51 | import org.elasticsearch.common.util.concurrent.AtomicArray;
|
| 52 | +import org.elasticsearch.index.Index; |
50 | 53 | import org.elasticsearch.index.shard.ShardId;
|
51 | 54 | import org.elasticsearch.indices.IndexAlreadyExistsException;
|
| 55 | +import org.elasticsearch.indices.IndexClosedException; |
52 | 56 | import org.elasticsearch.rest.RestStatus;
|
53 | 57 | import org.elasticsearch.threadpool.ThreadPool;
|
54 | 58 | import org.elasticsearch.transport.TransportService;
|
@@ -96,26 +100,15 @@ protected void doExecute(final BulkRequest bulkRequest, final ActionListener<Bul
|
96 | 100 | if (autoCreateIndex.needToCheck()) {
|
97 | 101 | final Set<String> indices = Sets.newHashSet();
|
98 | 102 | for (ActionRequest request : bulkRequest.requests) {
|
99 |
| - if (request instanceof IndexRequest) { |
100 |
| - IndexRequest indexRequest = (IndexRequest) request; |
101 |
| - if (!indices.contains(indexRequest.index())) { |
102 |
| - indices.add(indexRequest.index()); |
103 |
| - } |
104 |
| - } else if (request instanceof DeleteRequest) { |
105 |
| - DeleteRequest deleteRequest = (DeleteRequest) request; |
106 |
| - if (!indices.contains(deleteRequest.index())) { |
107 |
| - indices.add(deleteRequest.index()); |
108 |
| - } |
109 |
| - } else if (request instanceof UpdateRequest) { |
110 |
| - UpdateRequest updateRequest = (UpdateRequest) request; |
111 |
| - if (!indices.contains(updateRequest.index())) { |
112 |
| - indices.add(updateRequest.index()); |
| 103 | + if (request instanceof DocumentRequest) { |
| 104 | + DocumentRequest req = (DocumentRequest) request; |
| 105 | + if (!indices.contains(req.index())) { |
| 106 | + indices.add(req.index()); |
113 | 107 | }
|
114 | 108 | } else {
|
115 | 109 | throw new ElasticsearchException("Parsed unknown request in bulk actions: " + request.getClass().getSimpleName());
|
116 | 110 | }
|
117 | 111 | }
|
118 |
| - |
119 | 112 | final AtomicInteger counter = new AtomicInteger(indices.size());
|
120 | 113 | ClusterState state = clusterService.state();
|
121 | 114 | for (final String index : indices) {
|
@@ -204,30 +197,33 @@ private void executeBulk(final BulkRequest bulkRequest, final long startTime, fi
|
204 | 197 | MetaData metaData = clusterState.metaData();
|
205 | 198 | for (int i = 0; i < bulkRequest.requests.size(); i++) {
|
206 | 199 | ActionRequest request = bulkRequest.requests.get(i);
|
207 |
| - if (request instanceof IndexRequest) { |
208 |
| - IndexRequest indexRequest = (IndexRequest) request; |
209 |
| - String concreteIndex = concreteIndices.resolveIfAbsent(indexRequest.index(), indexRequest.indicesOptions()); |
210 |
| - MappingMetaData mappingMd = null; |
211 |
| - if (metaData.hasIndex(concreteIndex)) { |
212 |
| - mappingMd = metaData.index(concreteIndex).mappingOrDefault(indexRequest.type()); |
| 200 | + if (request instanceof DocumentRequest) { |
| 201 | + DocumentRequest req = (DocumentRequest) request; |
| 202 | + |
| 203 | + if (addFailureIfIndexIsClosed(req, bulkRequest, responses, i, concreteIndices, metaData)) { |
| 204 | + continue; |
213 | 205 | }
|
214 |
| - try { |
215 |
| - indexRequest.process(metaData, mappingMd, allowIdGeneration, concreteIndex); |
216 |
| - } catch (ElasticsearchParseException e) { |
217 |
| - BulkItemResponse.Failure failure = new BulkItemResponse.Failure(concreteIndex, indexRequest.type(), indexRequest.id(), e); |
218 |
| - BulkItemResponse bulkItemResponse = new BulkItemResponse(i, "index", failure); |
219 |
| - responses.set(i, bulkItemResponse); |
220 |
| - // make sure the request gets never processed again |
221 |
| - bulkRequest.requests.set(i, null); |
| 206 | + |
| 207 | + String concreteIndex = concreteIndices.resolveIfAbsent(req.index(), req.indicesOptions()); |
| 208 | + if (request instanceof IndexRequest) { |
| 209 | + IndexRequest indexRequest = (IndexRequest) request; |
| 210 | + MappingMetaData mappingMd = null; |
| 211 | + if (metaData.hasIndex(concreteIndex)) { |
| 212 | + mappingMd = metaData.index(concreteIndex).mappingOrDefault(indexRequest.type()); |
| 213 | + } |
| 214 | + try { |
| 215 | + indexRequest.process(metaData, mappingMd, allowIdGeneration, concreteIndex); |
| 216 | + } catch (ElasticsearchParseException e) { |
| 217 | + BulkItemResponse.Failure failure = new BulkItemResponse.Failure(concreteIndex, indexRequest.type(), indexRequest.id(), e); |
| 218 | + BulkItemResponse bulkItemResponse = new BulkItemResponse(i, "index", failure); |
| 219 | + responses.set(i, bulkItemResponse); |
| 220 | + // make sure the request gets never processed again |
| 221 | + bulkRequest.requests.set(i, null); |
| 222 | + } |
| 223 | + } else { |
| 224 | + concreteIndices.resolveIfAbsent(req.index(), req.indicesOptions()); |
| 225 | + req.routing(clusterState.metaData().resolveIndexRouting(req.routing(), req.index())); |
222 | 226 | }
|
223 |
| - } else if (request instanceof DeleteRequest) { |
224 |
| - DeleteRequest deleteRequest = (DeleteRequest) request; |
225 |
| - concreteIndices.resolveIfAbsent(deleteRequest.index(), deleteRequest.indicesOptions()); |
226 |
| - deleteRequest.routing(clusterState.metaData().resolveIndexRouting(deleteRequest.routing(), deleteRequest.index())); |
227 |
| - } else if (request instanceof UpdateRequest) { |
228 |
| - UpdateRequest updateRequest = (UpdateRequest) request; |
229 |
| - concreteIndices.resolveIfAbsent(updateRequest.index(), updateRequest.indicesOptions()); |
230 |
| - updateRequest.routing(clusterState.metaData().resolveIndexRouting(updateRequest.routing(), updateRequest.index())); |
231 | 227 | }
|
232 | 228 | }
|
233 | 229 |
|
@@ -343,8 +339,35 @@ private void finishHim() {
|
343 | 339 | }
|
344 | 340 | }
|
345 | 341 |
|
346 |
| - private static class ConcreteIndices { |
| 342 | + private boolean addFailureIfIndexIsClosed(DocumentRequest request, BulkRequest bulkRequest, AtomicArray<BulkItemResponse> responses, int idx, |
| 343 | + final ConcreteIndices concreteIndices, |
| 344 | + final MetaData metaData) { |
| 345 | + String concreteIndex = concreteIndices.getConcreteIndex(request.index()); |
| 346 | + boolean isClosed = false; |
| 347 | + if (concreteIndex == null) { |
| 348 | + try { |
| 349 | + concreteIndex = concreteIndices.resolveIfAbsent(request.index(), request.indicesOptions()); |
| 350 | + } catch (IndexClosedException ice) { |
| 351 | + isClosed = true; |
| 352 | + } |
| 353 | + } |
| 354 | + if (!isClosed) { |
| 355 | + IndexMetaData indexMetaData = metaData.index(concreteIndex); |
| 356 | + isClosed = indexMetaData.getState() == IndexMetaData.State.CLOSE; |
| 357 | + } |
| 358 | + if (isClosed) { |
| 359 | + BulkItemResponse.Failure failure = new BulkItemResponse.Failure(request.index(), request.type(), request.id(), |
| 360 | + new IndexClosedException(new Index(metaData.index(request.index()).getIndex()))); |
| 361 | + BulkItemResponse bulkItemResponse = new BulkItemResponse(idx, "index", failure); |
| 362 | + responses.set(idx, bulkItemResponse); |
| 363 | + // make sure the request gets never processed again |
| 364 | + bulkRequest.requests.set(idx, null); |
| 365 | + } |
| 366 | + return isClosed; |
| 367 | + } |
| 368 | + |
347 | 369 |
|
| 370 | + private static class ConcreteIndices { |
348 | 371 | private final Map<String, String> indices = new HashMap<>();
|
349 | 372 | private final MetaData metaData;
|
350 | 373 |
|
|
0 commit comments