Skip to content

Commit 3726c52

Browse files
authored
Populate RecoveryState details for shallow snapshot restore (opensearch-project#15353)
--------- Signed-off-by: Lakshya Taragi <lakshya.taragi@gmail.com>
1 parent 8629279 commit 3726c52

File tree

3 files changed

+52
-4
lines changed

3 files changed

+52
-4
lines changed

server/src/internalClusterTest/java/org/opensearch/remotestore/RemoteRestoreSnapshotIT.java

+35
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@
1313
import org.opensearch.action.admin.cluster.snapshots.create.CreateSnapshotResponse;
1414
import org.opensearch.action.admin.cluster.snapshots.restore.RestoreSnapshotResponse;
1515
import org.opensearch.action.admin.indices.delete.DeleteIndexRequest;
16+
import org.opensearch.action.admin.indices.recovery.RecoveryResponse;
1617
import org.opensearch.action.delete.DeleteResponse;
1718
import org.opensearch.action.support.PlainActionFuture;
1819
import org.opensearch.client.Client;
1920
import org.opensearch.client.Requests;
2021
import org.opensearch.cluster.ClusterState;
2122
import org.opensearch.cluster.metadata.IndexMetadata;
23+
import org.opensearch.cluster.routing.RecoverySource;
2224
import org.opensearch.common.Nullable;
2325
import org.opensearch.common.blobstore.BlobPath;
2426
import org.opensearch.common.io.PathUtils;
@@ -34,6 +36,7 @@
3436
import org.opensearch.index.shard.IndexShard;
3537
import org.opensearch.indices.IndicesService;
3638
import org.opensearch.indices.RemoteStoreSettings;
39+
import org.opensearch.indices.recovery.RecoveryState;
3740
import org.opensearch.indices.replication.common.ReplicationType;
3841
import org.opensearch.repositories.RepositoriesService;
3942
import org.opensearch.repositories.Repository;
@@ -73,6 +76,7 @@
7376
import static org.hamcrest.Matchers.equalTo;
7477
import static org.hamcrest.Matchers.greaterThan;
7578
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
79+
import static org.hamcrest.Matchers.lessThanOrEqualTo;
7680

7781
@OpenSearchIntegTestCase.ClusterScope(scope = OpenSearchIntegTestCase.Scope.TEST, numDataNodes = 0)
7882
public class RemoteRestoreSnapshotIT extends AbstractSnapshotIntegTestCase {
@@ -589,6 +593,37 @@ public void testRestoreShallowSnapshotRepository() throws ExecutionException, In
589593
ensureGreen(restoredIndexName1);
590594
assertDocsPresentInIndex(client, restoredIndexName1, numDocsInIndex1);
591595

596+
// ensure recovery details are non-zero
597+
RecoveryResponse recoveryResponse = client().admin().indices().prepareRecoveries(restoredIndexName1).execute().actionGet();
598+
assertEquals(1, recoveryResponse.getTotalShards());
599+
assertEquals(1, recoveryResponse.getSuccessfulShards());
600+
assertEquals(0, recoveryResponse.getFailedShards());
601+
assertEquals(1, recoveryResponse.shardRecoveryStates().size());
602+
assertTrue(recoveryResponse.shardRecoveryStates().containsKey(restoredIndexName1));
603+
assertEquals(1, recoveryResponse.shardRecoveryStates().get(restoredIndexName1).size());
604+
605+
RecoveryState recoveryState = recoveryResponse.shardRecoveryStates().get(restoredIndexName1).get(0);
606+
assertEquals(RecoveryState.Stage.DONE, recoveryState.getStage());
607+
assertEquals(0, recoveryState.getShardId().getId());
608+
assertTrue(recoveryState.getPrimary());
609+
assertEquals(RecoverySource.Type.SNAPSHOT, recoveryState.getRecoverySource().getType());
610+
assertThat(recoveryState.getIndex().time(), greaterThanOrEqualTo(0L));
611+
612+
// ensure populated file details
613+
assertTrue(recoveryState.getIndex().totalFileCount() > 0);
614+
assertTrue(recoveryState.getIndex().totalRecoverFiles() > 0);
615+
assertTrue(recoveryState.getIndex().recoveredFileCount() > 0);
616+
assertThat(recoveryState.getIndex().recoveredFilesPercent(), greaterThanOrEqualTo(0.0f));
617+
assertThat(recoveryState.getIndex().recoveredFilesPercent(), lessThanOrEqualTo(100.0f));
618+
assertFalse(recoveryState.getIndex().fileDetails().isEmpty());
619+
620+
// ensure populated bytes details
621+
assertTrue(recoveryState.getIndex().recoveredBytes() > 0L);
622+
assertTrue(recoveryState.getIndex().totalBytes() > 0L);
623+
assertTrue(recoveryState.getIndex().totalRecoverBytes() > 0L);
624+
assertThat(recoveryState.getIndex().recoveredBytesPercent(), greaterThanOrEqualTo(0.0f));
625+
assertThat(recoveryState.getIndex().recoveredBytesPercent(), lessThanOrEqualTo(100.0f));
626+
592627
// indexing some new docs and validating
593628
indexDocuments(client, restoredIndexName1, numDocsInIndex1, numDocsInIndex1 + 2);
594629
ensureGreen(restoredIndexName1);

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

+15-2
Original file line numberDiff line numberDiff line change
@@ -5117,10 +5117,23 @@ public void syncSegmentsFromGivenRemoteSegmentStore(
51175117
}
51185118
Map<String, RemoteSegmentStoreDirectory.UploadedSegmentMetadata> uploadedSegments = sourceRemoteDirectory
51195119
.getSegmentsUploadedToRemoteStore();
5120-
final Directory storeDirectory = store.directory();
51215120
store.incRef();
5122-
51235121
try {
5122+
final Directory storeDirectory;
5123+
if (recoveryState.getStage() == RecoveryState.Stage.INDEX) {
5124+
storeDirectory = new StoreRecovery.StatsDirectoryWrapper(store.directory(), recoveryState.getIndex());
5125+
for (String file : uploadedSegments.keySet()) {
5126+
long checksum = Long.parseLong(uploadedSegments.get(file).getChecksum());
5127+
if (overrideLocal || localDirectoryContains(storeDirectory, file, checksum) == false) {
5128+
recoveryState.getIndex().addFileDetail(file, uploadedSegments.get(file).getLength(), false);
5129+
} else {
5130+
recoveryState.getIndex().addFileDetail(file, uploadedSegments.get(file).getLength(), true);
5131+
}
5132+
}
5133+
} else {
5134+
storeDirectory = store.directory();
5135+
}
5136+
51245137
String segmentsNFile = copySegmentFiles(
51255138
storeDirectory,
51265139
sourceRemoteDirectory,

server/src/test/java/org/opensearch/index/shard/IndexShardTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -2896,9 +2896,9 @@ public void testSyncSegmentsFromGivenRemoteSegmentStore() throws IOException {
28962896
RecoverySource.ExistingStoreRecoverySource.INSTANCE
28972897
);
28982898
routing = ShardRoutingHelper.newWithRestoreSource(routing, new RecoverySource.EmptyStoreRecoverySource());
2899-
29002899
target = reinitShard(target, routing);
2901-
2900+
DiscoveryNode localNode = new DiscoveryNode("foo", buildNewFakeTransportAddress(), emptyMap(), emptySet(), Version.CURRENT);
2901+
target.markAsRecovering("from snapshot", new RecoveryState(routing, localNode, null));
29022902
target.syncSegmentsFromGivenRemoteSegmentStore(false, tempRemoteSegmentDirectory, primaryTerm, commitGeneration);
29032903
RemoteSegmentStoreDirectory remoteStoreDirectory = ((RemoteSegmentStoreDirectory) ((FilterDirectory) ((FilterDirectory) target
29042904
.remoteStore()

0 commit comments

Comments
 (0)