This is an automated email from the ASF dual-hosted git repository.
smengcl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 951ed5cb51b HDDS-16086. installCheckpoint sets OM transaction info
inconsistent with the checkpoint index (#10943)
951ed5cb51b is described below
commit 951ed5cb51b3426840dccc5647e1144959e76c38
Author: Siyao Meng <[email protected]>
AuthorDate: Sat Aug 8 15:23:37 2026 -0700
HDDS-16086. installCheckpoint sets OM transaction info inconsistent with
the checkpoint index (#10943)
Co-authored-by: Claude Opus 5 <[email protected]>
---
.../hadoop/ozone/om/TestOMRatisSnapshots.java | 49 ++++++++++++++++++++++
.../org/apache/hadoop/ozone/om/OzoneManager.java | 5 ++-
2 files changed, 53 insertions(+), 1 deletion(-)
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMRatisSnapshots.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMRatisSnapshots.java
index e61f2cad1a9..7be575e7162 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMRatisSnapshots.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMRatisSnapshots.java
@@ -653,6 +653,55 @@ private static Set<String> topLevelNames(File metaDir)
throws IOException {
}
}
+ /**
+ * After a successful install the in-memory transaction info must describe
the
+ * position the state machine was unpaused at, not the follower's pre-install
+ * index. Asserted immediately after the call: a later takeSnapshot
recomputes
+ * the value from the applied index and would mask a regression here.
+ *
+ * This pins an Ozone-internal invariant, not the Ratis contract. Calling
+ * installCheckpoint directly queues no Ratis reload, so the pre-fix value
seen
+ * here is starker than a real install leaves behind.
+ */
+ @Test
+ public void testInstallCheckpointPublishesNewTransactionInfo() throws
Exception {
+ final String leaderOMNodeId =
OmTestUtil.getCurrentOmProxyNodeId(objectStore);
+ OzoneManager leaderOM = cluster.getOzoneManager(leaderOMNodeId);
+ OzoneManagerRatisServer leaderRatisServer = leaderOM.getOmRatisServer();
+
+ String followerNodeId = leaderOM.getPeerNodes().get(0).getNodeId();
+ if (cluster.isOMActive(followerNodeId)) {
+ followerNodeId = leaderOM.getPeerNodes().get(1).getNodeId();
+ }
+ OzoneManager followerOM = cluster.getOzoneManager(followerNodeId);
+
+ writeKeysToIncreaseLogIndex(leaderRatisServer, 100);
+
+ DBCheckpoint leaderDbCheckpoint =
+ leaderOM.getMetadataManager().getStore().getCheckpoint(false);
+ Path leaderCheckpointLocation = leaderDbCheckpoint.getCheckpointLocation();
+ assertNotNull(leaderCheckpointLocation);
+ Path omDbDir = leaderCheckpointLocation.resolve(OM_DB_NAME);
+ assertTrue(omDbDir.toFile().mkdir());
+ moveCheckpointContentsToOmDbDir(leaderCheckpointLocation, omDbDir);
+ TransactionInfo leaderCheckpointTrxnInfo =
+ OzoneManagerRatisUtils.getTrxnInfoFromCheckpoint(conf, omDbDir);
+
+ // The follower was never started, so restarting its RPC server at the end
of
+ // installCheckpoint fails. That happens after the transaction info is
published
+ // and is not what this test is about, so swallow the exit.
+ followerOM.setExitManagerForTesting(new DummyExitManager());
+
+ TermIndex installed = followerOM.installCheckpoint(
+ leaderOMNodeId, leaderCheckpointLocation, leaderCheckpointTrxnInfo);
+ assertNotNull(installed, "Install should have succeeded");
+ assertEquals(leaderCheckpointTrxnInfo.getTransactionIndex(),
installed.getIndex());
+
+ assertEquals(followerOM.getOmRatisServer().getLastAppliedTermIndex(),
+ followerOM.getTransactionInfo().getTermIndex(),
+ "In-memory transaction info must match the position the state machine
was unpaused at");
+ }
+
@Test
public void testInstallSnapshotFromLeaderFailedDownloadCleanupSucceeds()
throws Exception {
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
index d35ffb25a8b..225ddeb6c90 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
@@ -4388,7 +4388,10 @@ TermIndex installCheckpoint(String leaderId, Path
checkpointLocation,
if (oldOmMetadataManagerStopped) {
time = Time.monotonicNow();
reloadOMState();
- setTransactionInfo(TransactionInfo.valueOf(termIndex));
+ // Ratis may read this field through getLatestSnapshot() when
decideVote()
+ // obtains the last entry. Publish the position used to unpause. After
a failed
+ // DB replacement, these values still identify the restored
pre-install state.
+ setTransactionInfo(TransactionInfo.valueOf(term, lastAppliedIndex));
omRatisServer.getOmStateMachine().unpause(lastAppliedIndex, term);
newMetadataManagerStarted = true;
LOG.info("Reloaded OM state with Term: {} and Index: {}. Spend {} ms",
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]