Skip to content

Commit 6d0489d

Browse files
committed
Move logsdb index sorting defaults to LogsdbIndexModeSettingsProvider
1 parent 8287e5d commit 6d0489d

File tree

5 files changed

+125
-45
lines changed

5 files changed

+125
-45
lines changed

server/src/main/java/org/elasticsearch/index/IndexMode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ public SourceFieldMapper.Mode defaultSourceMode() {
393393
}
394394
};
395395

396-
static final String HOST_NAME = "host.name";
396+
public static final String HOST_NAME = "host.name";
397397

398398
private static void validateRoutingPathSettings(Map<Setting<?>, Object> settings) {
399399
settingRequiresTimeSeries(settings, IndexMetadata.INDEX_ROUTING_PATH);

server/src/main/java/org/elasticsearch/index/IndexSortConfig.java

Lines changed: 95 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -102,25 +102,6 @@ public final class IndexSortConfig {
102102
Setting.Property.ServerlessPublic
103103
);
104104

105-
public static final FieldSortSpec[] TIME_SERIES_SORT, TIMESTAMP_SORT, HOSTNAME_TIMESTAMP_SORT, HOSTNAME_TIMESTAMP_BWC_SORT;
106-
static {
107-
FieldSortSpec timeStampSpec = new FieldSortSpec(DataStreamTimestampFieldMapper.DEFAULT_PATH);
108-
timeStampSpec.order = SortOrder.DESC;
109-
TIME_SERIES_SORT = new FieldSortSpec[] { new FieldSortSpec(TimeSeriesIdFieldMapper.NAME), timeStampSpec };
110-
TIMESTAMP_SORT = new FieldSortSpec[] { timeStampSpec };
111-
112-
FieldSortSpec hostnameSpec = new FieldSortSpec(IndexMode.HOST_NAME);
113-
hostnameSpec.order = SortOrder.ASC;
114-
hostnameSpec.missingValue = "_last";
115-
hostnameSpec.mode = MultiValueMode.MIN;
116-
HOSTNAME_TIMESTAMP_SORT = new FieldSortSpec[] { hostnameSpec, timeStampSpec };
117-
118-
// Older indexes use ascending ordering for host name and timestamp.
119-
HOSTNAME_TIMESTAMP_BWC_SORT = new FieldSortSpec[] {
120-
new FieldSortSpec(IndexMode.HOST_NAME),
121-
new FieldSortSpec(DataStreamTimestampFieldMapper.DEFAULT_PATH) };
122-
}
123-
124105
private static String validateMissingValue(String missing) {
125106
if ("_last".equals(missing) == false && "_first".equals(missing) == false) {
126107
throw new IllegalArgumentException("Illegal missing value:[" + missing + "], " + "must be one of [_last, _first]");
@@ -146,6 +127,98 @@ private static MultiValueMode parseMultiValueMode(String value) {
146127
return mode;
147128
}
148129

130+
private static void checkSizeMismatch(String firstKey, List<?> first, String secondKey, List<?> second) {
131+
if (first.size() != second.size()) {
132+
throw new IllegalArgumentException(firstKey + ":" + first + " " + secondKey + ":" + second + ", size mismatch");
133+
}
134+
}
135+
136+
public static void validateSortSettings(Settings settings) {
137+
List<String> fields = INDEX_SORT_FIELD_SETTING.get(settings);
138+
139+
if (INDEX_SORT_ORDER_SETTING.exists(settings)) {
140+
var order = INDEX_SORT_ORDER_SETTING.get(settings);
141+
checkSizeMismatch(INDEX_SORT_FIELD_SETTING.getKey(), fields, INDEX_SORT_ORDER_SETTING.getKey(), order);
142+
}
143+
144+
if (INDEX_SORT_MODE_SETTING.exists(settings)) {
145+
var mode = INDEX_SORT_MODE_SETTING.get(settings);
146+
checkSizeMismatch(INDEX_SORT_FIELD_SETTING.getKey(), fields, INDEX_SORT_MODE_SETTING.getKey(), mode);
147+
}
148+
149+
if (INDEX_SORT_MISSING_SETTING.exists(settings)) {
150+
var missing = INDEX_SORT_MISSING_SETTING.get(settings);
151+
checkSizeMismatch(INDEX_SORT_FIELD_SETTING.getKey(), fields, INDEX_SORT_MISSING_SETTING.getKey(), missing);
152+
}
153+
}
154+
155+
public static class IndexSortConfigDefaults {
156+
public static final FieldSortSpec[] TIME_SERIES_SORT, TIMESTAMP_SORT, HOSTNAME_TIMESTAMP_SORT, HOSTNAME_TIMESTAMP_BWC_SORT;
157+
158+
static {
159+
FieldSortSpec timeStampSpec = new FieldSortSpec(DataStreamTimestampFieldMapper.DEFAULT_PATH);
160+
timeStampSpec.order = SortOrder.DESC;
161+
TIME_SERIES_SORT = new FieldSortSpec[] { new FieldSortSpec(TimeSeriesIdFieldMapper.NAME), timeStampSpec };
162+
TIMESTAMP_SORT = new FieldSortSpec[] { timeStampSpec };
163+
164+
FieldSortSpec hostnameSpec = new FieldSortSpec(IndexMode.HOST_NAME);
165+
hostnameSpec.order = SortOrder.ASC;
166+
hostnameSpec.missingValue = "_last";
167+
hostnameSpec.mode = MultiValueMode.MIN;
168+
HOSTNAME_TIMESTAMP_SORT = new FieldSortSpec[] { hostnameSpec, timeStampSpec };
169+
170+
// Older indexes use ascending ordering for host name and timestamp.
171+
HOSTNAME_TIMESTAMP_BWC_SORT = new FieldSortSpec[] {
172+
new FieldSortSpec(IndexMode.HOST_NAME),
173+
new FieldSortSpec(DataStreamTimestampFieldMapper.DEFAULT_PATH) };
174+
}
175+
176+
public static FieldSortSpec[] getDefaultSortSpecs(IndexSettings indexSettings) {
177+
final Settings settings = indexSettings.getSettings();
178+
179+
IndexMode indexMode = indexSettings.getMode();
180+
if (indexMode == IndexMode.TIME_SERIES) {
181+
return TIME_SERIES_SORT;
182+
} else if (indexMode == IndexMode.LOGSDB) {
183+
if (INDEX_SORT_FIELD_SETTING.exists(settings)) {
184+
return null;
185+
}
186+
187+
var version = indexSettings.getIndexVersionCreated();
188+
if (version.onOrAfter(IndexVersions.LOGSDB_EXPLICIT_INDEX_SORTING_DEFAULTS)) {
189+
return null;
190+
}
191+
192+
List<String> fields = INDEX_SORT_FIELD_SETTING.get(settings);
193+
if (INDEX_SORT_ORDER_SETTING.exists(settings)) {
194+
var order = INDEX_SORT_ORDER_SETTING.get(settings);
195+
throw new IllegalArgumentException("index.sort.fields:" + fields + " index.sort.order:" + order + ", size mismatch");
196+
}
197+
if (INDEX_SORT_MODE_SETTING.exists(settings)) {
198+
var mode = INDEX_SORT_MODE_SETTING.get(settings);
199+
throw new IllegalArgumentException("index.sort.fields:" + fields + " index.sort.mode:" + mode + ", size mismatch");
200+
}
201+
if (INDEX_SORT_MISSING_SETTING.exists(settings)) {
202+
var missing = INDEX_SORT_MISSING_SETTING.get(settings);
203+
throw new IllegalArgumentException(
204+
"index.sort.fields:" + fields + " index.sort.missing:" + missing + ", size mismatch"
205+
);
206+
}
207+
if (version.onOrAfter(IndexVersions.LOGSB_OPTIONAL_SORTING_ON_HOST_NAME)
208+
|| version.between(
209+
IndexVersions.LOGSB_OPTIONAL_SORTING_ON_HOST_NAME_BACKPORT,
210+
IndexVersions.UPGRADE_TO_LUCENE_10_0_0
211+
)) {
212+
return (IndexSettings.LOGSDB_SORT_ON_HOST_NAME.get(settings)) ? HOSTNAME_TIMESTAMP_SORT : TIMESTAMP_SORT;
213+
} else {
214+
return HOSTNAME_TIMESTAMP_BWC_SORT;
215+
}
216+
}
217+
218+
return null;
219+
}
220+
}
221+
149222
// visible for tests
150223
final FieldSortSpec[] sortSpecs;
151224
private final IndexVersion indexCreatedVersion;
@@ -158,34 +231,13 @@ public IndexSortConfig(IndexSettings indexSettings) {
158231
this.indexName = indexSettings.getIndex().getName();
159232
this.indexMode = indexSettings.getMode();
160233

161-
if (indexMode == IndexMode.TIME_SERIES) {
162-
sortSpecs = TIME_SERIES_SORT;
234+
var defaultSortSpecs = IndexSortConfigDefaults.getDefaultSortSpecs(indexSettings);
235+
if (defaultSortSpecs != null) {
236+
this.sortSpecs = defaultSortSpecs;
163237
return;
164238
}
165239

166240
List<String> fields = INDEX_SORT_FIELD_SETTING.get(settings);
167-
if (indexMode == IndexMode.LOGSDB && INDEX_SORT_FIELD_SETTING.exists(settings) == false) {
168-
if (INDEX_SORT_ORDER_SETTING.exists(settings)) {
169-
var order = INDEX_SORT_ORDER_SETTING.get(settings);
170-
throw new IllegalArgumentException("index.sort.fields:" + fields + " index.sort.order:" + order + ", size mismatch");
171-
}
172-
if (INDEX_SORT_MODE_SETTING.exists(settings)) {
173-
var mode = INDEX_SORT_MODE_SETTING.get(settings);
174-
throw new IllegalArgumentException("index.sort.fields:" + fields + " index.sort.mode:" + mode + ", size mismatch");
175-
}
176-
if (INDEX_SORT_MISSING_SETTING.exists(settings)) {
177-
var missing = INDEX_SORT_MISSING_SETTING.get(settings);
178-
throw new IllegalArgumentException("index.sort.fields:" + fields + " index.sort.missing:" + missing + ", size mismatch");
179-
}
180-
var version = indexSettings.getIndexVersionCreated();
181-
if (version.onOrAfter(IndexVersions.LOGSB_OPTIONAL_SORTING_ON_HOST_NAME)
182-
|| version.between(IndexVersions.LOGSB_OPTIONAL_SORTING_ON_HOST_NAME_BACKPORT, IndexVersions.UPGRADE_TO_LUCENE_10_0_0)) {
183-
sortSpecs = (IndexSettings.LOGSDB_SORT_ON_HOST_NAME.get(settings)) ? HOSTNAME_TIMESTAMP_SORT : TIMESTAMP_SORT;
184-
} else {
185-
sortSpecs = HOSTNAME_TIMESTAMP_BWC_SORT;
186-
}
187-
return;
188-
}
189241
sortSpecs = fields.stream().map(FieldSortSpec::new).toArray(FieldSortSpec[]::new);
190242

191243
if (INDEX_SORT_ORDER_SETTING.exists(settings)) {

server/src/main/java/org/elasticsearch/index/IndexVersions.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ private static Version parseUnchecked(String version) {
183183
public static final IndexVersion IGNORED_SOURCE_FIELDS_PER_ENTRY_WITH_FF = def(9_034_0_00, Version.LUCENE_10_2_2);
184184
public static final IndexVersion EXCLUDE_SOURCE_VECTORS_DEFAULT = def(9_035_0_00, Version.LUCENE_10_2_2);
185185
public static final IndexVersion DISABLE_NORMS_BY_DEFAULT_FOR_LOGSDB_AND_TSDB = def(9_036_0_00, Version.LUCENE_10_2_2);
186+
public static final IndexVersion LOGSDB_EXPLICIT_INDEX_SORTING_DEFAULTS = def(9_037_0_00, Version.LUCENE_10_2_2);
186187

187188
/*
188189
* STOP! READ THIS FIRST! No, really,

server/src/main/java/org/elasticsearch/search/aggregations/support/TimeSeriesIndexSearcher.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
import java.util.List;
4040
import java.util.function.IntSupplier;
4141

42-
import static org.elasticsearch.index.IndexSortConfig.TIME_SERIES_SORT;
42+
import static org.elasticsearch.index.IndexSortConfig.IndexSortConfigDefaults.TIME_SERIES_SORT;
4343

4444
/**
4545
* An IndexSearcher wrapper that executes the searches in time-series indices by traversing them by tsid and timestamp

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,33 @@ && matchesLogsPattern(dataStreamName)) {
198198
&& licenseService.allowPatternTextTemplating(isTemplateValidation) == false) {
199199
additionalSettings.put(PatternTextFieldMapper.DISABLE_TEMPLATING_SETTING.getKey(), true);
200200
}
201+
202+
if (isLogsDB && isTemplateValidation == false && IndexSortConfig.INDEX_SORT_FIELD_SETTING.exists(settings) == false) {
203+
IndexSortConfig.validateSortSettings(settings);
204+
if (mappingHints.sortOnHostName) {
205+
applyHostnameTimestampSort(additionalSettings);
206+
} else {
207+
applyTimestampSort(additionalSettings);
208+
}
209+
}
210+
}
211+
212+
private static void applyHostnameTimestampSort(Settings.Builder builder) {
213+
builder.putList(
214+
IndexSortConfig.INDEX_SORT_FIELD_SETTING.getKey(),
215+
IndexMode.HOST_NAME,
216+
DataStreamTimestampFieldMapper.DEFAULT_PATH
217+
);
218+
builder.putList(IndexSortConfig.INDEX_SORT_ORDER_SETTING.getKey(), "asc", "desc");
219+
builder.putList(IndexSortConfig.INDEX_SORT_MODE_SETTING.getKey(), "min", "min");
220+
builder.putList(IndexSortConfig.INDEX_SORT_MISSING_SETTING.getKey(), "_last", "_last");
221+
}
222+
223+
private static void applyTimestampSort(Settings.Builder builder) {
224+
builder.putList(IndexSortConfig.INDEX_SORT_FIELD_SETTING.getKey(), DataStreamTimestampFieldMapper.DEFAULT_PATH);
225+
builder.putList(IndexSortConfig.INDEX_SORT_ORDER_SETTING.getKey(), "desc");
226+
builder.putList(IndexSortConfig.INDEX_SORT_MODE_SETTING.getKey(), "min");
227+
builder.putList(IndexSortConfig.INDEX_SORT_MISSING_SETTING.getKey(), "_last");
201228
}
202229

203230
record MappingHints(boolean hasSyntheticSourceUsage, boolean sortOnHostName, boolean addHostNameField) {

0 commit comments

Comments
 (0)