24
24
import org .elasticsearch .cluster .block .ClusterBlockException ;
25
25
import org .elasticsearch .cluster .block .ClusterBlockLevel ;
26
26
import org .elasticsearch .cluster .health .ClusterStateHealth ;
27
+ import org .elasticsearch .cluster .metadata .ComposableIndexTemplate ;
27
28
import org .elasticsearch .cluster .metadata .DataStream ;
28
29
import org .elasticsearch .cluster .metadata .DataStreamFailureStoreSettings ;
29
30
import org .elasticsearch .cluster .metadata .DataStreamGlobalRetentionSettings ;
39
40
import org .elasticsearch .core .Tuple ;
40
41
import org .elasticsearch .index .Index ;
41
42
import org .elasticsearch .index .IndexMode ;
43
+ import org .elasticsearch .index .IndexSettingProvider ;
44
+ import org .elasticsearch .index .IndexSettingProviders ;
45
+ import org .elasticsearch .index .IndexSettings ;
42
46
import org .elasticsearch .indices .SystemDataStreamDescriptor ;
43
47
import org .elasticsearch .indices .SystemIndices ;
44
48
import org .elasticsearch .injection .guice .Inject ;
52
56
import java .util .Comparator ;
53
57
import java .util .HashMap ;
54
58
import java .util .List ;
59
+ import java .util .Locale ;
55
60
import java .util .Map ;
56
61
import java .util .stream .Collectors ;
57
62
@@ -67,6 +72,7 @@ public class TransportGetDataStreamsAction extends TransportMasterNodeReadAction
67
72
private final ClusterSettings clusterSettings ;
68
73
private final DataStreamGlobalRetentionSettings globalRetentionSettings ;
69
74
private final DataStreamFailureStoreSettings dataStreamFailureStoreSettings ;
75
+ private final IndexSettingProviders indexSettingProviders ;
70
76
private final Client client ;
71
77
72
78
@ Inject
@@ -79,6 +85,7 @@ public TransportGetDataStreamsAction(
79
85
SystemIndices systemIndices ,
80
86
DataStreamGlobalRetentionSettings globalRetentionSettings ,
81
87
DataStreamFailureStoreSettings dataStreamFailureStoreSettings ,
88
+ IndexSettingProviders indexSettingProviders ,
82
89
Client client
83
90
) {
84
91
super (
@@ -96,6 +103,7 @@ public TransportGetDataStreamsAction(
96
103
this .globalRetentionSettings = globalRetentionSettings ;
97
104
clusterSettings = clusterService .getClusterSettings ();
98
105
this .dataStreamFailureStoreSettings = dataStreamFailureStoreSettings ;
106
+ this .indexSettingProviders = indexSettingProviders ;
99
107
this .client = new OriginSettingClient (client , "stack" );
100
108
}
101
109
@@ -128,6 +136,7 @@ public void onResponse(DataStreamsStatsAction.Response response) {
128
136
clusterSettings ,
129
137
globalRetentionSettings ,
130
138
dataStreamFailureStoreSettings ,
139
+ indexSettingProviders ,
131
140
maxTimestamps
132
141
)
133
142
);
@@ -148,12 +157,43 @@ public void onFailure(Exception e) {
148
157
clusterSettings ,
149
158
globalRetentionSettings ,
150
159
dataStreamFailureStoreSettings ,
160
+ indexSettingProviders ,
151
161
null
152
162
)
153
163
);
154
164
}
155
165
}
156
166
167
+ /**
168
+ * Resolves the index mode ("index.mode" setting) for the given data stream, from the template or additional setting providers
169
+ */
170
+ @ Nullable
171
+ static IndexMode resolveMode (
172
+ ClusterState state ,
173
+ IndexSettingProviders indexSettingProviders ,
174
+ DataStream dataStream ,
175
+ Settings settings ,
176
+ ComposableIndexTemplate indexTemplate
177
+ ) {
178
+ IndexMode indexMode = state .metadata ().retrieveIndexModeFromTemplate (indexTemplate );
179
+ for (IndexSettingProvider provider : indexSettingProviders .getIndexSettingProviders ()) {
180
+ Settings addlSettinsg = provider .getAdditionalIndexSettings (
181
+ MetadataIndexTemplateService .VALIDATE_INDEX_NAME ,
182
+ dataStream .getName (),
183
+ indexMode ,
184
+ state .metadata (),
185
+ Instant .now (),
186
+ settings ,
187
+ List .of ()
188
+ );
189
+ var rawMode = addlSettinsg .get (IndexSettings .MODE .getKey ());
190
+ if (rawMode != null ) {
191
+ indexMode = Enum .valueOf (IndexMode .class , rawMode .toUpperCase (Locale .ROOT ));
192
+ }
193
+ }
194
+ return indexMode ;
195
+ }
196
+
157
197
static GetDataStreamAction .Response innerOperation (
158
198
ClusterState state ,
159
199
GetDataStreamAction .Request request ,
@@ -162,6 +202,7 @@ static GetDataStreamAction.Response innerOperation(
162
202
ClusterSettings clusterSettings ,
163
203
DataStreamGlobalRetentionSettings globalRetentionSettings ,
164
204
DataStreamFailureStoreSettings dataStreamFailureStoreSettings ,
205
+ IndexSettingProviders indexSettingProviders ,
165
206
@ Nullable Map <String , Long > maxTimestamps
166
207
) {
167
208
List <DataStream > dataStreams = getDataStreams (state , indexNameExpressionResolver , request );
@@ -173,6 +214,7 @@ static GetDataStreamAction.Response innerOperation(
173
214
final String indexTemplate ;
174
215
boolean indexTemplatePreferIlmValue = true ;
175
216
String ilmPolicyName = null ;
217
+ IndexMode indexMode = dataStream .getIndexMode ();
176
218
if (dataStream .isSystem ()) {
177
219
SystemDataStreamDescriptor dataStreamDescriptor = systemIndices .findMatchingDataStreamDescriptor (dataStream .getName ());
178
220
indexTemplate = dataStreamDescriptor != null ? dataStreamDescriptor .getDataStreamName () : null ;
@@ -182,13 +224,31 @@ static GetDataStreamAction.Response innerOperation(
182
224
dataStreamDescriptor .getComponentTemplates ()
183
225
);
184
226
ilmPolicyName = settings .get (IndexMetadata .LIFECYCLE_NAME );
227
+ if (indexMode == null ) {
228
+ indexMode = resolveMode (
229
+ state ,
230
+ indexSettingProviders ,
231
+ dataStream ,
232
+ settings ,
233
+ dataStreamDescriptor .getComposableIndexTemplate ()
234
+ );
235
+ }
185
236
indexTemplatePreferIlmValue = PREFER_ILM_SETTING .get (settings );
186
237
}
187
238
} else {
188
239
indexTemplate = MetadataIndexTemplateService .findV2Template (state .metadata (), dataStream .getName (), false );
189
240
if (indexTemplate != null ) {
190
241
Settings settings = MetadataIndexTemplateService .resolveSettings (state .metadata (), indexTemplate );
191
242
ilmPolicyName = settings .get (IndexMetadata .LIFECYCLE_NAME );
243
+ if (indexMode == null && state .metadata ().templatesV2 ().get (indexTemplate ) != null ) {
244
+ indexMode = resolveMode (
245
+ state ,
246
+ indexSettingProviders ,
247
+ dataStream ,
248
+ settings ,
249
+ state .metadata ().templatesV2 ().get (indexTemplate )
250
+ );
251
+ }
192
252
indexTemplatePreferIlmValue = PREFER_ILM_SETTING .get (settings );
193
253
} else {
194
254
LOGGER .warn (
@@ -280,7 +340,9 @@ public int compareTo(IndexInfo o) {
280
340
timeSeries ,
281
341
backingIndicesSettingsValues ,
282
342
indexTemplatePreferIlmValue ,
283
- maxTimestamps == null ? null : maxTimestamps .get (dataStream .getName ())
343
+ maxTimestamps == null ? null : maxTimestamps .get (dataStream .getName ()),
344
+ // Default to standard mode if not specified; should we set this to "unset" or "unspecified" instead?
345
+ indexMode == null ? IndexMode .STANDARD .getName () : indexMode .getName ()
284
346
)
285
347
);
286
348
}
@@ -310,7 +372,11 @@ private static void collectIndexSettingsValues(
310
372
} else {
311
373
managedBy = ManagedBy .UNMANAGED ;
312
374
}
313
- backingIndicesSettingsValues .put (index , new IndexProperties (preferIlm , indexMetadata .getLifecyclePolicyName (), managedBy ));
375
+ String indexMode = IndexSettings .MODE .get (indexMetadata .getSettings ()).getName ();
376
+ backingIndicesSettingsValues .put (
377
+ index ,
378
+ new IndexProperties (preferIlm , indexMetadata .getLifecyclePolicyName (), managedBy , indexMode )
379
+ );
314
380
}
315
381
}
316
382
0 commit comments