Przeglądaj źródła

Don't validate index_mode for start_date/end_date index settings (#134300)

This allows component templates to set the start/end date without forcing them to set routing_path.
This would disable the new index.dimensions-based optimization introduced in https://github.com/elastic/elasticsearch/pull/132566.
Felix Barnsteiner 1 miesiąc temu
rodzic
commit
5e74ecddc8

+ 8 - 1
modules/data-streams/src/test/java/org/elasticsearch/datastreams/UpdateTimeSeriesRangeServiceTests.java

@@ -27,6 +27,7 @@ import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.core.TimeValue;
 import org.elasticsearch.core.Tuple;
 import org.elasticsearch.index.IndexSettings;
+import org.elasticsearch.index.mapper.DateFieldMapper;
 import org.elasticsearch.test.ESTestCase;
 import org.elasticsearch.threadpool.TestThreadPool;
 import org.elasticsearch.threadpool.ThreadPool;
@@ -245,7 +246,13 @@ public class UpdateTimeSeriesRangeServiceTests extends ESTestCase {
             DataStreamTestHelper.getClusterStateWithDataStream(mbBuilder, dataStreamName, List.of(new Tuple<>(start, end)));
         }
 
-        Settings settings = Settings.builder().put("index.mode", "logsdb").build();
+        Settings settings = Settings.builder()
+            .put(IndexSettings.TIME_SERIES_START_TIME.getKey(), DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER.format(start))
+            .put(
+                IndexSettings.TIME_SERIES_END_TIME.getKey(),
+                DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER.format(start.minus(1, ChronoUnit.SECONDS))
+            )
+            .build();
         var im = createIndexMetadata(getDefaultBackingIndexName(dataStreamName2, 2, start.toEpochMilli()), true, settings, 0);
         mbBuilder.put(im, true);
         var ds2 = mbBuilder.dataStreamMetadata().dataStreams().get(dataStreamName2);

+ 4 - 0
rest-api-spec/build.gradle

@@ -96,4 +96,8 @@ tasks.named("yamlRestCompatTestTransform").configure ({ task ->
   task.skipTest("search.vectors/90_sparse_vector/sparse_vector synthetic source", "Vectors are not returned by default")
   task.skipTest("update/100_synthetic_source/keyword", "synthetic recovery source means _recovery_source field will not be present")
   task.skipTest("update/100_synthetic_source/stored text", "synthetic recovery source means _recovery_source field will not be present")
+  task.skipTest("logsdb/10_settings/start time not allowed in logs mode", "we don't validate for index_mode=tsdb when setting start_date/end_date anymore")
+  task.skipTest("logsdb/10_settings/end time not allowed in logs mode", "we don't validate for index_mode=tsdb when setting start_date/end_date anymore")
+  task.skipTest("tsdb/10_settings/set start_time and end_time without timeseries mode", "we don't validate for index_mode=tsdb when setting start_date/end_date anymore")
+  task.skipTest("tsdb/10_settings/set start_time, end_time and routing_path via put settings api without time_series mode", "we don't validate for index_mode=tsdb when setting start_date/end_date anymore")
 })

+ 0 - 66
rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/logsdb/10_settings.yml

@@ -503,72 +503,6 @@ routing path allowed in logs mode with routing on sort fields:
   - match: { test.settings.index.logsdb.route_on_sort_fields: "true" }
   - match: { test.settings.index.routing_path: [ host.name, agent_id ] }
 
----
-start time not allowed in logs mode:
-  - do:
-      catch: bad_request
-      indices.create:
-        index: test
-        body:
-          settings:
-            index:
-              mode: logsdb
-              number_of_replicas: 0
-              number_of_shards: 2
-              time_series:
-                start_time: 2023-01-01T00:00:00Z
-          mappings:
-            properties:
-              "@timestamp":
-                type: date
-              host.name:
-                type: keyword
-              agent_id:
-                type: keyword
-              process_id:
-                type: integer
-              http_method:
-                type: keyword
-              message:
-                type: text
-
-  - match: { error.root_cause.0.type: "illegal_argument_exception" }
-  - match: { error.type: "illegal_argument_exception" }
-  - match: { error.reason: "[index.time_series.start_time] requires [index.mode=time_series]" }
-
----
-end time not allowed in logs mode:
-  - do:
-      catch: bad_request
-      indices.create:
-        index: test
-        body:
-          settings:
-            index:
-              mode: logsdb
-              number_of_replicas: 0
-              number_of_shards: 2
-              time_series:
-                end_time: 2023-01-30T00:00:00Z
-          mappings:
-            properties:
-              "@timestamp":
-                type: date
-              host.name:
-                type: keyword
-              agent_id:
-                type: keyword
-              process_id:
-                type: integer
-              http_method:
-                type: keyword
-              message:
-                type: text
-
-  - match: { error.root_cause.0.type: "illegal_argument_exception" }
-  - match: { error.type: "illegal_argument_exception" }
-  - match: { error.reason: "[index.time_series.end_time] requires [index.mode=time_series]" }
-
 ---
 ignore dynamic beyond limit logsdb default value:
   - requires:

+ 0 - 87
rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/tsdb/10_settings.yml

@@ -310,93 +310,6 @@ set start_time and end_time:
       indices.delete:
         index: test_index
 
----
-set start_time and end_time without timeseries mode:
-  - requires:
-      cluster_features: ["gte_v8.2.0"]
-      reason: tsdb indexing changed in 8.2.0
-
-  - do:
-      catch: /\[index.time_series.start_time\] requires \[index.mode=time_series\]/
-      indices.create:
-        index: test_index
-        body:
-          settings:
-            index:
-              time_series:
-                start_time: 1632625782000
-
-  - do:
-      catch: /\[index.time_series.end_time\] requires \[index.mode=time_series\]/
-      indices.create:
-        index: test_index
-        body:
-          settings:
-            index:
-              time_series:
-                end_time: 1632625782000
-
----
-set start_time, end_time and routing_path via put settings api without time_series mode:
-  - requires:
-      cluster_features: [ "gte_v8.15.0" ]
-      reason: bug fixed in 8.15.0
-
-  - do:
-      indices.create:
-        index: test-index
-  - match: { acknowledged: true }
-
-  - do:
-      catch: /\[index.time_series.end_time\] requires \[index.mode=time_series\]/
-      indices.put_settings:
-        index: test-index
-        body:
-          index.time_series.end_time: 1632625782000
-
-  - do:
-      catch: /Can't update non dynamic settings \[\[index.time_series.start_time\]\] for open indices/
-      indices.put_settings:
-        index: test-index
-        body:
-          index.time_series.start_time: 1632625782000
-
-  - do:
-      catch: /Can't update non dynamic settings \[\[index.routing_path\]\] for open indices/
-      indices.put_settings:
-        index: test-index
-        body:
-          settings:
-            index:
-              routing_path: foo
-
-  - do:
-      indices.close:
-        index: test-index
-
-  - do:
-      catch: /\[index.time_series.end_time\] requires \[index.mode=time_series\]/
-      indices.put_settings:
-        index: test-index
-        body:
-          index.time_series.end_time: 1632625782000
-
-  - do:
-      catch: /final test-index setting \[index.time_series.start_time\], not updateable/
-      indices.put_settings:
-        index: test-index
-        body:
-          index.time_series.start_time: 1632625782000
-
-  - do:
-      catch: /final test-index setting \[index.routing_path\], not updateable/
-      indices.put_settings:
-        index: test-index
-        body:
-          settings:
-            index:
-              routing_path: foo
-
 ---
 set bad start_time and end_time:
   - requires:

+ 0 - 7
server/src/main/java/org/elasticsearch/index/IndexMode.java

@@ -65,7 +65,6 @@ public enum IndexMode {
         @Override
         void validateWithOtherSettings(Map<Setting<?>, Object> settings) {
             validateRoutingPathSettings(settings);
-            validateTimeSeriesSettings(settings);
         }
 
         @Override
@@ -239,7 +238,6 @@ public enum IndexMode {
     LOGSDB("logsdb") {
         @Override
         void validateWithOtherSettings(Map<Setting<?>, Object> settings) {
-            validateTimeSeriesSettings(settings);
             var setting = settings.get(IndexSettings.LOGSDB_ROUTE_ON_SORT_FIELDS);
             if (setting.equals(Boolean.FALSE)) {
                 validateRoutingPathSettings(settings);
@@ -401,11 +399,6 @@ public enum IndexMode {
         settingRequiresTimeSeries(settings, IndexMetadata.INDEX_ROUTING_PATH);
     }
 
-    private static void validateTimeSeriesSettings(Map<Setting<?>, Object> settings) {
-        settingRequiresTimeSeries(settings, IndexSettings.TIME_SERIES_START_TIME);
-        settingRequiresTimeSeries(settings, IndexSettings.TIME_SERIES_END_TIME);
-    }
-
     private static void settingRequiresTimeSeries(Map<Setting<?>, Object> settings, Setting<?> setting) {
         if (false == Objects.equals(setting.getDefault(Settings.EMPTY), settings.get(setting))) {
             throw new IllegalArgumentException("[" + setting.getKey() + "] requires " + tsdbMode());

+ 1 - 11
server/src/main/java/org/elasticsearch/index/IndexSettings.java

@@ -617,21 +617,11 @@ public final class IndexSettings {
                 if (startTime.toEpochMilli() > value.toEpochMilli()) {
                     throw new IllegalArgumentException("index.time_series.end_time must be larger than index.time_series.start_time");
                 }
-
-                // The index.time_series.end_time setting can only be specified if the index.mode setting has been set to time_series
-                // This check here is specifically needed because in case of updating index settings the validation the gets executed
-                // in IndexSettings constructor when reading the index.mode setting doesn't get executed.
-                IndexMode indexMode = (IndexMode) settings.get(MODE);
-                if (indexMode != IndexMode.TIME_SERIES) {
-                    throw new IllegalArgumentException(
-                        "[" + TIME_SERIES_END_TIME.getKey() + "] requires [index.mode=" + IndexMode.TIME_SERIES + "]"
-                    );
-                }
             }
 
             @Override
             public Iterator<Setting<?>> settings() {
-                List<Setting<?>> settings = List.of(TIME_SERIES_START_TIME, MODE);
+                List<Setting<?>> settings = List.of(TIME_SERIES_START_TIME);
                 return settings.iterator();
             }
         },

+ 0 - 2
x-pack/plugin/otel-data/src/yamlRestTest/resources/rest-api-spec/test/20_metrics_tests.yml

@@ -10,8 +10,6 @@ setup:
           template:
             settings:
               index:
-                routing_path: [unit, attributes.*, resource.attributes.*]
-                mode: time_series
                 time_series:
                   start_time: 2024-07-01T13:03:08.138Z
 ---