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 2fbc910aa29 HDDS-11620. Log SCM finalization completion (#10963)
2fbc910aa29 is described below

commit 2fbc910aa29203811f34ed1f92cdbc92ac53919a
Author: Shuo Huang <[email protected]>
AuthorDate: Wed Aug 12 16:09:20 2026 +0800

    HDDS-11620. Log SCM finalization completion (#10963)
---
 .../scm/server/upgrade/SCMUpgradeFinalizer.java    |  1 +
 .../hdds/scm/upgrade/TestScmFinalization.java      | 50 +++++++++++++++++++++-
 2 files changed, 49 insertions(+), 2 deletions(-)

diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/SCMUpgradeFinalizer.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/SCMUpgradeFinalizer.java
index 6fb479592ad..cab9321937b 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/SCMUpgradeFinalizer.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/SCMUpgradeFinalizer.java
@@ -118,6 +118,7 @@ public void 
postFinalizeUpgrade(SCMUpgradeFinalizationContext context)
       createPipelinesAfterFinalization(context);
       stateManager.removeFinalizingMark();
     }
+    logCheckpointCrossed(FinalizationCheckpoint.FINALIZATION_COMPLETE);
   }
 
   private void closePipelinesBeforeFinalization(PipelineManager 
pipelineManager)
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/upgrade/TestScmFinalization.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/upgrade/TestScmFinalization.java
index 67e661bc9d0..12fddb06b1a 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/upgrade/TestScmFinalization.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/upgrade/TestScmFinalization.java
@@ -19,9 +19,11 @@
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.matches;
@@ -31,6 +33,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.UUID;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
@@ -53,6 +56,8 @@
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.upgrade.UpgradeFinalization;
 import org.apache.hadoop.ozone.upgrade.UpgradeFinalization.StatusAndMessages;
+import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer;
+import org.apache.ozone.test.GenericTestUtils.LogCapturer;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.EnumSource;
@@ -65,6 +70,8 @@
  * Tests SCM finalization operations on mocked upgrade state.
  */
 public class TestScmFinalization {
+  private static final String FINALIZATION_COMPLETE_LOG =
+      "SCM Finalization has crossed checkpoint FINALIZATION_COMPLETE";
   private static final Logger LOG =
       LoggerFactory.getLogger(TestScmFinalization.class);
 
@@ -231,8 +238,17 @@ public void testResumeFinalizationFromCheckpoint(
 
     // Execute upgrade finalization, then check that events happened in the
     // correct order.
-    StatusAndMessages status =
-        manager.finalizeUpgrade(UUID.randomUUID().toString());
+    LogCapturer logCapturer =
+        LogCapturer.captureLogs(UpgradeFinalizer.class);
+    StatusAndMessages status;
+    try {
+      status = manager.finalizeUpgrade(UUID.randomUUID().toString());
+      assertEquals(
+          initialCheckpoint != FinalizationCheckpoint.FINALIZATION_COMPLETE,
+          logCapturer.getOutput().contains(FINALIZATION_COMPLETE_LOG));
+    } finally {
+      logCapturer.stopCapturing();
+    }
     assertEquals(getStatusFromCheckpoint(initialCheckpoint).status(),
         status.status());
 
@@ -296,6 +312,36 @@ public void testResumeFinalizationFromCheckpoint(
     // have been invoked.
   }
 
+  @Test
+  public void testFinalizationCompleteNotLoggedWhenRemovingMarkFails()
+      throws Exception {
+    FinalizationStateManager stateManager = 
mock(FinalizationStateManager.class);
+    when(stateManager.crossedCheckpoint(
+        FinalizationCheckpoint.FINALIZATION_COMPLETE)).thenReturn(false);
+    doThrow(new IOException("Failed to remove finalizing mark"))
+        .when(stateManager).removeFinalizingMark();
+
+    SCMUpgradeFinalizationContext context =
+        mock(SCMUpgradeFinalizationContext.class);
+    PipelineManager pipelineManager = getMockPipelineManager(
+        FinalizationCheckpoint.MLV_EQUALS_SLV);
+    when(context.getFinalizationStateManager()).thenReturn(stateManager);
+    when(context.getPipelineManager()).thenReturn(pipelineManager);
+    when(context.getSCMContext()).thenReturn(SCMContext.emptyContext());
+
+    SCMUpgradeFinalizer finalizer =
+        new SCMUpgradeFinalizer(mock(HDDSLayoutVersionManager.class));
+    LogCapturer logCapturer = LogCapturer.captureLogs(UpgradeFinalizer.class);
+    try {
+      IOException exception = assertThrows(IOException.class,
+          () -> finalizer.postFinalizeUpgrade(context));
+      assertEquals("Failed to remove finalizing mark", exception.getMessage());
+      assertFalse(logCapturer.getOutput().contains(FINALIZATION_COMPLETE_LOG));
+    } finally {
+      logCapturer.stopCapturing();
+    }
+  }
+
   /**
    * On startup, the finalization table will be read to determine the
    * checkpoint we are resuming from. After this, the results will be stored


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to