Skip to content

Commit

Permalink
Handle absence of remote translog repo
Browse files Browse the repository at this point in the history
Signed-off-by: Sachin Kale <[email protected]>
  • Loading branch information
Sachin Kale committed Dec 28, 2022
1 parent 468de59 commit 422f993
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 42 deletions.
15 changes: 8 additions & 7 deletions server/src/main/java/org/opensearch/index/shard/IndexShard.java
Original file line number Diff line number Diff line change
Expand Up @@ -3082,13 +3082,14 @@ public void startRecovery(
executeRecovery("from store", recoveryState, recoveryListener, this::recoverFromStore);
break;
case REMOTE_STORE:
final String remoteRepo = indexSettings.getRemoteStoreTranslogRepository();
executeRecovery(
"from remote store",
recoveryState,
recoveryListener,
l -> restoreFromRemoteStore(repositoriesService.repository(remoteRepo), l)
);
final Repository remoteTranslogRepo;
final String remoteTranslogRepoName = indexSettings.getRemoteStoreTranslogRepository();
if (remoteTranslogRepoName != null) {
remoteTranslogRepo = repositoriesService.repository(remoteTranslogRepoName);
} else {
remoteTranslogRepo = null;
}
executeRecovery("from remote store", recoveryState, recoveryListener, l -> restoreFromRemoteStore(remoteTranslogRepo, l));
break;
case PEER:
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,7 @@ private void recoverFromRemoteStore(IndexShard indexShard, Repository repository
fileTransferTracker,
fileTransferTracker::exclusionFilter
);
RemoteFsTranslog.download(translogTransferManager, indexShard.shardPath().resolveTranslog(), true);
RemoteFsTranslog.download(translogTransferManager, indexShard.shardPath().resolveTranslog());
}

assert indexShard.shardRouting.primary() : "only primary shards can recover from store";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ public RemoteFsTranslog(
);

try {
Checkpoint checkpoint = readCheckpoint();
download(translogTransferManager, location);
Checkpoint checkpoint = readCheckpoint(location);
this.readers.addAll(recoverFromFiles(checkpoint));
if (readers.isEmpty()) {
throw new IllegalStateException("at least one reader must be recovered");
Expand Down Expand Up @@ -99,44 +100,15 @@ public RemoteFsTranslog(
}
}

private Checkpoint readCheckpoint() throws IOException {
boolean override = false;
Checkpoint checkpoint;
try {
checkpoint = readCheckpoint(location);
if (isLocalTranslogLagging(checkpoint, primaryTermSupplier.getAsLong()) == false) {
return checkpoint;
} else {
logger.info("Local checkpoint is behind remote, downloading the diff from remote translog");
}
} catch (Exception e) {
logger.warn("Exception while reading checkpoint, downloading from remote translog");
override = true;
}
download(translogTransferManager, location, override);
checkpoint = readCheckpoint(location);
return checkpoint;
}

private boolean isLocalTranslogLagging(Checkpoint checkpoint, long primaryTerm) throws IOException {
TranslogTransferMetadata translogMetadata = translogTransferManager.readMetadata();
if (translogMetadata != null) {
return translogMetadata.getGeneration() > checkpoint.getGeneration() && translogMetadata.getPrimaryTerm() >= primaryTerm;
}
return false;
}

public static void download(TranslogTransferManager translogTransferManager, Path location, boolean override) throws IOException {
public static void download(TranslogTransferManager translogTransferManager, Path location) throws IOException {
TranslogTransferMetadata translogMetadata = translogTransferManager.readMetadata();
if (translogMetadata != null) {
if (Files.notExists(location)) {
Files.createDirectories(location);
}
if (override) {
// Delete translog files on local before downloading from remote
for (Path file : FileSystemUtils.files(location)) {
Files.delete(file);
}
// Delete translog files on local before downloading from remote
for (Path file : FileSystemUtils.files(location)) {
Files.delete(file);
}
Map<String, String> generationToPrimaryTermMapper = translogMetadata.getGenerationToPrimaryTermMapper();
for (long i = translogMetadata.getGeneration(); i >= translogMetadata.getMinTranslogGeneration(); i--) {
Expand Down

0 comments on commit 422f993

Please sign in to comment.