Skip to content

Commit 7bbecb6

Browse files
authored
Use a hint to specify DirectIO to HybridDirectory (#127601)
Remove the forked DirectIO lucene format
1 parent 7429c2c commit 7bbecb6

File tree

8 files changed

+127
-405
lines changed

8 files changed

+127
-405
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ private static Version parseUnchecked(String version) {
163163
public static final IndexVersion UPGRADE_TO_LUCENE_10_2_1 = def(9_023_00_0, Version.LUCENE_10_2_1);
164164
public static final IndexVersion DEFAULT_OVERSAMPLE_VALUE_FOR_BBQ = def(9_024_0_00, Version.LUCENE_10_2_1);
165165
public static final IndexVersion SEMANTIC_TEXT_DEFAULTS_TO_BBQ = def(9_025_0_00, Version.LUCENE_10_2_1);
166-
166+
167167
public static final IndexVersion UPGRADE_TO_LUCENE_10_3_0 = def(9_050_00_0, Version.LUCENE_10_3_0);
168168
/*
169169
* STOP! READ THIS FIRST! No, really,
Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,7 @@
1010
package org.elasticsearch.index.codec.vectors.es818;
1111

1212
import org.apache.lucene.store.IOContext;
13-
import org.apache.lucene.store.IndexInput;
1413

15-
import java.io.IOException;
16-
17-
/**
18-
* A hook for {@link DirectIOLucene99FlatVectorsReader} to specify the input should be opened using DirectIO.
19-
* Remove when IOContext allows more extensible payloads to be specified.
20-
*/
21-
public interface DirectIOIndexInputSupplier {
22-
IndexInput openInputDirect(String name, IOContext context) throws IOException;
14+
public enum DirectIOHint implements IOContext.FileOpenHint {
15+
INSTANCE
2316
}

server/src/main/java/org/elasticsearch/index/codec/vectors/es818/DirectIOLucene99FlatVectorsFormat.java

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,14 @@
2727
import org.apache.lucene.codecs.lucene99.Lucene99FlatVectorsWriter;
2828
import org.apache.lucene.index.SegmentReadState;
2929
import org.apache.lucene.index.SegmentWriteState;
30+
import org.apache.lucene.store.FlushInfo;
31+
import org.apache.lucene.store.IOContext;
32+
import org.apache.lucene.store.MergeInfo;
33+
import org.apache.lucene.store.ReadAdvice;
3034

3135
import java.io.IOException;
36+
import java.util.Optional;
37+
import java.util.Set;
3238

3339
/**
3440
* Copied from Lucene99FlatVectorsFormat in Lucene 10.1
@@ -61,22 +67,62 @@ public FlatVectorsWriter fieldsWriter(SegmentWriteState state) throws IOExceptio
6167
return new Lucene99FlatVectorsWriter(state, vectorsScorer);
6268
}
6369

70+
private static final IOContext DIRECT_IO_CONTEXT = new IOContext() {
71+
@Override
72+
public Context context() {
73+
return Context.DEFAULT;
74+
}
75+
76+
@Override
77+
public MergeInfo mergeInfo() {
78+
return null;
79+
}
80+
81+
@Override
82+
public FlushInfo flushInfo() {
83+
return null;
84+
}
85+
86+
@Override
87+
public Set<FileOpenHint> hints() {
88+
return Set.of(DirectIOHint.INSTANCE);
89+
}
90+
91+
@Override
92+
public IOContext withHints(FileOpenHint... hints) {
93+
return this;
94+
}
95+
96+
@Override
97+
public Optional<ReadAdvice> readAdvice() {
98+
return Optional.empty();
99+
}
100+
101+
@Override
102+
public IOContext withReadAdvice(ReadAdvice advice) {
103+
return this;
104+
}
105+
};
106+
64107
@Override
65108
public FlatVectorsReader fieldsReader(SegmentReadState state) throws IOException {
66-
if (DirectIOLucene99FlatVectorsReader.shouldUseDirectIO(state)) {
67-
// Use mmap for merges and direct I/O for searches.
68-
// TODO: Open the mmap file with sequential access instead of random (current behavior).
69-
return new MergeReaderWrapper(
70-
new DirectIOLucene99FlatVectorsReader(state, vectorsScorer),
71-
new Lucene99FlatVectorsReader(state, vectorsScorer)
72-
);
73-
} else {
74-
return new Lucene99FlatVectorsReader(state, vectorsScorer);
75-
}
109+
SegmentReadState directIOState = new SegmentReadState(
110+
state.directory,
111+
state.segmentInfo,
112+
state.fieldInfos,
113+
DIRECT_IO_CONTEXT,
114+
state.segmentSuffix
115+
);
116+
// Use mmap for merges and direct I/O for searches.
117+
// TODO: Open the mmap file with sequential access instead of random (current behavior).
118+
return new MergeReaderWrapper(
119+
new Lucene99FlatVectorsReader(directIOState, vectorsScorer),
120+
new Lucene99FlatVectorsReader(state, vectorsScorer)
121+
);
76122
}
77123

78124
@Override
79125
public String toString() {
80-
return "ES818FlatVectorsFormat(" + "vectorsScorer=" + vectorsScorer + ')';
126+
return "Lucene99FlatVectorsFormat(" + "vectorsScorer=" + vectorsScorer + ')';
81127
}
82128
}

0 commit comments

Comments
 (0)