45
45
import org .elasticsearch .common .Nullable ;
46
46
import org .elasticsearch .common .breaker .CircuitBreaker ;
47
47
import org .elasticsearch .common .bytes .BytesReference ;
48
+ import org .elasticsearch .common .collect .Tuple ;
48
49
import org .elasticsearch .common .component .AbstractLifecycleComponent ;
49
50
import org .elasticsearch .common .io .FileSystemUtils ;
50
51
import org .elasticsearch .common .io .stream .BytesStreamOutput ;
78
79
import org .elasticsearch .index .IndexSettings ;
79
80
import org .elasticsearch .index .analysis .AnalysisRegistry ;
80
81
import org .elasticsearch .index .cache .request .ShardRequestCache ;
82
+ import org .elasticsearch .index .engine .EngineFactory ;
83
+ import org .elasticsearch .index .engine .InternalEngineFactory ;
81
84
import org .elasticsearch .index .fielddata .IndexFieldDataCache ;
82
85
import org .elasticsearch .index .flush .FlushStats ;
83
86
import org .elasticsearch .index .get .GetStats ;
101
104
import org .elasticsearch .indices .mapper .MapperRegistry ;
102
105
import org .elasticsearch .indices .recovery .PeerRecoveryTargetService ;
103
106
import org .elasticsearch .indices .recovery .RecoveryState ;
107
+ import org .elasticsearch .plugins .EnginePlugin ;
104
108
import org .elasticsearch .plugins .PluginsService ;
105
109
import org .elasticsearch .repositories .RepositoriesService ;
106
110
import org .elasticsearch .script .ScriptService ;
115
119
import java .io .IOException ;
116
120
import java .nio .file .Files ;
117
121
import java .util .ArrayList ;
122
+ import java .util .Collection ;
118
123
import java .util .HashMap ;
119
124
import java .util .Iterator ;
120
125
import java .util .List ;
126
+ import java .util .Locale ;
121
127
import java .util .Map ;
128
+ import java .util .Objects ;
129
+ import java .util .Optional ;
122
130
import java .util .Set ;
123
131
import java .util .concurrent .CountDownLatch ;
124
132
import java .util .concurrent .ExecutorService ;
@@ -169,6 +177,7 @@ public class IndicesService extends AbstractLifecycleComponent
169
177
private final IndicesRequestCache indicesRequestCache ;
170
178
private final IndicesQueryCache indicesQueryCache ;
171
179
private final MetaStateService metaStateService ;
180
+ private final Collection <EnginePlugin > enginePlugins ;
172
181
173
182
@ Override
174
183
protected void doStart () {
@@ -180,7 +189,8 @@ public IndicesService(Settings settings, PluginsService pluginsService, NodeEnvi
180
189
AnalysisRegistry analysisRegistry , IndexNameExpressionResolver indexNameExpressionResolver ,
181
190
MapperRegistry mapperRegistry , NamedWriteableRegistry namedWriteableRegistry , ThreadPool threadPool ,
182
191
IndexScopedSettings indexScopedSettings , CircuitBreakerService circuitBreakerService , BigArrays bigArrays ,
183
- ScriptService scriptService , Client client , MetaStateService metaStateService ) {
192
+ ScriptService scriptService , Client client , MetaStateService metaStateService ,
193
+ Collection <EnginePlugin > enginePlugins ) {
184
194
super (settings );
185
195
this .threadPool = threadPool ;
186
196
this .pluginsService = pluginsService ;
@@ -211,6 +221,7 @@ public void onRemoval(ShardId shardId, String fieldName, boolean wasEvicted, lon
211
221
this .cleanInterval = INDICES_CACHE_CLEAN_INTERVAL_SETTING .get (settings );
212
222
this .cacheCleaner = new CacheCleaner (indicesFieldDataCache , indicesRequestCache , logger , threadPool , this .cleanInterval );
213
223
this .metaStateService = metaStateService ;
224
+ this .enginePlugins = enginePlugins ;
214
225
}
215
226
216
227
@ Override
@@ -437,7 +448,7 @@ private synchronized IndexService createIndexService(final String reason,
437
448
idxSettings .getNumberOfReplicas (),
438
449
reason );
439
450
440
- final IndexModule indexModule = new IndexModule (idxSettings , analysisRegistry );
451
+ final IndexModule indexModule = new IndexModule (idxSettings , analysisRegistry , getEngineFactory ( idxSettings ) );
441
452
for (IndexingOperationListener operationListener : indexingOperationListeners ) {
442
453
indexModule .addIndexOperationListener (operationListener );
443
454
}
@@ -461,6 +472,34 @@ private synchronized IndexService createIndexService(final String reason,
461
472
);
462
473
}
463
474
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
+
464
503
/**
465
504
* creates a new mapper service for the given index, in order to do administrative work like mapping updates.
466
505
* 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,
469
508
*/
470
509
public synchronized MapperService createIndexMapperService (IndexMetaData indexMetaData ) throws IOException {
471
510
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 ) );
473
512
pluginsService .onIndexModule (indexModule );
474
513
return indexModule .newIndexMapperService (xContentRegistry , mapperRegistry , scriptService );
475
514
}
0 commit comments