Skip to content

Commit db90a41

Browse files
authored
Revert "Time series based workload desc order optimization through reverse segment read (#7244)" (#7893)
This reverts commit 4c98b3d. Reverting due to issue reported in #7878. Signed-off-by: Andrew Ross <andrross@amazon.com>
1 parent ca167d2 commit db90a41

File tree

11 files changed

+6
-124
lines changed

11 files changed

+6
-124
lines changed

release-notes/opensearch.release-notes-2.8.0.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
- [Search Pipelines] Add RenameFieldResponseProcessor for Search Pipelines ([#7377](https://github.com/opensearch-project/OpenSearch/pull/7377))
1111
- [Search Pipelines] Split search pipeline processor factories by type ([#7597](https://github.com/opensearch-project/OpenSearch/pull/7597))
1212
- [Search Pipelines] Add script processor ([#7607](https://github.com/opensearch-project/OpenSearch/pull/7607))
13-
- Add descending order search optimization through reverse segment read. ([#7244](https://github.com/opensearch-project/OpenSearch/pull/7244))
1413
- Add 'unsigned_long' numeric field type ([#6237](https://github.com/opensearch-project/OpenSearch/pull/6237))
1514
- Add back primary shard preference for queries ([#7375](https://github.com/opensearch-project/OpenSearch/pull/7375))
1615
- Add task cancellation timestamp in task API ([#7455](https://github.com/opensearch-project/OpenSearch/pull/7455))

server/src/main/java/org/opensearch/cluster/metadata/DataStream.java

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@
3131

3232
package org.opensearch.cluster.metadata;
3333

34-
import org.apache.lucene.document.LongPoint;
35-
import org.apache.lucene.index.LeafReader;
36-
import org.apache.lucene.index.PointValues;
37-
import org.opensearch.OpenSearchException;
3834
import org.opensearch.cluster.AbstractDiffable;
3935
import org.opensearch.cluster.Diff;
4036
import org.opensearch.core.ParseField;
@@ -50,7 +46,6 @@
5046
import java.io.IOException;
5147
import java.util.ArrayList;
5248
import java.util.Collections;
53-
import java.util.Comparator;
5449
import java.util.List;
5550
import java.util.Locale;
5651
import java.util.Map;
@@ -64,24 +59,6 @@
6459
public final class DataStream extends AbstractDiffable<DataStream> implements ToXContentObject {
6560

6661
public static final String BACKING_INDEX_PREFIX = ".ds-";
67-
public static final String TIMESERIES_FIELDNAME = "@timestamp";
68-
public static final Comparator<LeafReader> TIMESERIES_LEAF_SORTER = Comparator.comparingLong((LeafReader r) -> {
69-
try {
70-
PointValues points = r.getPointValues(TIMESERIES_FIELDNAME);
71-
if (points != null) {
72-
// could be a multipoint (probably not) but get the maximum time value anyway
73-
byte[] sortValue = points.getMaxPackedValue();
74-
// decode the first dimension because this should not be a multi dimension field
75-
// it's a bug in the date field if it is
76-
return LongPoint.decodeDimension(sortValue, 0);
77-
} else {
78-
// segment does not have a timestamp field, just return the minimum value
79-
return Long.MIN_VALUE;
80-
}
81-
} catch (IOException e) {
82-
throw new OpenSearchException("Not a timeseries Index! Field [{}] not found!", TIMESERIES_FIELDNAME);
83-
}
84-
}).reversed();
8562

8663
private final String name;
8764
private final TimestampField timeStampField;

server/src/main/java/org/opensearch/index/IndexSettings.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,6 @@ private void setRetentionLeaseMillis(final TimeValue retentionLease) {
665665
private volatile long mappingTotalFieldsLimit;
666666
private volatile long mappingDepthLimit;
667667
private volatile long mappingFieldNameLengthLimit;
668-
private volatile boolean searchSegmentOrderReversed;
669668

670669
/**
671670
* The maximum number of refresh listeners allows on this shard.
@@ -905,10 +904,6 @@ public IndexSettings(final IndexMetadata indexMetadata, final Settings nodeSetti
905904
scopedSettings.addSettingsUpdateConsumer(DEFAULT_SEARCH_PIPELINE, this::setDefaultSearchPipeline);
906905
}
907906

908-
private void setSearchSegmentOrderReversed(boolean reversed) {
909-
this.searchSegmentOrderReversed = reversed;
910-
}
911-
912907
private void setSearchIdleAfter(TimeValue searchIdleAfter) {
913908
this.searchIdleAfter = searchIdleAfter;
914909
}
@@ -1080,13 +1075,6 @@ public Settings getNodeSettings() {
10801075
return nodeSettings;
10811076
}
10821077

1083-
/**
1084-
* Returns true if index level setting for leaf reverse order search optimization is enabled
1085-
*/
1086-
public boolean getSearchSegmentOrderReversed() {
1087-
return this.searchSegmentOrderReversed;
1088-
}
1089-
10901078
/**
10911079
* Updates the settings and index metadata and notifies all registered settings consumers with the new settings iff at least one
10921080
* setting has changed.

server/src/main/java/org/opensearch/index/engine/EngineConfig.java

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333

3434
import org.apache.lucene.analysis.Analyzer;
3535
import org.apache.lucene.codecs.Codec;
36-
import org.apache.lucene.index.LeafReader;
3736
import org.apache.lucene.index.MergePolicy;
3837
import org.apache.lucene.search.QueryCache;
3938
import org.apache.lucene.search.QueryCachingPolicy;
@@ -60,7 +59,6 @@
6059
import org.opensearch.indices.breaker.CircuitBreakerService;
6160
import org.opensearch.threadpool.ThreadPool;
6261

63-
import java.util.Comparator;
6462
import java.util.List;
6563
import java.util.Objects;
6664
import java.util.function.BooleanSupplier;
@@ -104,7 +102,6 @@ public final class EngineConfig {
104102
private final Supplier<RetentionLeases> retentionLeasesSupplier;
105103
private final boolean isReadOnlyReplica;
106104
private final BooleanSupplier primaryModeSupplier;
107-
private final Comparator<LeafReader> leafSorter;
108105

109106
/**
110107
* A supplier of the outstanding retention leases. This is used during merged operations to determine which operations that have been
@@ -207,7 +204,6 @@ private EngineConfig(Builder builder) {
207204
this.isReadOnlyReplica = builder.isReadOnlyReplica;
208205
this.primaryModeSupplier = builder.primaryModeSupplier;
209206
this.translogFactory = builder.translogFactory;
210-
this.leafSorter = builder.leafSorter;
211207
}
212208

213209
/**
@@ -455,15 +451,6 @@ public TranslogDeletionPolicyFactory getCustomTranslogDeletionPolicyFactory() {
455451
return translogDeletionPolicyFactory;
456452
}
457453

458-
/**
459-
* Returns subReaderSorter for org.apache.lucene.index.BaseCompositeReader.
460-
* This gets used in lucene IndexReader and decides order of segment read.
461-
* @return comparator
462-
*/
463-
public Comparator<LeafReader> getLeafSorter() {
464-
return this.leafSorter;
465-
}
466-
467454
/**
468455
* Builder for EngineConfig class
469456
*
@@ -496,7 +483,6 @@ public static class Builder {
496483
private boolean isReadOnlyReplica;
497484
private BooleanSupplier primaryModeSupplier;
498485
private TranslogFactory translogFactory = new InternalTranslogFactory();
499-
Comparator<LeafReader> leafSorter;
500486

501487
public Builder shardId(ShardId shardId) {
502488
this.shardId = shardId;
@@ -628,11 +614,6 @@ public Builder translogFactory(TranslogFactory translogFactory) {
628614
return this;
629615
}
630616

631-
public Builder leafSorter(Comparator<LeafReader> leafSorter) {
632-
this.leafSorter = leafSorter;
633-
return this;
634-
}
635-
636617
public EngineConfig build() {
637618
return new EngineConfig(this);
638619
}

server/src/main/java/org/opensearch/index/engine/EngineConfigFactory.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
import org.apache.logging.log4j.Logger;
1212
import org.apache.lucene.analysis.Analyzer;
13-
import org.apache.lucene.index.LeafReader;
1413
import org.apache.lucene.index.MergePolicy;
1514
import org.apache.lucene.search.QueryCache;
1615
import org.apache.lucene.search.QueryCachingPolicy;
@@ -37,7 +36,6 @@
3736

3837
import java.util.Collection;
3938
import java.util.Collections;
40-
import java.util.Comparator;
4139
import java.util.List;
4240
import java.util.Optional;
4341
import java.util.function.BooleanSupplier;
@@ -153,8 +151,7 @@ public EngineConfig newEngineConfig(
153151
EngineConfig.TombstoneDocSupplier tombstoneDocSupplier,
154152
boolean isReadOnlyReplica,
155153
BooleanSupplier primaryModeSupplier,
156-
TranslogFactory translogFactory,
157-
Comparator<LeafReader> leafSorter
154+
TranslogFactory translogFactory
158155
) {
159156
CodecService codecServiceToUse = codecService;
160157
if (codecService == null && this.codecServiceFactory != null) {
@@ -187,7 +184,6 @@ public EngineConfig newEngineConfig(
187184
.readOnlyReplica(isReadOnlyReplica)
188185
.primaryModeSupplier(primaryModeSupplier)
189186
.translogFactory(translogFactory)
190-
.leafSorter(leafSorter)
191187
.build();
192188
}
193189

server/src/main/java/org/opensearch/index/engine/InternalEngine.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2494,9 +2494,6 @@ private IndexWriterConfig getIndexWriterConfig() {
24942494
if (config().getIndexSort() != null) {
24952495
iwc.setIndexSort(config().getIndexSort());
24962496
}
2497-
if (config().getLeafSorter() != null) {
2498-
iwc.setLeafSorter(config().getLeafSorter()); // The default segment search order
2499-
}
25002497
return iwc;
25012498
}
25022499

server/src/main/java/org/opensearch/index/mapper/MappingLookup.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
package org.opensearch.index.mapper;
3434

3535
import org.apache.lucene.analysis.Analyzer;
36-
import org.opensearch.cluster.metadata.DataStream;
3736
import org.opensearch.index.IndexSettings;
3837
import org.opensearch.index.analysis.FieldNameAnalyzer;
3938

@@ -262,15 +261,6 @@ public String getNestedScope(String path) {
262261
return null;
263262
}
264263

265-
/**
266-
* If this index contains @timestamp field with Date type, it will return true
267-
* @return true or false based on above condition
268-
*/
269-
public boolean containsTimeStampField() {
270-
MappedFieldType timeSeriesFieldType = this.fieldTypeLookup.get(DataStream.TIMESERIES_FIELDNAME);
271-
return timeSeriesFieldType != null && timeSeriesFieldType instanceof DateFieldMapper.DateFieldType; // has to be Date field type
272-
}
273-
274264
private static String parentObject(String field) {
275265
int lastDot = field.lastIndexOf('.');
276266
if (lastDot == -1) {

server/src/main/java/org/opensearch/index/shard/IndexShard.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@
5757
import org.apache.lucene.store.IndexInput;
5858
import org.apache.lucene.util.ThreadInterruptedException;
5959
import org.opensearch.core.Assertions;
60-
import org.opensearch.cluster.metadata.DataStream;
61-
import org.opensearch.cluster.metadata.DataStream;
6260
import org.opensearch.ExceptionsHelper;
6361
import org.opensearch.LegacyESVersion;
6462
import org.opensearch.OpenSearchException;
@@ -332,7 +330,6 @@ Runnable getGlobalCheckpointSyncer() {
332330

333331
private final Store remoteStore;
334332
private final BiFunction<IndexSettings, ShardRouting, TranslogFactory> translogFactorySupplier;
335-
private final boolean isTimeSeriesIndex;
336333
private final RemoteRefreshSegmentPressureService remoteRefreshSegmentPressureService;
337334

338335
public IndexShard(
@@ -451,9 +448,6 @@ public boolean shouldCache(Query query) {
451448
this.checkpointPublisher = checkpointPublisher;
452449
this.remoteStore = remoteStore;
453450
this.translogFactorySupplier = translogFactorySupplier;
454-
this.isTimeSeriesIndex = (mapperService == null || mapperService.documentMapper() == null)
455-
? false
456-
: mapperService.documentMapper().mappers().containsTimeStampField();
457451
this.remoteRefreshSegmentPressureService = remoteRefreshSegmentPressureService;
458452
}
459453

@@ -3591,8 +3585,7 @@ private EngineConfig newEngineConfig(LongSupplier globalCheckpointSupplier) thro
35913585
tombstoneDocSupplier(),
35923586
isReadOnlyReplica,
35933587
replicationTracker::isPrimaryMode,
3594-
translogFactorySupplier.apply(indexSettings, shardRouting),
3595-
isTimeSeriesIndex ? DataStream.TIMESERIES_LEAF_SORTER : null // DESC @timestamp default order for timeseries
3588+
translogFactorySupplier.apply(indexSettings, shardRouting)
35963589
);
35973590
}
35983591

@@ -4619,12 +4612,4 @@ RetentionLeaseSyncer getRetentionLeaseSyncer() {
46194612
public GatedCloseable<SegmentInfos> getSegmentInfosSnapshot() {
46204613
return getEngine().getSegmentInfosSnapshot();
46214614
}
4622-
4623-
/**
4624-
* If index is time series (if it contains @timestamp field)
4625-
* @return true or false based on above condition
4626-
*/
4627-
public boolean isTimeSeriesIndex() {
4628-
return this.isTimeSeriesIndex;
4629-
}
46304615
}

server/src/main/java/org/opensearch/search/internal/ContextIndexSearcher.java

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@
7575
import org.opensearch.search.query.QuerySearchResult;
7676
import org.opensearch.search.sort.FieldSortBuilder;
7777
import org.opensearch.search.sort.MinAndMax;
78-
import org.opensearch.search.sort.SortOrder;
7978

8079
import java.io.IOException;
8180
import java.util.ArrayList;
@@ -283,17 +282,8 @@ public void search(
283282

284283
@Override
285284
protected void search(List<LeafReaderContext> leaves, Weight weight, Collector collector) throws IOException {
286-
if (shouldReverseLeafReaderContexts()) {
287-
// reverse the segment search order if this flag is true.
288-
// Certain queries can benefit if we reverse the segment read order,
289-
// for example time series based queries if searched for desc sort order.
290-
for (int i = leaves.size() - 1; i >= 0; i--) {
291-
searchLeaf(leaves.get(i), weight, collector);
292-
}
293-
} else {
294-
for (int i = 0; i < leaves.size(); i++) {
295-
searchLeaf(leaves.get(i), weight, collector);
296-
}
285+
for (LeafReaderContext ctx : leaves) { // search each subreader
286+
searchLeaf(ctx, weight, collector);
297287
}
298288
}
299289

@@ -506,22 +496,4 @@ private boolean canMatchSearchAfter(LeafReaderContext ctx) throws IOException {
506496
}
507497
return true;
508498
}
509-
510-
private boolean shouldReverseLeafReaderContexts() {
511-
// Time series based workload by default traverses segments in desc order i.e. latest to the oldest order.
512-
// This is actually beneficial for search queries to start search on latest segments first for time series workload.
513-
// That can slow down ASC order queries on timestamp workload. So to avoid that slowdown, we will reverse leaf
514-
// reader order here.
515-
if (searchContext != null && searchContext.indexShard().isTimeSeriesIndex()) {
516-
// Only reverse order for asc order sort queries
517-
if (searchContext.request() != null
518-
&& searchContext.request().source() != null
519-
&& searchContext.request().source().sorts() != null
520-
&& searchContext.request().source().sorts().size() > 0
521-
&& searchContext.request().source().sorts().get(0).order() == SortOrder.ASC) {
522-
return true;
523-
}
524-
}
525-
return false;
526-
}
527499
}

server/src/test/java/org/opensearch/index/engine/EngineConfigFactoryTests.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ public void testCreateEngineConfigFromFactory() {
6969
null,
7070
false,
7171
() -> Boolean.TRUE,
72-
new InternalTranslogFactory(),
73-
null
72+
new InternalTranslogFactory()
7473
);
7574

7675
assertNotNull(config.getCodec());
@@ -149,8 +148,7 @@ public void testCreateCodecServiceFromFactory() {
149148
null,
150149
false,
151150
() -> Boolean.TRUE,
152-
new InternalTranslogFactory(),
153-
null
151+
new InternalTranslogFactory()
154152
);
155153
assertNotNull(config.getCodec());
156154
}

test/framework/src/main/java/org/opensearch/test/OpenSearchIntegTestCase.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,6 @@ public Settings indexSettings() {
767767
).getStringRep()
768768
);
769769
}
770-
771770
return builder.build();
772771
}
773772

0 commit comments

Comments
 (0)