Skip to content

Commit 0e04819

Browse files
ltaragiSachin Kale
authored and
Sachin Kale
committed
Populate RecoveryState details for shallow snapshot restore (#15353)
--------- Signed-off-by: Lakshya Taragi <lakshya.taragi@gmail.com> Signed-off-by: Sachin Kale <kalsac@amazon.com>
1 parent 5653ed6 commit 0e04819

File tree

3 files changed

+53
-4
lines changed

3 files changed

+53
-4
lines changed

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

+36
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@
1212
import org.opensearch.action.admin.cluster.remotestore.restore.RestoreRemoteStoreRequest;
1313
import org.opensearch.action.admin.cluster.snapshots.restore.RestoreSnapshotResponse;
1414
import org.opensearch.action.admin.indices.delete.DeleteIndexRequest;
15+
import org.opensearch.action.admin.indices.recovery.RecoveryResponse;
1516
import org.opensearch.action.delete.DeleteResponse;
1617
import org.opensearch.action.support.PlainActionFuture;
1718
import org.opensearch.client.Client;
1819
import org.opensearch.client.Requests;
1920
import org.opensearch.cluster.ClusterState;
2021
import org.opensearch.cluster.metadata.IndexMetadata;
22+
import org.opensearch.cluster.routing.RecoverySource;
2123
import org.opensearch.common.Nullable;
2224
import org.opensearch.common.blobstore.BlobPath;
2325
import org.opensearch.common.io.PathUtils;
@@ -31,6 +33,7 @@
3133
import org.opensearch.index.remote.RemoteStoreEnums.PathType;
3234
import org.opensearch.index.shard.IndexShard;
3335
import org.opensearch.indices.IndicesService;
36+
import org.opensearch.indices.recovery.RecoveryState;
3437
import org.opensearch.indices.replication.common.ReplicationType;
3538
import org.opensearch.snapshots.AbstractSnapshotIntegTestCase;
3639
import org.opensearch.snapshots.SnapshotInfo;
@@ -63,6 +66,8 @@
6366
import static org.opensearch.test.hamcrest.OpenSearchAssertions.assertAcked;
6467
import static org.hamcrest.Matchers.equalTo;
6568
import static org.hamcrest.Matchers.greaterThan;
69+
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
70+
import static org.hamcrest.Matchers.lessThanOrEqualTo;
6671

6772
@OpenSearchIntegTestCase.ClusterScope(scope = OpenSearchIntegTestCase.Scope.TEST, numDataNodes = 0)
6873
public class RemoteRestoreSnapshotIT extends AbstractSnapshotIntegTestCase {
@@ -579,6 +584,37 @@ public void testRestoreShallowSnapshotRepository() throws ExecutionException, In
579584
ensureGreen(restoredIndexName1);
580585
assertDocsPresentInIndex(client, restoredIndexName1, numDocsInIndex1);
581586

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

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

+15-2
Original file line numberDiff line numberDiff line change
@@ -5130,10 +5130,23 @@ public void syncSegmentsFromGivenRemoteSegmentStore(
51305130
}
51315131
Map<String, RemoteSegmentStoreDirectory.UploadedSegmentMetadata> uploadedSegments = sourceRemoteDirectory
51325132
.getSegmentsUploadedToRemoteStore();
5133-
final Directory storeDirectory = store.directory();
51345133
store.incRef();
5135-
51365134
try {
5135+
final Directory storeDirectory;
5136+
if (recoveryState.getStage() == RecoveryState.Stage.INDEX) {
5137+
storeDirectory = new StoreRecovery.StatsDirectoryWrapper(store.directory(), recoveryState.getIndex());
5138+
for (String file : uploadedSegments.keySet()) {
5139+
long checksum = Long.parseLong(uploadedSegments.get(file).getChecksum());
5140+
if (overrideLocal || localDirectoryContains(storeDirectory, file, checksum) == false) {
5141+
recoveryState.getIndex().addFileDetail(file, uploadedSegments.get(file).getLength(), false);
5142+
} else {
5143+
recoveryState.getIndex().addFileDetail(file, uploadedSegments.get(file).getLength(), true);
5144+
}
5145+
}
5146+
} else {
5147+
storeDirectory = store.directory();
5148+
}
5149+
51375150
String segmentsNFile = copySegmentFiles(
51385151
storeDirectory,
51395152
sourceRemoteDirectory,

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -2834,9 +2834,9 @@ public void testSyncSegmentsFromGivenRemoteSegmentStore() throws IOException {
28342834
RecoverySource.ExistingStoreRecoverySource.INSTANCE
28352835
);
28362836
routing = ShardRoutingHelper.newWithRestoreSource(routing, new RecoverySource.EmptyStoreRecoverySource());
2837-
28382837
target = reinitShard(target, routing);
2839-
2838+
DiscoveryNode localNode = new DiscoveryNode("foo", buildNewFakeTransportAddress(), emptyMap(), emptySet(), Version.CURRENT);
2839+
target.markAsRecovering("from snapshot", new RecoveryState(routing, localNode, null));
28402840
target.syncSegmentsFromGivenRemoteSegmentStore(false, tempRemoteSegmentDirectory, primaryTerm, commitGeneration);
28412841
RemoteSegmentStoreDirectory remoteStoreDirectory = ((RemoteSegmentStoreDirectory) ((FilterDirectory) ((FilterDirectory) target
28422842
.remoteStore()

0 commit comments

Comments
 (0)