31
31
import org .elasticsearch .action .admin .indices .create .CreateIndexResponse ;
32
32
import org .elasticsearch .action .admin .indices .create .TransportCreateIndexAction ;
33
33
import org .elasticsearch .action .delete .DeleteRequest ;
34
+ import org .elasticsearch .action .delete .TransportDeleteAction ;
34
35
import org .elasticsearch .action .index .IndexRequest ;
35
36
import org .elasticsearch .action .support .ActionFilters ;
36
37
import org .elasticsearch .action .support .AutoCreateIndex ;
37
38
import org .elasticsearch .action .support .HandledTransportAction ;
39
+ import org .elasticsearch .action .update .TransportUpdateAction ;
38
40
import org .elasticsearch .action .update .UpdateRequest ;
39
41
import org .elasticsearch .cluster .ClusterService ;
40
42
import org .elasticsearch .cluster .ClusterState ;
43
45
import org .elasticsearch .cluster .metadata .IndexNameExpressionResolver ;
44
46
import org .elasticsearch .cluster .metadata .MappingMetaData ;
45
47
import org .elasticsearch .cluster .metadata .MetaData ;
46
- import org .elasticsearch .cluster .routing .GroupShardsIterator ;
47
- import org .elasticsearch .cluster .routing .ShardIterator ;
48
48
import org .elasticsearch .common .inject .Inject ;
49
49
import org .elasticsearch .common .settings .Settings ;
50
50
import org .elasticsearch .common .util .concurrent .AtomicArray ;
@@ -201,7 +201,7 @@ public void executeBulk(final BulkRequest bulkRequest, final ActionListener<Bulk
201
201
executeBulk (bulkRequest , startTime , listener , new AtomicArray <BulkItemResponse >(bulkRequest .requests .size ()));
202
202
}
203
203
204
- private final long buildTookInMillis (long startTime ) {
204
+ private long buildTookInMillis (long startTime ) {
205
205
// protect ourselves against time going backwards
206
206
return Math .max (1 , System .currentTimeMillis () - startTime );
207
207
}
@@ -215,33 +215,52 @@ private void executeBulk(final BulkRequest bulkRequest, final long startTime, fi
215
215
MetaData metaData = clusterState .metaData ();
216
216
for (int i = 0 ; i < bulkRequest .requests .size (); i ++) {
217
217
ActionRequest request = bulkRequest .requests .get (i );
218
- if (request instanceof DocumentRequest ) {
219
- DocumentRequest req = (DocumentRequest ) request ;
220
-
221
- if (addFailureIfIndexIsUnavailable (req , bulkRequest , responses , i , concreteIndices , metaData )) {
222
- continue ;
218
+ //the request can only be null because we set it to null in the previous step, so it gets ignored
219
+ if (request == null ) {
220
+ continue ;
221
+ }
222
+ DocumentRequest documentRequest = (DocumentRequest ) request ;
223
+ if (addFailureIfIndexIsUnavailable (documentRequest , bulkRequest , responses , i , concreteIndices , metaData )) {
224
+ continue ;
225
+ }
226
+ String concreteIndex = concreteIndices .resolveIfAbsent (documentRequest );
227
+ if (request instanceof IndexRequest ) {
228
+ IndexRequest indexRequest = (IndexRequest ) request ;
229
+ MappingMetaData mappingMd = null ;
230
+ if (metaData .hasIndex (concreteIndex )) {
231
+ mappingMd = metaData .index (concreteIndex ).mappingOrDefault (indexRequest .type ());
223
232
}
224
-
225
- String concreteIndex = concreteIndices .resolveIfAbsent (req );
226
- if (request instanceof IndexRequest ) {
227
- IndexRequest indexRequest = (IndexRequest ) request ;
228
- MappingMetaData mappingMd = null ;
229
- if (metaData .hasIndex (concreteIndex )) {
230
- mappingMd = metaData .index (concreteIndex ).mappingOrDefault (indexRequest .type ());
231
- }
232
- try {
233
- indexRequest .process (metaData , mappingMd , allowIdGeneration , concreteIndex );
234
- } catch (ElasticsearchParseException | RoutingMissingException e ) {
235
- BulkItemResponse .Failure failure = new BulkItemResponse .Failure (concreteIndex , indexRequest .type (), indexRequest .id (), e );
236
- BulkItemResponse bulkItemResponse = new BulkItemResponse (i , "index" , failure );
237
- responses .set (i , bulkItemResponse );
238
- // make sure the request gets never processed again
239
- bulkRequest .requests .set (i , null );
240
- }
241
- } else {
242
- concreteIndices .resolveIfAbsent (req );
243
- req .routing (clusterState .metaData ().resolveIndexRouting (req .routing (), req .index ()));
233
+ try {
234
+ indexRequest .process (metaData , mappingMd , allowIdGeneration , concreteIndex );
235
+ } catch (ElasticsearchParseException | RoutingMissingException e ) {
236
+ BulkItemResponse .Failure failure = new BulkItemResponse .Failure (concreteIndex , indexRequest .type (), indexRequest .id (), e );
237
+ BulkItemResponse bulkItemResponse = new BulkItemResponse (i , "index" , failure );
238
+ responses .set (i , bulkItemResponse );
239
+ // make sure the request gets never processed again
240
+ bulkRequest .requests .set (i , null );
244
241
}
242
+ } else if (request instanceof DeleteRequest ) {
243
+ try {
244
+ TransportDeleteAction .resolveAndValidateRouting (metaData , concreteIndex , (DeleteRequest )request );
245
+ } catch (RoutingMissingException e ) {
246
+ BulkItemResponse .Failure failure = new BulkItemResponse .Failure (concreteIndex , documentRequest .type (), documentRequest .id (), e );
247
+ BulkItemResponse bulkItemResponse = new BulkItemResponse (i , "delete" , failure );
248
+ responses .set (i , bulkItemResponse );
249
+ // make sure the request gets never processed again
250
+ bulkRequest .requests .set (i , null );
251
+ }
252
+ } else if (request instanceof UpdateRequest ) {
253
+ try {
254
+ TransportUpdateAction .resolveAndValidateRouting (metaData , concreteIndex , (UpdateRequest )request );
255
+ } catch (RoutingMissingException e ) {
256
+ BulkItemResponse .Failure failure = new BulkItemResponse .Failure (concreteIndex , documentRequest .type (), documentRequest .id (), e );
257
+ BulkItemResponse bulkItemResponse = new BulkItemResponse (i , "update" , failure );
258
+ responses .set (i , bulkItemResponse );
259
+ // make sure the request gets never processed again
260
+ bulkRequest .requests .set (i , null );
261
+ }
262
+ } else {
263
+ throw new AssertionError ("request type not supported: [" + request .getClass ().getName () + "]" );
245
264
}
246
265
}
247
266
@@ -263,37 +282,16 @@ private void executeBulk(final BulkRequest bulkRequest, final long startTime, fi
263
282
} else if (request instanceof DeleteRequest ) {
264
283
DeleteRequest deleteRequest = (DeleteRequest ) request ;
265
284
String concreteIndex = concreteIndices .getConcreteIndex (deleteRequest .index ());
266
- MappingMetaData mappingMd = clusterState .metaData ().index (concreteIndex ).mappingOrDefault (deleteRequest .type ());
267
- if (mappingMd != null && mappingMd .routing ().required () && deleteRequest .routing () == null ) {
268
- // if routing is required, and no routing on the delete request, we need to broadcast it....
269
- GroupShardsIterator groupShards = clusterService .operationRouting ().broadcastDeleteShards (clusterState , concreteIndex );
270
- for (ShardIterator shardIt : groupShards ) {
271
- List <BulkItemRequest > list = requestsByShard .get (shardIt .shardId ());
272
- if (list == null ) {
273
- list = new ArrayList <>();
274
- requestsByShard .put (shardIt .shardId (), list );
275
- }
276
- list .add (new BulkItemRequest (i , new DeleteRequest (deleteRequest )));
277
- }
278
- } else {
279
- ShardId shardId = clusterService .operationRouting ().indexShards (clusterState , concreteIndex , deleteRequest .type (), deleteRequest .id (), deleteRequest .routing ()).shardId ();
280
- List <BulkItemRequest > list = requestsByShard .get (shardId );
281
- if (list == null ) {
282
- list = new ArrayList <>();
283
- requestsByShard .put (shardId , list );
284
- }
285
- list .add (new BulkItemRequest (i , request ));
285
+ ShardId shardId = clusterService .operationRouting ().indexShards (clusterState , concreteIndex , deleteRequest .type (), deleteRequest .id (), deleteRequest .routing ()).shardId ();
286
+ List <BulkItemRequest > list = requestsByShard .get (shardId );
287
+ if (list == null ) {
288
+ list = new ArrayList <>();
289
+ requestsByShard .put (shardId , list );
286
290
}
291
+ list .add (new BulkItemRequest (i , request ));
287
292
} else if (request instanceof UpdateRequest ) {
288
293
UpdateRequest updateRequest = (UpdateRequest ) request ;
289
294
String concreteIndex = concreteIndices .getConcreteIndex (updateRequest .index ());
290
- MappingMetaData mappingMd = clusterState .metaData ().index (concreteIndex ).mappingOrDefault (updateRequest .type ());
291
- if (mappingMd != null && mappingMd .routing ().required () && updateRequest .routing () == null ) {
292
- BulkItemResponse .Failure failure = new BulkItemResponse .Failure (updateRequest .index (), updateRequest .type (),
293
- updateRequest .id (), new IllegalArgumentException ("routing is required for this item" ));
294
- responses .set (i , new BulkItemResponse (i , updateRequest .type (), failure ));
295
- continue ;
296
- }
297
295
ShardId shardId = clusterService .operationRouting ().indexShards (clusterState , concreteIndex , updateRequest .type (), updateRequest .id (), updateRequest .routing ()).shardId ();
298
296
List <BulkItemRequest > list = requestsByShard .get (shardId );
299
297
if (list == null ) {
0 commit comments