24
24
import org .elasticsearch .common .Priority ;
25
25
import org .elasticsearch .common .Strings ;
26
26
import org .elasticsearch .common .compress .CompressedXContent ;
27
+ import org .elasticsearch .common .settings .Settings ;
27
28
import org .elasticsearch .core .IOUtils ;
28
29
import org .elasticsearch .core .TimeValue ;
29
30
import org .elasticsearch .index .Index ;
31
+ import org .elasticsearch .index .IndexSettingProvider ;
32
+ import org .elasticsearch .index .IndexSettingProviders ;
30
33
import org .elasticsearch .index .IndexVersion ;
31
34
import org .elasticsearch .index .mapper .DocumentMapper ;
32
35
import org .elasticsearch .index .mapper .MapperService ;
@@ -53,10 +56,14 @@ public class MetadataMappingService {
53
56
private final MasterServiceTaskQueue <PutMappingClusterStateUpdateTask > taskQueue ;
54
57
55
58
@ Inject
56
- public MetadataMappingService (ClusterService clusterService , IndicesService indicesService ) {
59
+ public MetadataMappingService (
60
+ ClusterService clusterService ,
61
+ IndicesService indicesService ,
62
+ IndexSettingProviders indexSettingProviders
63
+ ) {
57
64
this .clusterService = clusterService ;
58
65
this .indicesService = indicesService ;
59
- this .taskQueue = clusterService .createTaskQueue ("put-mapping" , Priority .HIGH , new PutMappingExecutor ());
66
+ this .taskQueue = clusterService .createTaskQueue ("put-mapping" , Priority .HIGH , new PutMappingExecutor (indexSettingProviders ));
60
67
}
61
68
62
69
record PutMappingClusterStateUpdateTask (PutMappingClusterStateUpdateRequest request , ActionListener <AcknowledgedResponse > listener )
@@ -96,6 +103,16 @@ public TimeValue ackTimeout() {
96
103
}
97
104
98
105
class PutMappingExecutor implements ClusterStateTaskExecutor <PutMappingClusterStateUpdateTask > {
106
+ private final IndexSettingProviders indexSettingProviders ;
107
+
108
+ PutMappingExecutor () {
109
+ this (IndexSettingProviders .EMPTY );
110
+ }
111
+
112
+ PutMappingExecutor (IndexSettingProviders indexSettingProviders ) {
113
+ this .indexSettingProviders = indexSettingProviders ;
114
+ }
115
+
99
116
@ Override
100
117
public ClusterState execute (BatchExecutionContext <PutMappingClusterStateUpdateTask > batchExecutionContext ) throws Exception {
101
118
Map <Index , MapperService > indexMapperServices = new HashMap <>();
@@ -126,7 +143,7 @@ public ClusterState execute(BatchExecutionContext<PutMappingClusterStateUpdateTa
126
143
}
127
144
}
128
145
129
- private static ClusterState applyRequest (
146
+ private ClusterState applyRequest (
130
147
ClusterState currentState ,
131
148
PutMappingClusterStateUpdateRequest request ,
132
149
Map <Index , MapperService > indexMapperServices
@@ -200,9 +217,26 @@ private static ClusterState applyRequest(
200
217
indexMetadataBuilder .putMapping (new MappingMetadata (docMapper ));
201
218
indexMetadataBuilder .putInferenceFields (docMapper .mappers ().inferenceFields ());
202
219
}
220
+ boolean updatedSettings = false ;
221
+ final Settings .Builder additionalIndexSettings = Settings .builder ();
203
222
if (updatedMapping ) {
204
223
indexMetadataBuilder .mappingVersion (1 + indexMetadataBuilder .mappingVersion ())
205
224
.mappingsUpdatedVersion (IndexVersion .current ());
225
+ for (IndexSettingProvider provider : indexSettingProviders .getIndexSettingProviders ()) {
226
+ Settings newAdditionalSettings = provider .onUpdateMappings (indexMetadata , docMapper );
227
+ if (newAdditionalSettings .isEmpty () == false ) {
228
+ MetadataCreateIndexService .validateAdditionalSettings (provider , newAdditionalSettings , additionalIndexSettings );
229
+ additionalIndexSettings .put (newAdditionalSettings );
230
+ updatedSettings = true ;
231
+ }
232
+ }
233
+ }
234
+ if (updatedSettings ) {
235
+ final Settings .Builder indexSettingsBuilder = Settings .builder ();
236
+ indexSettingsBuilder .put (indexMetadata .getSettings ());
237
+ indexSettingsBuilder .put (additionalIndexSettings .build ());
238
+ indexMetadataBuilder .settings (indexSettingsBuilder .build ());
239
+ indexMetadataBuilder .settingsVersion (1 + indexMetadata .getSettingsVersion ());
206
240
}
207
241
/*
208
242
* This implicitly increments the index metadata version and builds the index metadata. This means that we need to have
0 commit comments