From 71c24b4285fa96b108f7ff603d4fdd9e603884f6 Mon Sep 17 00:00:00 2001 From: Sachin Kale Date: Tue, 6 Jun 2023 15:27:17 +0530 Subject: [PATCH] Use same UUID when remote translog is disabled Signed-off-by: Sachin Kale --- .../java/org/opensearch/index/shard/IndexShard.java | 11 +++++++++++ .../index/shard/RemoteStoreRefreshListener.java | 1 - 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/org/opensearch/index/shard/IndexShard.java b/server/src/main/java/org/opensearch/index/shard/IndexShard.java index 808a016c28632..c1ec6b38e0f9e 100644 --- a/server/src/main/java/org/opensearch/index/shard/IndexShard.java +++ b/server/src/main/java/org/opensearch/index/shard/IndexShard.java @@ -200,6 +200,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.EnumSet; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; @@ -228,6 +229,7 @@ import static org.opensearch.index.seqno.SequenceNumbers.MAX_SEQ_NO; import static org.opensearch.index.seqno.SequenceNumbers.UNASSIGNED_SEQ_NO; import static org.opensearch.index.translog.Translog.Durability; +import static org.opensearch.index.translog.Translog.TRANSLOG_UUID_KEY; /** * An OpenSearch index shard @@ -4538,6 +4540,15 @@ public void syncSegmentsFromRemoteSegmentStore(boolean overrideLocal, boolean re .max(Comparator.comparingLong(SegmentInfos::generationFromSegmentsFileName)); if (localMaxSegmentInfos.isPresent() && infosSnapshot.getGeneration() < SegmentInfos.generationFromSegmentsFileName(localMaxSegmentInfos.get()) - 1) { + // If remote translog is not enabled, local translog will be created with different UUID. + // This fails in Store.trimUnsafeCommits() as translog UUID of checkpoint and SegmentInfos needs + // to be same. Following code block make sure to have the same UUID. + if (indexSettings.isRemoteTranslogStoreEnabled() == false) { + SegmentInfos localSegmentInfos = store.readLastCommittedSegmentsInfo(); + Map userData = new HashMap<>(infosSnapshot.getUserData()); + userData.put(TRANSLOG_UUID_KEY, localSegmentInfos.userData.get(TRANSLOG_UUID_KEY)); + infosSnapshot.setUserData(userData, false); + } storeDirectory.deleteFile(localMaxSegmentInfos.get()); } store.commitSegmentInfos(infosSnapshot, processedLocalCheckpoint, processedLocalCheckpoint); diff --git a/server/src/main/java/org/opensearch/index/shard/RemoteStoreRefreshListener.java b/server/src/main/java/org/opensearch/index/shard/RemoteStoreRefreshListener.java index 3e567d1a26947..e8384d8e2f4a6 100644 --- a/server/src/main/java/org/opensearch/index/shard/RemoteStoreRefreshListener.java +++ b/server/src/main/java/org/opensearch/index/shard/RemoteStoreRefreshListener.java @@ -83,7 +83,6 @@ public final class RemoteStoreRefreshListener implements ReferenceManager.Refres static final Set EXCLUDE_FILES = Set.of("write.lock"); // Visible for testing static final int LAST_N_METADATA_FILES_TO_KEEP = 10; - static final String SEGMENT_INFO_SNAPSHOT_FILENAME_PREFIX = "segment_infos_snapshot_filename"; private final IndexShard indexShard; private final Directory storeDirectory;