Skip to content

Commit c97c97c

Browse files
authored
Adapt searchable snapshots code to latest master changes (#52258)
This commit adapts searchable snapshots to the latest changes from master. The REST handlers declare their routes differently since #51950 and SearchableSnapshotIndexInput need to account for segment infos files that are stored in shard snapshot metadata hash and not uploaded to the blob store anymore since #51729.
1 parent 48f29ad commit c97c97c

File tree

3 files changed

+35
-8
lines changed

3 files changed

+35
-8
lines changed

x-pack/plugin/searchable-snapshots/src/main/java/org/elasticsearch/index/store/SearchableSnapshotIndexInput.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77

88
import org.apache.lucene.store.BufferedIndexInput;
99
import org.apache.lucene.store.IndexInput;
10+
import org.apache.lucene.util.BytesRef;
1011
import org.elasticsearch.common.Nullable;
1112
import org.elasticsearch.common.blobstore.BlobContainer;
1213
import org.elasticsearch.core.internal.io.IOUtils;
1314
import org.elasticsearch.index.snapshots.blobstore.BlobStoreIndexShardSnapshot.FileInfo;
1415

16+
import java.io.ByteArrayInputStream;
1517
import java.io.Closeable;
1618
import java.io.EOFException;
1719
import java.io.IOException;
@@ -119,8 +121,7 @@ private void readInternalBytes(final int part, long pos, final byte[] b, int off
119121

120122
if (optimizedReadSize < length) {
121123
// we did not read everything in an optimized fashion, so read the remainder directly
122-
try (InputStream inputStream
123-
= blobContainer.readBlob(fileInfo.partName(part), pos + optimizedReadSize, length - optimizedReadSize)) {
124+
try (InputStream inputStream = openBlobStream(part, pos + optimizedReadSize, length - optimizedReadSize)) {
124125
final int directReadSize = inputStream.read(b, offset + optimizedReadSize, length - optimizedReadSize);
125126
assert optimizedReadSize + directReadSize == length : optimizedReadSize + " and " + directReadSize + " vs " + length;
126127
position += directReadSize;
@@ -192,7 +193,7 @@ private int readFromNewSequentialStream(int part, long pos, byte[] b, int offset
192193

193194
// if we open a stream of length streamLength then it will not be completely consumed by this read, so it is worthwhile to open
194195
// it and keep it open for future reads
195-
final InputStream inputStream = blobContainer.readBlob(fileInfo.partName(part), pos, streamLength);
196+
final InputStream inputStream = openBlobStream(part, pos, streamLength);
196197
streamForSequentialReads = new StreamForSequentialReads(inputStream, part, pos, streamLength);
197198

198199
final int read = streamForSequentialReads.read(b, offset, length);
@@ -257,6 +258,28 @@ public String toString() {
257258
'}';
258259
}
259260

261+
private InputStream openBlobStream(int part, long pos, long length) throws IOException {
262+
final InputStream stream;
263+
if (fileInfo.metadata().hashEqualsContents() == false) {
264+
stream = blobContainer.readBlob(fileInfo.partName(part), pos, length);
265+
} else {
266+
// extract blob content from metadata hash
267+
final BytesRef data = fileInfo.metadata().hash();
268+
if (part > 0) {
269+
assert fileInfo.numberOfParts() >= part;
270+
for (int i = 0; i < part; i++) {
271+
pos += fileInfo.partBytes(i);
272+
}
273+
}
274+
if ((pos < 0L) || (length < 0L) || (pos + length > data.bytes.length)) {
275+
throw new IllegalArgumentException("Invalid arguments (pos=" + pos + ", length=" + length
276+
+ ") for hash content (length=" + data.bytes.length + ')');
277+
}
278+
stream = new ByteArrayInputStream(data.bytes, Math.toIntExact(pos), Math.toIntExact(length));
279+
}
280+
return stream;
281+
}
282+
260283
private static class StreamForSequentialReads implements Closeable {
261284
private final InputStream inputStream;
262285
private final int part;

x-pack/plugin/searchable-snapshots/src/main/java/org/elasticsearch/xpack/searchablesnapshots/SearchableSnapshots.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public List<RestHandler> getRestHandlers(Settings settings, RestController restC
131131
IndexScopedSettings indexScopedSettings, SettingsFilter settingsFilter,
132132
IndexNameExpressionResolver indexNameExpressionResolver,
133133
Supplier<DiscoveryNodes> nodesInCluster) {
134-
return List.of(new RestSearchableSnapshotsStatsAction(restController));
134+
return List.of(new RestSearchableSnapshotsStatsAction());
135135
}
136136
}
137137

x-pack/plugin/searchable-snapshots/src/main/java/org/elasticsearch/xpack/searchablesnapshots/rest/RestSearchableSnapshotsStatsAction.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,21 @@
88
import org.elasticsearch.client.node.NodeClient;
99
import org.elasticsearch.common.Strings;
1010
import org.elasticsearch.rest.BaseRestHandler;
11-
import org.elasticsearch.rest.RestController;
1211
import org.elasticsearch.rest.RestRequest;
1312
import org.elasticsearch.rest.action.RestToXContentListener;
1413
import org.elasticsearch.xpack.searchablesnapshots.action.SearchableSnapshotsStatsAction;
1514
import org.elasticsearch.xpack.searchablesnapshots.action.SearchableSnapshotsStatsRequest;
1615

16+
import java.util.List;
17+
1718
public class RestSearchableSnapshotsStatsAction extends BaseRestHandler {
1819

19-
public RestSearchableSnapshotsStatsAction(final RestController controller) {
20-
controller.registerHandler(RestRequest.Method.GET, "/_searchable_snapshots/stats", this);
21-
controller.registerHandler(RestRequest.Method.GET, "/{index}/_searchable_snapshots/stats", this);
20+
@Override
21+
public List<Route> routes() {
22+
return List.of(
23+
new Route(RestRequest.Method.GET, "/_searchable_snapshots/stats"),
24+
new Route(RestRequest.Method.GET, "/{index}/_searchable_snapshots/stats")
25+
);
2226
}
2327

2428
@Override

0 commit comments

Comments
 (0)