Skip to content

Commit 6f7bd55

Browse files
authored
Use settings from LogsdbIndexModeSettingsProvider in SyntheticSourceIndexSettingsProvider (#115437)
* Use settings from LogsdbIndexModeSettingsProvider in SyntheticSourceIndexSettingsProvider * update
1 parent bffaabb commit 6f7bd55

File tree

6 files changed

+159
-20
lines changed

6 files changed

+159
-20
lines changed

x-pack/plugin/logsdb/qa/with-basic/src/javaRestTest/java/org/elasticsearch/xpack/logsdb/LogsdbWithBasicRestIT.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package org.elasticsearch.xpack.logsdb;
99

1010
import org.elasticsearch.client.Request;
11+
import org.elasticsearch.cluster.metadata.DataStream;
1112
import org.elasticsearch.common.settings.Settings;
1213
import org.elasticsearch.index.mapper.SourceFieldMapper;
1314
import org.elasticsearch.test.cluster.ElasticsearchCluster;
@@ -171,4 +172,35 @@ public void testLogsdbOverrideNullInTemplate() throws IOException {
171172
assertEquals("logsdb", settings.get("index.mode"));
172173
assertEquals(SourceFieldMapper.Mode.STORED.toString(), settings.get("index.mapping.source.mode"));
173174
}
175+
176+
public void testLogsdbOverrideDefaultModeForLogsIndex() throws IOException {
177+
Request request = new Request("PUT", "/_cluster/settings");
178+
request.setJsonEntity("{ \"transient\": { \"cluster.logsdb.enabled\": true } }");
179+
assertOK(client().performRequest(request));
180+
181+
request = new Request("POST", "/_index_template/1");
182+
request.setJsonEntity("""
183+
{
184+
"index_patterns": ["logs-test-*"],
185+
"data_stream": {
186+
}
187+
}
188+
""");
189+
assertOK(client().performRequest(request));
190+
191+
request = new Request("POST", "/logs-test-foo/_doc");
192+
request.setJsonEntity("""
193+
{
194+
"@timestamp": "2020-01-01T00:00:00.000Z",
195+
"host.name": "foo",
196+
"message": "bar"
197+
}
198+
""");
199+
assertOK(client().performRequest(request));
200+
201+
String index = DataStream.getDefaultBackingIndexName("logs-test-foo", 1);
202+
var settings = (Map<?, ?>) ((Map<?, ?>) getIndexSettings(index).get(index)).get("settings");
203+
assertEquals("logsdb", settings.get("index.mode"));
204+
assertEquals(SourceFieldMapper.Mode.STORED.toString(), settings.get("index.mapping.source.mode"));
205+
}
174206
}

x-pack/plugin/logsdb/src/javaRestTest/java/org/elasticsearch/xpack/logsdb/LogsdbRestIT.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
package org.elasticsearch.xpack.logsdb;
99

10+
import org.elasticsearch.client.Request;
11+
import org.elasticsearch.cluster.metadata.DataStream;
1012
import org.elasticsearch.common.settings.Settings;
1113
import org.elasticsearch.test.cluster.ElasticsearchCluster;
1214
import org.elasticsearch.test.cluster.local.distribution.DistributionType;
@@ -35,12 +37,6 @@ protected String getTestRestCluster() {
3537
}
3638

3739
public void testFeatureUsageWithLogsdbIndex() throws IOException {
38-
{
39-
var response = getAsMap("/_license/feature_usage");
40-
@SuppressWarnings("unchecked")
41-
List<Map<?, ?>> features = (List<Map<?, ?>>) response.get("features");
42-
assertThat(features, Matchers.empty());
43-
}
4440
{
4541
if (randomBoolean()) {
4642
createIndex("test-index", Settings.builder().put("index.mode", "logsdb").build());
@@ -81,4 +77,35 @@ public void testFeatureUsageWithLogsdbIndex() throws IOException {
8177
}
8278
}
8379

80+
public void testLogsdbSourceModeForLogsIndex() throws IOException {
81+
Request request = new Request("PUT", "/_cluster/settings");
82+
request.setJsonEntity("{ \"transient\": { \"cluster.logsdb.enabled\": true } }");
83+
assertOK(client().performRequest(request));
84+
85+
request = new Request("POST", "/_index_template/1");
86+
request.setJsonEntity("""
87+
{
88+
"index_patterns": ["logs-test-*"],
89+
"data_stream": {
90+
}
91+
}
92+
""");
93+
assertOK(client().performRequest(request));
94+
95+
request = new Request("POST", "/logs-test-foo/_doc");
96+
request.setJsonEntity("""
97+
{
98+
"@timestamp": "2020-01-01T00:00:00.000Z",
99+
"host.name": "foo",
100+
"message": "bar"
101+
}
102+
""");
103+
assertOK(client().performRequest(request));
104+
105+
String index = DataStream.getDefaultBackingIndexName("logs-test-foo", 1);
106+
var settings = (Map<?, ?>) ((Map<?, ?>) getIndexSettings(index).get(index)).get("settings");
107+
assertEquals("logsdb", settings.get("index.mode"));
108+
assertNull(settings.get("index.mapping.source.mode"));
109+
}
110+
84111
}

x-pack/plugin/logsdb/src/main/java/org/elasticsearch/xpack/logsdb/LogsDBPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public Collection<IndexSettingProvider> getAdditionalIndexSettingProviders(Index
5252
return List.of(logsdbIndexModeSettingsProvider);
5353
}
5454
return List.of(
55-
new SyntheticSourceIndexSettingsProvider(licenseService, parameters.mapperServiceFactory()),
55+
new SyntheticSourceIndexSettingsProvider(licenseService, parameters.mapperServiceFactory(), logsdbIndexModeSettingsProvider),
5656
logsdbIndexModeSettingsProvider
5757
);
5858
}

x-pack/plugin/logsdb/src/main/java/org/elasticsearch/xpack/logsdb/LogsdbIndexModeSettingsProvider.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,16 @@ public Settings getAdditionalIndexSettings(
4848
final Settings settings,
4949
final List<CompressedXContent> combinedTemplateMappings
5050
) {
51-
if (isLogsdbEnabled == false || dataStreamName == null) {
52-
return Settings.EMPTY;
53-
}
54-
55-
final IndexMode indexMode = resolveIndexMode(settings.get(IndexSettings.MODE.getKey()));
56-
if (indexMode != null) {
57-
return Settings.EMPTY;
58-
}
51+
return getLogsdbModeSetting(dataStreamName, settings);
52+
}
5953

60-
if (matchesLogsPattern(dataStreamName)) {
54+
Settings getLogsdbModeSetting(final String dataStreamName, final Settings settings) {
55+
if (isLogsdbEnabled
56+
&& dataStreamName != null
57+
&& resolveIndexMode(settings.get(IndexSettings.MODE.getKey())) == null
58+
&& matchesLogsPattern(dataStreamName)) {
6159
return Settings.builder().put("index.mode", IndexMode.LOGSDB.getName()).build();
6260
}
63-
6461
return Settings.EMPTY;
6562
}
6663

@@ -71,5 +68,4 @@ private static boolean matchesLogsPattern(final String name) {
7168
private IndexMode resolveIndexMode(final String mode) {
7269
return mode != null ? Enum.valueOf(IndexMode.class, mode.toUpperCase(Locale.ROOT)) : null;
7370
}
74-
7571
}

x-pack/plugin/logsdb/src/main/java/org/elasticsearch/xpack/logsdb/SyntheticSourceIndexSettingsProvider.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,16 @@ final class SyntheticSourceIndexSettingsProvider implements IndexSettingProvider
3838

3939
private final SyntheticSourceLicenseService syntheticSourceLicenseService;
4040
private final CheckedFunction<IndexMetadata, MapperService, IOException> mapperServiceFactory;
41+
private final LogsdbIndexModeSettingsProvider logsdbIndexModeSettingsProvider;
4142

4243
SyntheticSourceIndexSettingsProvider(
4344
SyntheticSourceLicenseService syntheticSourceLicenseService,
44-
CheckedFunction<IndexMetadata, MapperService, IOException> mapperServiceFactory
45+
CheckedFunction<IndexMetadata, MapperService, IOException> mapperServiceFactory,
46+
LogsdbIndexModeSettingsProvider logsdbIndexModeSettingsProvider
4547
) {
4648
this.syntheticSourceLicenseService = syntheticSourceLicenseService;
4749
this.mapperServiceFactory = mapperServiceFactory;
50+
this.logsdbIndexModeSettingsProvider = logsdbIndexModeSettingsProvider;
4851
}
4952

5053
@Override
@@ -63,6 +66,14 @@ public Settings getAdditionalIndexSettings(
6366
Settings indexTemplateAndCreateRequestSettings,
6467
List<CompressedXContent> combinedTemplateMappings
6568
) {
69+
var logsdbSettings = logsdbIndexModeSettingsProvider.getLogsdbModeSetting(dataStreamName, indexTemplateAndCreateRequestSettings);
70+
if (logsdbSettings != Settings.EMPTY) {
71+
indexTemplateAndCreateRequestSettings = Settings.builder()
72+
.put(logsdbSettings)
73+
.put(indexTemplateAndCreateRequestSettings)
74+
.build();
75+
}
76+
6677
// This index name is used when validating component and index templates, we should skip this check in that case.
6778
// (See MetadataIndexTemplateService#validateIndexTemplateV2(...) method)
6879
boolean isTemplateValidation = "validate-index-name".equals(indexName);

x-pack/plugin/logsdb/src/test/java/org/elasticsearch/xpack/logsdb/SyntheticSourceIndexSettingsProviderTests.java

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.elasticsearch.common.settings.Settings;
1515
import org.elasticsearch.core.Tuple;
1616
import org.elasticsearch.index.IndexMode;
17+
import org.elasticsearch.index.IndexSettings;
1718
import org.elasticsearch.index.MapperTestUtils;
1819
import org.elasticsearch.index.mapper.SourceFieldMapper;
1920
import org.elasticsearch.license.MockLicenseState;
@@ -35,6 +36,10 @@ public class SyntheticSourceIndexSettingsProviderTests extends ESTestCase {
3536
private SyntheticSourceLicenseService syntheticSourceLicenseService;
3637
private SyntheticSourceIndexSettingsProvider provider;
3738

39+
private static LogsdbIndexModeSettingsProvider getLogsdbIndexModeSettingsProvider(boolean enabled) {
40+
return new LogsdbIndexModeSettingsProvider(Settings.builder().put("cluster.logsdb.enabled", enabled).build());
41+
}
42+
3843
@Before
3944
public void setup() {
4045
MockLicenseState licenseState = mock(MockLicenseState.class);
@@ -46,7 +51,8 @@ public void setup() {
4651

4752
provider = new SyntheticSourceIndexSettingsProvider(
4853
syntheticSourceLicenseService,
49-
im -> MapperTestUtils.newMapperService(xContentRegistry(), createTempDir(), im.getSettings(), im.getIndex().getName())
54+
im -> MapperTestUtils.newMapperService(xContentRegistry(), createTempDir(), im.getSettings(), im.getIndex().getName()),
55+
getLogsdbIndexModeSettingsProvider(false)
5056
);
5157
}
5258

@@ -310,4 +316,71 @@ public void testGetAdditionalIndexSettingsDowngradeFromSyntheticSource() throws
310316
assertThat(result.size(), equalTo(1));
311317
assertEquals(SourceFieldMapper.Mode.STORED, SourceFieldMapper.INDEX_MAPPER_SOURCE_MODE_SETTING.get(result));
312318
}
319+
320+
public void testGetAdditionalIndexSettingsDowngradeFromSyntheticSourceFileMatch() throws IOException {
321+
syntheticSourceLicenseService.setSyntheticSourceFallback(true);
322+
provider = new SyntheticSourceIndexSettingsProvider(
323+
syntheticSourceLicenseService,
324+
im -> MapperTestUtils.newMapperService(xContentRegistry(), createTempDir(), im.getSettings(), im.getIndex().getName()),
325+
getLogsdbIndexModeSettingsProvider(true)
326+
);
327+
final Settings settings = Settings.EMPTY;
328+
329+
String dataStreamName = "logs-app1";
330+
Metadata.Builder mb = Metadata.builder(
331+
DataStreamTestHelper.getClusterStateWithDataStreams(
332+
List.of(Tuple.tuple(dataStreamName, 1)),
333+
List.of(),
334+
Instant.now().toEpochMilli(),
335+
builder().build(),
336+
1
337+
).getMetadata()
338+
);
339+
Metadata metadata = mb.build();
340+
Settings result = provider.getAdditionalIndexSettings(
341+
DataStream.getDefaultBackingIndexName(dataStreamName, 2),
342+
dataStreamName,
343+
null,
344+
metadata,
345+
Instant.ofEpochMilli(1L),
346+
settings,
347+
List.of()
348+
);
349+
assertThat(result.size(), equalTo(0));
350+
351+
dataStreamName = "logs-app1-0";
352+
mb = Metadata.builder(
353+
DataStreamTestHelper.getClusterStateWithDataStreams(
354+
List.of(Tuple.tuple(dataStreamName, 1)),
355+
List.of(),
356+
Instant.now().toEpochMilli(),
357+
builder().build(),
358+
1
359+
).getMetadata()
360+
);
361+
metadata = mb.build();
362+
363+
result = provider.getAdditionalIndexSettings(
364+
DataStream.getDefaultBackingIndexName(dataStreamName, 2),
365+
dataStreamName,
366+
null,
367+
metadata,
368+
Instant.ofEpochMilli(1L),
369+
settings,
370+
List.of()
371+
);
372+
assertThat(result.size(), equalTo(1));
373+
assertEquals(SourceFieldMapper.Mode.STORED, SourceFieldMapper.INDEX_MAPPER_SOURCE_MODE_SETTING.get(result));
374+
375+
result = provider.getAdditionalIndexSettings(
376+
DataStream.getDefaultBackingIndexName(dataStreamName, 2),
377+
dataStreamName,
378+
null,
379+
metadata,
380+
Instant.ofEpochMilli(1L),
381+
builder().put(IndexSettings.MODE.getKey(), IndexMode.STANDARD.toString()).build(),
382+
List.of()
383+
);
384+
assertThat(result.size(), equalTo(0));
385+
}
313386
}

0 commit comments

Comments
 (0)