4545import org .elasticsearch .common .Nullable ;
4646import org .elasticsearch .common .breaker .CircuitBreaker ;
4747import org .elasticsearch .common .bytes .BytesReference ;
48+ import org .elasticsearch .common .collect .Tuple ;
4849import org .elasticsearch .common .component .AbstractLifecycleComponent ;
4950import org .elasticsearch .common .io .FileSystemUtils ;
5051import org .elasticsearch .common .io .stream .BytesStreamOutput ;
7879import org .elasticsearch .index .IndexSettings ;
7980import org .elasticsearch .index .analysis .AnalysisRegistry ;
8081import org .elasticsearch .index .cache .request .ShardRequestCache ;
82+ import org .elasticsearch .index .engine .EngineFactory ;
83+ import org .elasticsearch .index .engine .InternalEngineFactory ;
8184import org .elasticsearch .index .fielddata .IndexFieldDataCache ;
8285import org .elasticsearch .index .flush .FlushStats ;
8386import org .elasticsearch .index .get .GetStats ;
101104import org .elasticsearch .indices .mapper .MapperRegistry ;
102105import org .elasticsearch .indices .recovery .PeerRecoveryTargetService ;
103106import org .elasticsearch .indices .recovery .RecoveryState ;
107+ import org .elasticsearch .plugins .EnginePlugin ;
104108import org .elasticsearch .plugins .PluginsService ;
105109import org .elasticsearch .repositories .RepositoriesService ;
106110import org .elasticsearch .script .ScriptService ;
115119import java .io .IOException ;
116120import java .nio .file .Files ;
117121import java .util .ArrayList ;
122+ import java .util .Collection ;
118123import java .util .HashMap ;
119124import java .util .Iterator ;
120125import java .util .List ;
126+ import java .util .Locale ;
121127import java .util .Map ;
128+ import java .util .Objects ;
129+ import java .util .Optional ;
122130import java .util .Set ;
123131import java .util .concurrent .CountDownLatch ;
124132import java .util .concurrent .ExecutorService ;
@@ -169,6 +177,7 @@ public class IndicesService extends AbstractLifecycleComponent
169177 private final IndicesRequestCache indicesRequestCache ;
170178 private final IndicesQueryCache indicesQueryCache ;
171179 private final MetaStateService metaStateService ;
180+ private final Collection <EnginePlugin > enginePlugins ;
172181
173182 @ Override
174183 protected void doStart () {
@@ -180,7 +189,8 @@ public IndicesService(Settings settings, PluginsService pluginsService, NodeEnvi
180189 AnalysisRegistry analysisRegistry , IndexNameExpressionResolver indexNameExpressionResolver ,
181190 MapperRegistry mapperRegistry , NamedWriteableRegistry namedWriteableRegistry , ThreadPool threadPool ,
182191 IndexScopedSettings indexScopedSettings , CircuitBreakerService circuitBreakerService , BigArrays bigArrays ,
183- ScriptService scriptService , Client client , MetaStateService metaStateService ) {
192+ ScriptService scriptService , Client client , MetaStateService metaStateService ,
193+ Collection <EnginePlugin > enginePlugins ) {
184194 super (settings );
185195 this .threadPool = threadPool ;
186196 this .pluginsService = pluginsService ;
@@ -211,6 +221,7 @@ public void onRemoval(ShardId shardId, String fieldName, boolean wasEvicted, lon
211221 this .cleanInterval = INDICES_CACHE_CLEAN_INTERVAL_SETTING .get (settings );
212222 this .cacheCleaner = new CacheCleaner (indicesFieldDataCache , indicesRequestCache , logger , threadPool , this .cleanInterval );
213223 this .metaStateService = metaStateService ;
224+ this .enginePlugins = enginePlugins ;
214225 }
215226
216227 @ Override
@@ -437,7 +448,7 @@ private synchronized IndexService createIndexService(final String reason,
437448 idxSettings .getNumberOfReplicas (),
438449 reason );
439450
440- final IndexModule indexModule = new IndexModule (idxSettings , analysisRegistry );
451+ final IndexModule indexModule = new IndexModule (idxSettings , analysisRegistry , getEngineFactory ( idxSettings ) );
441452 for (IndexingOperationListener operationListener : indexingOperationListeners ) {
442453 indexModule .addIndexOperationListener (operationListener );
443454 }
@@ -461,6 +472,34 @@ private synchronized IndexService createIndexService(final String reason,
461472 );
462473 }
463474
475+ private EngineFactory getEngineFactory (final IndexSettings idxSettings ) {
476+ final List <Tuple <EnginePlugin , Optional <EngineFactory >>> engineFactories =
477+ enginePlugins
478+ .stream ()
479+ .map (p -> Tuple .tuple (p , p .getEngineFactory (idxSettings )))
480+ .filter (t -> Objects .requireNonNull (t .v2 ()).isPresent ())
481+ .collect (Collectors .toList ());
482+ if (engineFactories .isEmpty ()) {
483+ return new InternalEngineFactory ();
484+ } else if (engineFactories .size () == 1 ) {
485+ assert engineFactories .get (0 ).v2 ().isPresent ();
486+ return engineFactories .get (0 ).v2 ().get ();
487+ } else {
488+ final String message = String .format (
489+ Locale .ROOT ,
490+ "multiple plugins provided engine factories for %s: %s" ,
491+ idxSettings .getIndex (),
492+ engineFactories
493+ .stream ()
494+ .map (t -> {
495+ assert t .v2 ().isPresent ();
496+ return "[" + t .v1 ().getClass ().getName () + "/" + t .v2 ().get ().getClass ().getName () + "]" ;
497+ })
498+ .collect (Collectors .joining ("," )));
499+ throw new IllegalStateException (message );
500+ }
501+ }
502+
464503 /**
465504 * creates a new mapper service for the given index, in order to do administrative work like mapping updates.
466505 * This *should not* be used for document parsing. Doing so will result in an exception.
@@ -469,7 +508,7 @@ private synchronized IndexService createIndexService(final String reason,
469508 */
470509 public synchronized MapperService createIndexMapperService (IndexMetaData indexMetaData ) throws IOException {
471510 final IndexSettings idxSettings = new IndexSettings (indexMetaData , this .settings , indexScopeSetting );
472- final IndexModule indexModule = new IndexModule (idxSettings , analysisRegistry );
511+ final IndexModule indexModule = new IndexModule (idxSettings , analysisRegistry , getEngineFactory ( idxSettings ) );
473512 pluginsService .onIndexModule (indexModule );
474513 return indexModule .newIndexMapperService (xContentRegistry , mapperRegistry , scriptService );
475514 }
0 commit comments