7979import java .util .HashSet ;
8080import java .util .Iterator ;
8181import java .util .List ;
82- import java .util .Locale ;
8382import java .util .Map ;
8483import java .util .Objects ;
8584import java .util .Set ;
@@ -167,7 +166,7 @@ protected void doExecute(Task task, BulkRequest bulkRequest, ActionListener<Bulk
167166 IndexRequest indexRequest = getIndexWriteRequest (actionRequest );
168167 if (indexRequest != null ) {
169168 // Each index request needs to be evaluated, because this method also modifies the IndexRequest
170- boolean indexRequestHasPipeline = resolveRequiredOrDefaultPipeline (actionRequest , indexRequest , metaData );
169+ boolean indexRequestHasPipeline = resolvePipelines (actionRequest , indexRequest , metaData );
171170 hasIndexRequestsWithPipelines |= indexRequestHasPipeline ;
172171 }
173172
@@ -273,16 +272,14 @@ public void onFailure(Exception e) {
273272 }
274273 }
275274
276- static boolean resolveRequiredOrDefaultPipeline (DocWriteRequest <?> originalRequest ,
277- IndexRequest indexRequest ,
278- MetaData metaData ) {
279-
275+ static boolean resolvePipelines (final DocWriteRequest <?> originalRequest , final IndexRequest indexRequest , final MetaData metaData ) {
280276 if (indexRequest .isPipelineResolved () == false ) {
281277 final String requestPipeline = indexRequest .getPipeline ();
282278 indexRequest .setPipeline (IngestService .NOOP_PIPELINE_NAME );
283- boolean requestCanOverridePipeline = true ;
284- String requiredPipeline = null ;
285- // start to look for default or required pipelines via settings found in the index meta data
279+ indexRequest .setFinalPipeline (IngestService .NOOP_PIPELINE_NAME );
280+ String defaultPipeline = null ;
281+ String finalPipeline = null ;
282+ // start to look for default or final pipelines via settings found in the index meta data
286283 IndexMetaData indexMetaData = metaData .indices ().get (originalRequest .index ());
287284 // check the alias for the index request (this is how normal index requests are modeled)
288285 if (indexMetaData == null && indexRequest .index () != null ) {
@@ -302,64 +299,42 @@ static boolean resolveRequiredOrDefaultPipeline(DocWriteRequest<?> originalReque
302299 }
303300 if (indexMetaData != null ) {
304301 final Settings indexSettings = indexMetaData .getSettings ();
305- if (IndexSettings .REQUIRED_PIPELINE .exists (indexSettings )) {
306- // find the required pipeline if one is defined from an existing index
307- requiredPipeline = IndexSettings .REQUIRED_PIPELINE .get (indexSettings );
308- assert IndexSettings .DEFAULT_PIPELINE .get (indexSettings ).equals (IngestService .NOOP_PIPELINE_NAME ) :
309- IndexSettings .DEFAULT_PIPELINE .get (indexSettings );
310- indexRequest .setPipeline (requiredPipeline );
311- requestCanOverridePipeline = false ;
312- } else {
313- // find the default pipeline if one is defined from an existing index
314- String defaultPipeline = IndexSettings .DEFAULT_PIPELINE .get (indexSettings );
302+ if (IndexSettings .DEFAULT_PIPELINE .exists (indexSettings )) {
303+ // find the default pipeline if one is defined from an existing index setting
304+ defaultPipeline = IndexSettings .DEFAULT_PIPELINE .get (indexSettings );
315305 indexRequest .setPipeline (defaultPipeline );
316306 }
307+ if (IndexSettings .FINAL_PIPELINE .exists (indexSettings )) {
308+ // find the final pipeline if one is defined from an existing index setting
309+ finalPipeline = IndexSettings .FINAL_PIPELINE .get (indexSettings );
310+ indexRequest .setFinalPipeline (finalPipeline );
311+ }
317312 } else if (indexRequest .index () != null ) {
318- // the index does not exist yet (and is valid request), so match index templates to look for a default pipeline
313+ // the index does not exist yet (and this is a valid request), so match index templates to look for pipelines
319314 List <IndexTemplateMetaData > templates = MetaDataIndexTemplateService .findTemplates (metaData , indexRequest .index ());
320315 assert (templates != null );
321- // order of templates are highest order first, we have to iterate through them all though
322- String defaultPipeline = null ;
323- for (IndexTemplateMetaData template : templates ) {
316+ // order of templates are highest order first
317+ for (final IndexTemplateMetaData template : templates ) {
324318 final Settings settings = template .settings ();
325- if (requiredPipeline == null && IndexSettings .REQUIRED_PIPELINE .exists (settings )) {
326- requiredPipeline = IndexSettings .REQUIRED_PIPELINE .get (settings );
327- requestCanOverridePipeline = false ;
328- // we can not break in case a lower-order template has a default pipeline that we need to reject
329- } else if (defaultPipeline == null && IndexSettings .DEFAULT_PIPELINE .exists (settings )) {
319+ if (defaultPipeline == null && IndexSettings .DEFAULT_PIPELINE .exists (settings )) {
330320 defaultPipeline = IndexSettings .DEFAULT_PIPELINE .get (settings );
331- // we can not break in case a lower-order template has a required pipeline that we need to reject
321+ // we can not break in case a lower-order template has a final pipeline that we need to collect
322+ }
323+ if (finalPipeline == null && IndexSettings .FINAL_PIPELINE .exists (settings )) {
324+ finalPipeline = IndexSettings .FINAL_PIPELINE .get (settings );
325+ // we can not break in case a lower-order template has a default pipeline that we need to collect
326+ }
327+ if (defaultPipeline != null && finalPipeline != null ) {
328+ // we can break if we have already collected a default and final pipeline
329+ break ;
332330 }
333331 }
334- if (requiredPipeline != null && defaultPipeline != null ) {
335- // we can not have picked up a required and a default pipeline from applying templates
336- final String message = String .format (
337- Locale .ROOT ,
338- "required pipeline [%s] and default pipeline [%s] can not both be set" ,
339- requiredPipeline ,
340- defaultPipeline );
341- throw new IllegalArgumentException (message );
342- }
343- final String pipeline ;
344- if (requiredPipeline != null ) {
345- pipeline = requiredPipeline ;
346- } else {
347- pipeline = defaultPipeline != null ? defaultPipeline : IngestService .NOOP_PIPELINE_NAME ;
348- }
349- indexRequest .setPipeline (pipeline );
332+ indexRequest .setPipeline (defaultPipeline != null ? defaultPipeline : IngestService .NOOP_PIPELINE_NAME );
333+ indexRequest .setFinalPipeline (finalPipeline != null ? finalPipeline : IngestService .NOOP_PIPELINE_NAME );
350334 }
351335
352336 if (requestPipeline != null ) {
353- if (requestCanOverridePipeline == false ) {
354- final String message = String .format (
355- Locale .ROOT ,
356- "request pipeline [%s] can not override required pipeline [%s]" ,
357- requestPipeline ,
358- requiredPipeline );
359- throw new IllegalArgumentException (message );
360- } else {
361- indexRequest .setPipeline (requestPipeline );
362- }
337+ indexRequest .setPipeline (requestPipeline );
363338 }
364339
365340 /*
@@ -375,8 +350,10 @@ static boolean resolveRequiredOrDefaultPipeline(DocWriteRequest<?> originalReque
375350 indexRequest .isPipelineResolved (true );
376351 }
377352
378- // Return whether this index request has a pipeline
379- return IngestService .NOOP_PIPELINE_NAME .equals (indexRequest .getPipeline ()) == false ;
353+
354+ // return whether this index request has a pipeline
355+ return IngestService .NOOP_PIPELINE_NAME .equals (indexRequest .getPipeline ()) == false
356+ || IngestService .NOOP_PIPELINE_NAME .equals (indexRequest .getFinalPipeline ()) == false ;
380357 }
381358
382359 boolean needToCheck () {
0 commit comments