This is an automated email from the ASF dual-hosted git repository.

errose28 pushed a commit to branch HDDS-14496-zdu
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/HDDS-14496-zdu by this push:
     new 4cd5c364dfb HDDS-16024. Make OM and SCM proto finalization status an 
enum (#10902)
4cd5c364dfb is described below

commit 4cd5c364dfb8d17cf87245bd41e24b27d0a9dd95
Author: Ethan Rose <[email protected]>
AuthorDate: Mon Aug 3 11:59:29 2026 -0400

    HDDS-16024. Make OM and SCM proto finalization status an enum (#10902)
---
 .../interface-client/src/main/proto/hdds.proto     |  11 +-
 .../hdds/scm/server/SCMClientProtocolServer.java   |  21 +++-
 .../scm/server/TestSCMClientProtocolServer.java    |  44 +++++++-
 .../ozone/admin/upgrade/FinalizeSubCommand.java    |   3 +-
 .../ozone/admin/upgrade/StatusSubCommand.java      |  36 ++++---
 .../admin/upgrade/TestFinalizeSubCommand.java      |  59 ++++++-----
 .../ozone/admin/upgrade/TestStatusSubCommand.java  | 111 ++++++++++++++++-----
 .../hadoop/hdds/upgrade/HddsUpgradeTestUtils.java  |   2 +-
 .../apache/hadoop/ozone/om/OMUpgradeTestUtils.java |   8 +-
 .../hadoop/ozone/om/TestOMUpgradeFinalization.java |  41 ++++++++
 .../src/main/proto/OmClientProtocol.proto          |   6 +-
 .../org/apache/hadoop/ozone/om/OzoneManager.java   |  27 ++++-
 .../ozone/om/upgrade/OMUpgradeFinalizeService.java |   2 +-
 .../om/upgrade/TestOMUpgradeFinalizeService.java   |  25 +++--
 .../protocolPB/TestOzoneManagerRequestHandler.java |   7 +-
 15 files changed, 304 insertions(+), 99 deletions(-)

diff --git a/hadoop-hdds/interface-client/src/main/proto/hdds.proto 
b/hadoop-hdds/interface-client/src/main/proto/hdds.proto
index fe19f300089..d3074d371b2 100644
--- a/hadoop-hdds/interface-client/src/main/proto/hdds.proto
+++ b/hadoop-hdds/interface-client/src/main/proto/hdds.proto
@@ -430,9 +430,16 @@ message UpgradeFinalizationStatus {
     repeated string messages = 2;
 }
 
+// Finalization status of a component or group of components.
+enum FinalizationStatus {
+    UNFINALIZED = 1;
+    FINALIZED = 2;
+    IN_PROGRESS = 3;
+}
+
 message UpgradeStatus {
-  optional bool hddsFinalized = 1;
-  optional bool scmFinalized = 2;
+  optional FinalizationStatus hddsFinalizationStatus = 1;
+  optional FinalizationStatus scmFinalizationStatus = 2;
   optional int32 numDatanodesFinalized = 3;
   optional int32 numDatanodesTotal = 4;
   optional uint32 scmApparentVersion = 5;
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
index 62301645700..54434de80ec 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
@@ -1219,18 +1219,33 @@ public HddsProtos.UpgradeStatus queryUpgradeStatus() 
throws IOException {
             + "safe mode and try again.", ResultCodes.SAFE_MODE_EXCEPTION);
       }
 
+      // Set SCM finalization status to return to the client.
+      // Since SCM finalization goes through Ratis, it moves from unfinalized 
to finalized immediately with no
+      // in-progress state.
       boolean scmFinalized = !scm.getVersionManager().needsFinalization();
+      HddsProtos.FinalizationStatus scmFinalizationStatus =
+          scmFinalized ? HddsProtos.FinalizationStatus.FINALIZED : 
HddsProtos.FinalizationStatus.UNFINALIZED;
+
+      // Set overall HDDS finalization status (SCM and Datanodes) to return to 
the client.
       NodeManager.DatanodeFinalizationCounts datanodeFinalizationCounts =
           scm.getScmNodeManager().getDatanodeFinalizationCounts();
       int finalizedDatanodes = 
datanodeFinalizationCounts.getNumFinalizedDatanodes();
       int healthyDatanodes = 
datanodeFinalizationCounts.getTotalHealthyDatanodes();
-      boolean hddsFinalized = scmFinalized && 
datanodeFinalizationCounts.allNodesFinalized();
+      HddsProtos.FinalizationStatus hddsFinalizationStatus;
+      if (!scmFinalized) {
+        // SCM must finish finalizing before Datanodes can start finalizing.
+        hddsFinalizationStatus = HddsProtos.FinalizationStatus.UNFINALIZED;
+      } else if (datanodeFinalizationCounts.allNodesFinalized()) {
+        hddsFinalizationStatus = HddsProtos.FinalizationStatus.FINALIZED;
+      } else {
+        hddsFinalizationStatus = HddsProtos.FinalizationStatus.IN_PROGRESS;
+      }
 
       HddsProtos.UpgradeStatus result = HddsProtos.UpgradeStatus.newBuilder()
-          .setScmFinalized(scmFinalized)
+          .setScmFinalizationStatus(scmFinalizationStatus)
           .setNumDatanodesFinalized(finalizedDatanodes)
           .setNumDatanodesTotal(healthyDatanodes)
-          .setHddsFinalized(hddsFinalized)
+          .setHddsFinalizationStatus(hddsFinalizationStatus)
           
.setScmApparentVersion(scm.getVersionManager().getApparentVersion().serialize())
           
.setMinDatanodeApparentVersion(datanodeFinalizationCounts.getMinApparentVersion())
           
.setMaxDatanodeApparentVersion(datanodeFinalizationCounts.getMaxApparentVersion())
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMClientProtocolServer.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMClientProtocolServer.java
index 8ac74e4b86b..f044656b203 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMClientProtocolServer.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMClientProtocolServer.java
@@ -39,6 +39,7 @@
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
+import org.apache.hadoop.hdds.ComponentVersion;
 import org.apache.hadoop.hdds.client.RatisReplicationConfig;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.conf.ReconfigurationHandler;
@@ -49,10 +50,12 @@
 import org.apache.hadoop.hdds.scm.HddsTestUtils;
 import org.apache.hadoop.hdds.scm.container.ContainerInfo;
 import org.apache.hadoop.hdds.scm.container.ContainerManagerImpl;
+import org.apache.hadoop.hdds.scm.container.MockNodeManager;
 import org.apache.hadoop.hdds.scm.exceptions.SCMException;
 import org.apache.hadoop.hdds.scm.ha.SCMContext;
 import org.apache.hadoop.hdds.scm.ha.SCMHAManagerStub;
 import org.apache.hadoop.hdds.scm.ha.SCMNodeDetails;
+import org.apache.hadoop.hdds.scm.node.NodeManager;
 import org.apache.hadoop.hdds.scm.pipeline.PipelineID;
 import 
org.apache.hadoop.hdds.scm.protocol.StorageContainerLocationProtocolServerSideTranslatorPB;
 import org.apache.hadoop.hdds.scm.safemode.SCMSafeModeManager;
@@ -281,11 +284,48 @@ public void testQueryUpgradeStatus() throws Exception {
     HddsProtos.UpgradeStatus status = server.queryUpgradeStatus();
 
     // SCM starts already finalized in tests
-    assertTrue(status.getScmFinalized());
+    assertEquals(HddsProtos.FinalizationStatus.FINALIZED, 
status.getScmFinalizationStatus());
     // No datanodes registered
     assertEquals(0, status.getNumDatanodesFinalized());
     assertEquals(0, status.getNumDatanodesTotal());
-    assertTrue(status.getHddsFinalized());
+    assertEquals(HddsProtos.FinalizationStatus.FINALIZED, 
status.getHddsFinalizationStatus());
+  }
+
+  @Test
+  public void testQueryUpgradeStatusHddsInProgress() throws Exception {
+    // SCM is finalized but not all datanodes are, so HDDS finalization is 
still in progress.
+    ScmVersionManager mockVersionManager = mock(ScmVersionManager.class);
+    when(mockVersionManager.needsFinalization()).thenReturn(false);
+    ComponentVersion apparentVersion = mock(ComponentVersion.class);
+    when(apparentVersion.serialize()).thenReturn(0);
+    when(mockVersionManager.getApparentVersion()).thenReturn(apparentVersion);
+
+    NodeManager mockNodeManager = new MockNodeManager(false, 0) {
+      @Override
+      public DatanodeFinalizationCounts getDatanodeFinalizationCounts() {
+        return DatanodeFinalizationCounts.newBuilder()
+            .setNumFinalizedDatanodes(1)
+            .setTotalHealthyDatanodes(3)
+            .build();
+      }
+    };
+
+    StorageContainerManager mockScm = mockStorageContainerManager();
+    when(mockScm.getVersionManager()).thenReturn(mockVersionManager);
+    when(mockScm.getScmNodeManager()).thenReturn(mockNodeManager);
+    when(mockScm.getScmContext()).thenReturn(SCMContext.emptyContext());
+
+    SCMClientProtocolServer testServer = new SCMClientProtocolServer(
+        new OzoneConfiguration(), mockScm, mock(ReconfigurationHandler.class));
+    try {
+      HddsProtos.UpgradeStatus status = testServer.queryUpgradeStatus();
+      assertEquals(HddsProtos.FinalizationStatus.FINALIZED, 
status.getScmFinalizationStatus());
+      assertEquals(HddsProtos.FinalizationStatus.IN_PROGRESS, 
status.getHddsFinalizationStatus());
+      assertEquals(1, status.getNumDatanodesFinalized());
+      assertEquals(3, status.getNumDatanodesTotal());
+    } finally {
+      testServer.stop();
+    }
   }
 
   @Test
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/upgrade/FinalizeSubCommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/upgrade/FinalizeSubCommand.java
index 1d0bcd981cc..e0473104d41 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/upgrade/FinalizeSubCommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/upgrade/FinalizeSubCommand.java
@@ -22,6 +22,7 @@
 import java.util.concurrent.TimeUnit;
 import org.apache.hadoop.hdds.cli.AbstractSubcommand;
 import org.apache.hadoop.hdds.cli.HddsVersionProvider;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos.FinalizationStatus;
 import org.apache.hadoop.ozone.OzoneManagerVersion;
 import org.apache.hadoop.ozone.admin.om.OmAddressOptions;
 import org.apache.hadoop.ozone.client.rpc.RpcClient;
@@ -105,7 +106,7 @@ private int waitForFinalization(OzoneManagerProtocol 
client) {
 
       if (status != null) {
         // Finalization checks before sleeping, so an already-finalized 
cluster returns without waiting.
-        if (status.getClusterFinalized()) {
+        if (status.getClusterFinalizationStatus() == 
FinalizationStatus.FINALIZED) {
           out().println("Finalization complete.");
           return 0;
         }
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/upgrade/StatusSubCommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/upgrade/StatusSubCommand.java
index fa1ef06bb58..d8627320749 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/upgrade/StatusSubCommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/upgrade/StatusSubCommand.java
@@ -75,9 +75,10 @@ public Integer call() throws Exception {
 
   /** Basic, non-verbose human-readable status. */
   static void printBasic(QueryUpgradeStatusResponse status, PrintWriter out) {
-    out.println("Upgrade status:");
-    out.println("    OM Finalized? " + status.getOmFinalized());
-    out.println("    SCM Finalized? " + 
status.getHddsStatus().getScmFinalized());
+    out.println("Upgrade finalization status:");
+    out.println("    Cluster: " + 
status.getClusterFinalizationStatus().name());
+    out.println("    OM: " + status.getOmFinalizationStatus().name());
+    out.println("    SCM: " + 
status.getHddsStatus().getScmFinalizationStatus().name());
     out.println("    Datanodes finalized: " + 
status.getHddsStatus().getNumDatanodesFinalized()
         + "/" + status.getHddsStatus().getNumDatanodesTotal());
   }
@@ -88,11 +89,12 @@ static void printBasic(QueryUpgradeStatusResponse status, 
PrintWriter out) {
    */
   static void printVerbose(QueryUpgradeStatusResponse status, PrintWriter out) 
{
     HddsProtos.UpgradeStatus hdds = status.getHddsStatus();
-    out.println("Upgrade status:");
-    out.println("    OM Finalized?            " + status.getOmFinalized());
+    out.println("Upgrade finalization status:");
+    out.println("    Cluster:                 " + 
status.getClusterFinalizationStatus().name());
+    out.println("    OM:                      " + 
status.getOmFinalizationStatus().name());
     out.println("    OM Apparent Version:     "
         + 
OzoneManagerVersion.deserialize(status.getOmApparentVersion()).toString());
-    out.println("    SCM Finalized?           " + hdds.getScmFinalized());
+    out.println("    SCM:                     " + 
hdds.getScmFinalizationStatus().name());
     out.println("    SCM Apparent Version:    " + 
HDDSVersion.deserialize(hdds.getScmApparentVersion()).toString());
     out.println("    Datanodes finalized:     " + 
hdds.getNumDatanodesFinalized() + "/" + hdds.getNumDatanodesTotal());
     out.println("    Min Datanode Apparent Version: "
@@ -109,9 +111,10 @@ protected OzoneManagerProtocol getClient() throws 
Exception {
    * JSON-friendly DTO mirroring {@link QueryUpgradeStatusResponse}.
    */
   public static final class UpgradeStatusDto {
-    private boolean omFinalized;
+    private String clusterFinalizationStatus;
+    private String omFinalizationStatus;
     private String omApparentVersion;
-    private boolean scmFinalized;
+    private String scmFinalizationStatus;
     private String scmApparentVersion;
     private int datanodesFinalized;
     private int datanodesTotal;
@@ -121,8 +124,9 @@ public static final class UpgradeStatusDto {
     public static UpgradeStatusDto from(QueryUpgradeStatusResponse status) {
       HddsProtos.UpgradeStatus hdds = status.getHddsStatus();
       UpgradeStatusDto dto = new UpgradeStatusDto();
-      dto.omFinalized = status.getOmFinalized();
-      dto.scmFinalized = hdds.getScmFinalized();
+      dto.clusterFinalizationStatus = 
status.getClusterFinalizationStatus().name();
+      dto.omFinalizationStatus = status.getOmFinalizationStatus().name();
+      dto.scmFinalizationStatus = hdds.getScmFinalizationStatus().name();
       dto.datanodesFinalized = hdds.getNumDatanodesFinalized();
       dto.datanodesTotal = hdds.getNumDatanodesTotal();
       dto.omApparentVersion = 
OzoneManagerVersion.deserialize(status.getOmApparentVersion()).toString();
@@ -132,16 +136,20 @@ public static UpgradeStatusDto 
from(QueryUpgradeStatusResponse status) {
       return dto;
     }
 
-    public boolean isOmFinalized() {
-      return omFinalized;
+    public String getClusterFinalizationStatus() {
+      return clusterFinalizationStatus;
+    }
+
+    public String getOmFinalizationStatus() {
+      return omFinalizationStatus;
     }
 
     public String getOmApparentVersion() {
       return omApparentVersion;
     }
 
-    public boolean isScmFinalized() {
-      return scmFinalized;
+    public String getScmFinalizationStatus() {
+      return scmFinalizationStatus;
     }
 
     public String getScmApparentVersion() {
diff --git 
a/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/ozone/admin/upgrade/TestFinalizeSubCommand.java
 
b/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/ozone/admin/upgrade/TestFinalizeSubCommand.java
index a836ad11ec7..d97194c3e45 100644
--- 
a/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/ozone/admin/upgrade/TestFinalizeSubCommand.java
+++ 
b/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/ozone/admin/upgrade/TestFinalizeSubCommand.java
@@ -157,7 +157,7 @@ public void testWithoutWaitFlagDoesNotPollStatus() throws 
Exception {
 
   @Test
   public void testStatusCalledOnceWhenAlreadyFinalized() throws Exception {
-    when(omClient.queryUpgradeStatus()).thenReturn(finalizedStatus(3, 3));
+    when(omClient.queryUpgradeStatus()).thenReturn(finalizedStatus());
 
     new CommandLine(cmd).parseArgs("--wait");
     assertEquals(0, cmd.call());
@@ -171,16 +171,16 @@ public void testStatusCalledOnceWhenAlreadyFinalized() 
throws Exception {
   @Test
   public void testWaitFlagPollsUntilFinalized() throws Exception {
     when(omClient.queryUpgradeStatus())
-        .thenReturn(inProgressStatus(0, 3))
-        .thenReturn(inProgressStatus(2, 3))
-        .thenReturn(finalizedStatus(3, 3));
+        .thenReturn(inProgressStatus())
+        .thenReturn(inProgressStatus())
+        .thenReturn(finalizedStatus());
 
     new CommandLine(cmd).parseArgs("--wait");
     assertEquals(0, cmd.call());
 
     String output = outContent.toString(DEFAULT_ENCODING);
     // While polling, the shared basic status output is printed on each 
in-progress poll.
-    assertTrue(output.contains("Upgrade status:"));
+    assertTrue(output.contains("Upgrade finalization status:"));
     assertTrue(output.contains("Finalization complete."));
     verify(omClient, times(3)).queryUpgradeStatus();
   }
@@ -190,7 +190,7 @@ public void testWaitFlagRetriesAfterQueryFailure() throws 
Exception {
     // A transient query failure is reported to stderr and retried on the next 
poll, not fatal.
     when(omClient.queryUpgradeStatus())
         .thenThrow(new IOException("RPC timeout"))
-        .thenReturn(finalizedStatus(3, 3));
+        .thenReturn(finalizedStatus());
 
     new CommandLine(cmd).parseArgs("--wait");
     assertEquals(0, cmd.call());
@@ -205,8 +205,9 @@ public void testWaitFlagRetriesAfterQueryFailure() throws 
Exception {
   @Test
   public void testWaitFlagInterruptIsHandledCleanly() throws Exception {
     // Make the poll interval long enough that the interrupt lands during the 
sleep (after the first poll).
+    // The test will exit well before this interval elapses.
     cmd.setPollIntervalMillis(60_000);
-    when(omClient.queryUpgradeStatus()).thenReturn(inProgressStatus(0, 3));
+    when(omClient.queryUpgradeStatus()).thenReturn(inProgressStatus());
 
     new CommandLine(cmd).parseArgs("--wait");
 
@@ -241,8 +242,8 @@ public void testWaitFlagIsResumableAfterCancel() throws 
Exception {
     cmd.setPollIntervalMillis(60_000);
     // First invocation's poll: in progress (so it sleeps); second 
invocation's poll: finalized.
     when(omClient.queryUpgradeStatus())
-        .thenReturn(inProgressStatus(0, 3))
-        .thenReturn(finalizedStatus(3, 3));
+        .thenReturn(inProgressStatus())
+        .thenReturn(finalizedStatus());
 
     new CommandLine(cmd).parseArgs("--wait");
 
@@ -292,15 +293,15 @@ public void testWaitFlagWithVerbosePrintsFullStatus() 
throws Exception {
     verbose = true;
     // Return one in-progress poll first so the verbose status is printed.
     when(omClient.queryUpgradeStatus())
-        .thenReturn(inProgressStatus(1, 2))
-        .thenReturn(finalizedStatus(2, 2));
+        .thenReturn(inProgressStatus())
+        .thenReturn(finalizedStatus());
 
     new CommandLine(cmd).parseArgs("--wait");
     assertEquals(0, cmd.call());
 
     String output = outContent.toString(DEFAULT_ENCODING);
-    assertTrue(output.contains("OM Finalized?"));
-    assertTrue(output.contains("SCM Finalized?"));
+    assertTrue(output.contains("OM:"));
+    assertTrue(output.contains("SCM:"));
     assertTrue(output.contains("OM Apparent Version:"));
     assertTrue(output.contains("SCM Apparent Version:"));
     assertTrue(output.contains("Min Datanode Apparent Version:"));
@@ -308,26 +309,34 @@ public void testWaitFlagWithVerbosePrintsFullStatus() 
throws Exception {
     assertTrue(output.contains("Finalization complete."));
   }
 
-  private static QueryUpgradeStatusResponse inProgressStatus(int dnFinalized, 
int dnTotal) {
+  /**
+   * @return An upgrade status with the whole cluster finalization status set 
to IN_PROGRESS. All other status fields
+   * are placeholders and not intended to be checked for exact values.
+   */
+  private static QueryUpgradeStatusResponse inProgressStatus() {
     return QueryUpgradeStatusResponse.newBuilder()
-        .setOmFinalized(false)
-        .setClusterFinalized(false)
+        .setOmFinalizationStatus(HddsProtos.FinalizationStatus.UNFINALIZED)
+        
.setClusterFinalizationStatus(HddsProtos.FinalizationStatus.IN_PROGRESS)
         .setHddsStatus(HddsProtos.UpgradeStatus.newBuilder()
-            .setScmFinalized(false)
-            .setNumDatanodesFinalized(dnFinalized)
-            .setNumDatanodesTotal(dnTotal)
+            
.setScmFinalizationStatus(HddsProtos.FinalizationStatus.UNFINALIZED)
+            .setNumDatanodesFinalized(1)
+            .setNumDatanodesTotal(3)
             .build())
         .build();
   }
 
-  private static QueryUpgradeStatusResponse finalizedStatus(int dnFinalized, 
int dnTotal) {
+  /**
+   * @return An upgrade status with the whole cluster finalization status set 
to FINALIZED. All other status fields
+   * are placeholders and not intended to be checked for exact values.
+   */
+  private static QueryUpgradeStatusResponse finalizedStatus() {
     return QueryUpgradeStatusResponse.newBuilder()
-        .setOmFinalized(true)
-        .setClusterFinalized(true)
+        .setOmFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
+        .setClusterFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
         .setHddsStatus(HddsProtos.UpgradeStatus.newBuilder()
-            .setScmFinalized(true)
-            .setNumDatanodesFinalized(dnFinalized)
-            .setNumDatanodesTotal(dnTotal)
+            .setScmFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
+            .setNumDatanodesFinalized(3)
+            .setNumDatanodesTotal(3)
             .build())
         .build();
   }
diff --git 
a/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/ozone/admin/upgrade/TestStatusSubCommand.java
 
b/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/ozone/admin/upgrade/TestStatusSubCommand.java
index 76ff43998e1..4f8986f89bc 100644
--- 
a/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/ozone/admin/upgrade/TestStatusSubCommand.java
+++ 
b/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/ozone/admin/upgrade/TestStatusSubCommand.java
@@ -89,17 +89,51 @@ public void tearDown() {
   }
 
   @Test
-  public void testStatusCommandPrintsUpgradeStatus() throws Exception {
+  public void testStatusCommandPrintsFinalized() throws Exception {
+    // Every component has finished finalizing and all datanodes are finalized.
     HddsProtos.UpgradeStatus hddsStatus = HddsProtos.UpgradeStatus.newBuilder()
-        .setScmFinalized(false)
+        .setScmFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
+        .setNumDatanodesFinalized(3)
+        .setNumDatanodesTotal(3)
+        .setHddsFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
+        .build();
+
+    OzoneManagerProtocolProtos.QueryUpgradeStatusResponse response =
+        OzoneManagerProtocolProtos.QueryUpgradeStatusResponse.newBuilder()
+            .setOmFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
+            
.setClusterFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
+            .setHddsStatus(hddsStatus)
+            .build();
+
+    when(omClient.queryUpgradeStatus()).thenReturn(response);
+    new CommandLine(cmd).parseArgs();
+    cmd.call();
+
+    String output = outContent.toString(DEFAULT_ENCODING);
+    assertTrue(output.contains("Upgrade finalization status"));
+    assertTrue(output.contains("Cluster: FINALIZED"));
+    assertTrue(output.contains("OM: FINALIZED"));
+    assertTrue(output.contains("SCM: FINALIZED"));
+    assertTrue(output.contains("Datanodes finalized: 3/3"));
+    // Without --verbose internal server versions are not shown.
+    assertFalse(output.toLowerCase().contains("version"));
+    verify(omClient).queryUpgradeStatus();
+  }
+
+  @Test
+  public void testStatusCommandPrintsInProgress() throws Exception {
+    // SCM is finalized and datanodes are partway through, but OM has not 
finalized yet.
+    HddsProtos.UpgradeStatus hddsStatus = HddsProtos.UpgradeStatus.newBuilder()
+        .setScmFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
         .setNumDatanodesFinalized(1)
         .setNumDatanodesTotal(3)
-        .setHddsFinalized(true)
+        .setHddsFinalizationStatus(HddsProtos.FinalizationStatus.IN_PROGRESS)
         .build();
 
     OzoneManagerProtocolProtos.QueryUpgradeStatusResponse response =
         OzoneManagerProtocolProtos.QueryUpgradeStatusResponse.newBuilder()
-            .setOmFinalized(false)
+            .setOmFinalizationStatus(HddsProtos.FinalizationStatus.IN_PROGRESS)
+            
.setClusterFinalizationStatus(HddsProtos.FinalizationStatus.IN_PROGRESS)
             .setHddsStatus(hddsStatus)
             .build();
 
@@ -108,12 +142,41 @@ public void testStatusCommandPrintsUpgradeStatus() throws 
Exception {
     cmd.call();
 
     String output = outContent.toString(DEFAULT_ENCODING);
-    assertTrue(output.contains("Upgrade status"));
-    assertTrue(output.contains("OM Finalized? false"));
-    assertTrue(output.contains("SCM Finalized? false"));
+    assertTrue(output.contains("Upgrade finalization status"));
+    assertTrue(output.contains("Cluster: IN_PROGRESS"));
+    assertTrue(output.contains("OM: IN_PROGRESS"));
+    assertTrue(output.contains("SCM: FINALIZED"));
     assertTrue(output.contains("Datanodes finalized: 1/3"));
-    // Without --verbose the apparent versions are not shown.
-    assertFalse(output.contains("Apparent Version"));
+    verify(omClient).queryUpgradeStatus();
+  }
+
+  @Test
+  public void testStatusCommandPrintsUnfinalized() throws Exception {
+    // Nothing has been finalized yet.
+    HddsProtos.UpgradeStatus hddsStatus = HddsProtos.UpgradeStatus.newBuilder()
+        .setScmFinalizationStatus(HddsProtos.FinalizationStatus.UNFINALIZED)
+        .setNumDatanodesFinalized(0)
+        .setNumDatanodesTotal(3)
+        .setHddsFinalizationStatus(HddsProtos.FinalizationStatus.UNFINALIZED)
+        .build();
+
+    OzoneManagerProtocolProtos.QueryUpgradeStatusResponse response =
+        OzoneManagerProtocolProtos.QueryUpgradeStatusResponse.newBuilder()
+            .setOmFinalizationStatus(HddsProtos.FinalizationStatus.UNFINALIZED)
+            
.setClusterFinalizationStatus(HddsProtos.FinalizationStatus.UNFINALIZED)
+            .setHddsStatus(hddsStatus)
+            .build();
+
+    when(omClient.queryUpgradeStatus()).thenReturn(response);
+    new CommandLine(cmd).parseArgs();
+    cmd.call();
+
+    String output = outContent.toString(DEFAULT_ENCODING);
+    assertTrue(output.contains("Upgrade finalization status"));
+    assertTrue(output.contains("Cluster: UNFINALIZED"));
+    assertTrue(output.contains("OM: UNFINALIZED"));
+    assertTrue(output.contains("SCM: UNFINALIZED"));
+    assertTrue(output.contains("Datanodes finalized: 0/3"));
     verify(omClient).queryUpgradeStatus();
   }
 
@@ -142,10 +205,11 @@ public void testJsonOutput() throws Exception {
     int hddsVersion = HDDSVersion.SOFTWARE_VERSION.serialize();
     OzoneManagerProtocolProtos.QueryUpgradeStatusResponse response =
         OzoneManagerProtocolProtos.QueryUpgradeStatusResponse.newBuilder()
-            .setOmFinalized(true)
+            .setOmFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
+            
.setClusterFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
             .setOmApparentVersion(omVersion)
             .setHddsStatus(HddsProtos.UpgradeStatus.newBuilder()
-                .setScmFinalized(true)
+                
.setScmFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
                 .setNumDatanodesFinalized(2)
                 .setNumDatanodesTotal(3)
                 .setScmApparentVersion(hddsVersion)
@@ -161,8 +225,9 @@ public void testJsonOutput() throws Exception {
     String jsonOutput = outContent.toString(DEFAULT_ENCODING);
 
     JsonNode root = JSON.readTree(jsonOutput);
-    assertTrue(root.path("omFinalized").asBoolean());
-    assertTrue(root.path("scmFinalized").asBoolean());
+    assertEquals("FINALIZED", root.path("clusterFinalizationStatus").asText());
+    assertEquals("FINALIZED", root.path("omFinalizationStatus").asText());
+    assertEquals("FINALIZED", root.path("scmFinalizationStatus").asText());
     assertEquals(2, root.path("datanodesFinalized").asInt());
     assertEquals(3, root.path("datanodesTotal").asInt());
     assertEquals(OzoneManagerVersion.ZDU.toString(), 
root.path("omApparentVersion").asText());
@@ -185,10 +250,11 @@ public void testVerboseTextOutputIncludesVersions() 
throws Exception {
     int hddsVersion = HDDSVersion.SOFTWARE_VERSION.serialize();
     OzoneManagerProtocolProtos.QueryUpgradeStatusResponse response =
         OzoneManagerProtocolProtos.QueryUpgradeStatusResponse.newBuilder()
-            .setOmFinalized(true)
+            .setOmFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
+            
.setClusterFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
             .setOmApparentVersion(omVersion)
             .setHddsStatus(HddsProtos.UpgradeStatus.newBuilder()
-                .setScmFinalized(true)
+                
.setScmFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
                 .setNumDatanodesFinalized(3)
                 .setNumDatanodesTotal(3)
                 .setScmApparentVersion(hddsVersion)
@@ -202,14 +268,13 @@ public void testVerboseTextOutputIncludesVersions() 
throws Exception {
     assertEquals(0, cmd.call());
 
     String output = outContent.toString(DEFAULT_ENCODING);
-    assertTrue(output.contains("OM Finalized?"));
-    assertTrue(output.contains("OM Apparent Version:"));
-    assertTrue(output.contains("SCM Finalized?"));
-    assertTrue(output.contains("SCM Apparent Version:"));
-    assertTrue(output.contains("Min Datanode Apparent Version:"));
-    assertTrue(output.contains("Max Datanode Apparent Version:"));
-    assertTrue(output.contains(OzoneManagerVersion.ZDU.toString()));
-    assertTrue(output.contains(HDDSVersion.SOFTWARE_VERSION.toString()));
+    assertTrue(output.contains("OM:"));
+    assertTrue(output.contains("SCM:"));
+    // Each apparent version label should be followed by the version number 
set on the response.
+    assertTrue(output.contains("OM Apparent Version:     " + 
OzoneManagerVersion.ZDU));
+    assertTrue(output.contains("SCM Apparent Version:    " + 
HDDSVersion.SOFTWARE_VERSION));
+    assertTrue(output.contains("Min Datanode Apparent Version: " + 
HDDSVersion.SOFTWARE_VERSION));
+    assertTrue(output.contains("Max Datanode Apparent Version: " + 
HDDSVersion.SOFTWARE_VERSION));
   }
 
   private ServiceInfoEx serviceInfoWithVersion(OzoneManagerVersion version) {
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/HddsUpgradeTestUtils.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/HddsUpgradeTestUtils.java
index 04defd99774..7fcc4cd53a5 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/HddsUpgradeTestUtils.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/HddsUpgradeTestUtils.java
@@ -51,7 +51,7 @@ public static void 
waitForFinalizationFromClient(StorageContainerLocationProtoco
     LambdaTestUtils.await(60_000, 1_000, () -> {
       HddsProtos.UpgradeStatus status = scmClient.queryUpgradeStatus();
       LOG.info("Waiting for upgrade finalization to complete from client. 
Current status is:\n{}", status);
-      return status.getHddsFinalized();
+      return status.getHddsFinalizationStatus() == 
HddsProtos.FinalizationStatus.FINALIZED;
     });
   }
 
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/OMUpgradeTestUtils.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/OMUpgradeTestUtils.java
index 675bfdcac67..e3239283064 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/OMUpgradeTestUtils.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/OMUpgradeTestUtils.java
@@ -45,12 +45,10 @@ public static void waitForFinalization(OzoneManagerProtocol 
omClient)
       try {
         QueryUpgradeStatusResponse status = omClient.queryUpgradeStatus();
         HddsProtos.UpgradeStatus hdds = status.getHddsStatus();
-        LOG.info("Finalization status: omFinalized={}, scmFinalized={}, 
datanodes={}/{}",
-            status.getOmFinalized(), hdds.getScmFinalized(),
+        LOG.info("Finalization status: om={}, scm={}, datanodes={}/{}",
+            status.getOmFinalizationStatus(), hdds.getScmFinalizationStatus(),
             hdds.getNumDatanodesFinalized(), hdds.getNumDatanodesTotal());
-        return status.getOmFinalized()
-            && hdds.getScmFinalized()
-            && hdds.getNumDatanodesFinalized() == hdds.getNumDatanodesTotal();
+        return status.getClusterFinalizationStatus() == 
HddsProtos.FinalizationStatus.FINALIZED;
       } catch (IOException e) {
         fail(e.getMessage());
       }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMUpgradeFinalization.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMUpgradeFinalization.java
index 0fdae677c61..e4765dd65f4 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMUpgradeFinalization.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMUpgradeFinalization.java
@@ -18,6 +18,7 @@
 package org.apache.hadoop.ozone.om;
 
 import static org.apache.hadoop.ozone.OzoneConsts.APPARENT_VERSION_KEY;
+import static org.apache.hadoop.ozone.OzoneConsts.FINALIZATION_IN_PROGRESS_KEY;
 import static 
org.apache.hadoop.ozone.om.TestOzoneManagerHAWithStoppedNodes.createKey;
 import static 
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.INITIAL_VERSION;
 import static org.apache.ozone.test.GenericTestUtils.waitFor;
@@ -31,6 +32,7 @@
 import java.util.concurrent.TimeUnit;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.conf.StorageUnit;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.ozone.MiniOzoneCluster;
 import org.apache.hadoop.ozone.MiniOzoneHAClusterImpl;
 import org.apache.hadoop.ozone.OzoneManagerVersion;
@@ -163,6 +165,45 @@ void testFinalizationFromSnapshot() throws Exception {
     }
   }
 
+  /**
+   * OM's reported finalization status should move UNFINALIZED -> IN_PROGRESS 
(once the in-progress
+   * marker is present) -> FINALIZED.
+   */
+  @Test
+  void testOmFinalizationStatusTransitions() throws Exception {
+    OzoneConfiguration conf = new OzoneConfiguration();
+    conf.set(OMConfigKeys.OZONE_OM_UPGRADE_FINALIZATION_CHECK_INTERVAL, 
"10ms");
+    conf.setInt(OMStorage.TESTING_INIT_APPARENT_VERSION_KEY, 
INITIAL_VERSION.serialize());
+
+    try (MiniOzoneCluster cluster = MiniOzoneCluster.newBuilder(conf)
+        .setNumDatanodes(1)
+        .build()) {
+      cluster.waitForClusterToBeReady();
+      OzoneManager om = cluster.getOzoneManager();
+
+      try (OzoneClient client = cluster.newClient()) {
+        OzoneManagerProtocol omClient = 
client.getObjectStore().getClientProxy().getOzoneManagerClient();
+
+        // Before finalization: no in-progress marker, OM reports UNFINALIZED.
+        
assertNull(om.getMetadataManager().getMetaTable().get(FINALIZATION_IN_PROGRESS_KEY));
+        assertEquals(HddsProtos.FinalizationStatus.UNFINALIZED,
+            omClient.queryUpgradeStatus().getOmFinalizationStatus());
+
+        // With the in-progress marker present but the OM not yet finalized, 
OM reports IN_PROGRESS.
+        
om.getMetadataManager().getMetaTable().put(FINALIZATION_IN_PROGRESS_KEY, 
"ignored");
+        assertEquals(HddsProtos.FinalizationStatus.IN_PROGRESS,
+            omClient.queryUpgradeStatus().getOmFinalizationStatus());
+        
om.getMetadataManager().getMetaTable().delete(FINALIZATION_IN_PROGRESS_KEY);
+
+        // After finalization completes, OM reports FINALIZED.
+        omClient.finalizeUpgrade();
+        OMUpgradeTestUtils.waitForFinalization(omClient);
+        assertEquals(HddsProtos.FinalizationStatus.FINALIZED,
+            omClient.queryUpgradeStatus().getOmFinalizationStatus());
+      }
+    }
+  }
+
   private static MiniOzoneHAClusterImpl newCluster(OzoneConfiguration conf)
       throws IOException {
     conf.setInt(OMStorage.TESTING_INIT_APPARENT_VERSION_KEY, 
INITIAL_VERSION.serialize());
diff --git 
a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto 
b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
index 121a3514bbb..f243e8e9d0a 100644
--- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
+++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
@@ -1668,10 +1668,10 @@ message QueryUpgradeStatusRequest {
 }
 
 message QueryUpgradeStatusResponse {
-    // True when OM, SCM and all healthy datanodes are finalized
-    optional bool clusterFinalized = 1;
+    // Aggregate status of OM, SCM and all healthy datanodes
+    optional hadoop.hdds.FinalizationStatus clusterFinalizationStatus = 1;
     optional hadoop.hdds.UpgradeStatus hddsStatus = 2;
-    optional bool omFinalized = 3;
+    optional hadoop.hdds.FinalizationStatus omFinalizationStatus = 3;
     optional uint32 omApparentVersion = 4;
 }
 
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 815acb5a638..1ce57e7c0df 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
@@ -3682,15 +3682,32 @@ public QueryUpgradeStatusResponse queryUpgradeStatus() 
throws IOException {
       throw e;
     }
 
-    boolean omFinalized = !versionManager.needsFinalization();
-    boolean hddsFinalized = scmStatus.getHddsFinalized();
-    boolean clusterFinalized = omFinalized && hddsFinalized;
+    HddsProtos.FinalizationStatus omFinalizationStatus;
+    if (!versionManager.needsFinalization()) {
+      omFinalizationStatus = HddsProtos.FinalizationStatus.FINALIZED;
+    } else if 
(metadataManager.getMetaTable().get(FINALIZATION_IN_PROGRESS_KEY) != null) {
+      omFinalizationStatus = HddsProtos.FinalizationStatus.IN_PROGRESS;
+    } else {
+      omFinalizationStatus = HddsProtos.FinalizationStatus.UNFINALIZED;
+    }
+    HddsProtos.FinalizationStatus hddsFinalizationStatus = 
scmStatus.getHddsFinalizationStatus();
+
+    HddsProtos.FinalizationStatus clusterFinalizationStatus;
+    if (omFinalizationStatus == HddsProtos.FinalizationStatus.FINALIZED
+        && hddsFinalizationStatus == HddsProtos.FinalizationStatus.FINALIZED) {
+      clusterFinalizationStatus = HddsProtos.FinalizationStatus.FINALIZED;
+    } else if (omFinalizationStatus == 
HddsProtos.FinalizationStatus.UNFINALIZED
+        && hddsFinalizationStatus == 
HddsProtos.FinalizationStatus.UNFINALIZED) {
+      clusterFinalizationStatus = HddsProtos.FinalizationStatus.UNFINALIZED;
+    } else {
+      clusterFinalizationStatus = HddsProtos.FinalizationStatus.IN_PROGRESS;
+    }
 
     return QueryUpgradeStatusResponse.newBuilder()
-        .setOmFinalized(omFinalized)
+        .setOmFinalizationStatus(omFinalizationStatus)
         .setHddsStatus(scmStatus)
         .setOmApparentVersion(versionManager.getApparentVersion().serialize())
-        .setClusterFinalized(clusterFinalized)
+        .setClusterFinalizationStatus(clusterFinalizationStatus)
         .build();
   }
 
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMUpgradeFinalizeService.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMUpgradeFinalizeService.java
index 00cc567bf3d..f45f963a45e 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMUpgradeFinalizeService.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMUpgradeFinalizeService.java
@@ -117,7 +117,7 @@ public BackgroundTaskResult call() {
           }
 
           HddsProtos.UpgradeStatus upgradeStatus = 
scmClient.getContainerClient().queryUpgradeStatus();
-          if (upgradeStatus.getHddsFinalized()) {
+          if (upgradeStatus.getHddsFinalizationStatus() == 
HddsProtos.FinalizationStatus.FINALIZED) {
             LOG.info("The SCM Upgrade has been finalized. OM will now 
finalize. Run count {}", run);
 
             OzoneManagerProtocolProtos.OMRequest omRequest = 
OzoneManagerProtocolProtos.OMRequest.newBuilder()
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMUpgradeFinalizeService.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMUpgradeFinalizeService.java
index ef0f6ef6eb8..e5c7d714529 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMUpgradeFinalizeService.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMUpgradeFinalizeService.java
@@ -45,6 +45,8 @@
 import org.apache.ratis.protocol.ClientId;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
 
 /**
  * Unit tests for {@link OMUpgradeFinalizeService}.
@@ -125,7 +127,7 @@ void testNoTasksSubmittedWhenFinalizationNotNeeded() throws 
Exception {
 
   /**
    * When the OM is the leader, finalization is needed, the finalization 
command is given and SCM reports
-   * hddsFinalized=true, a FinalizeUpgrade request should be submitted via 
Ratis.
+   * hddsFinalizationStatus=FINALIZED, a FinalizeUpgrade request should be 
submitted via Ratis.
    */
   @Test
   void testFinalizationTriggeredWhenScmIsFinalizedAndFinalizationInProgress() 
throws Exception {
@@ -133,8 +135,8 @@ void 
testFinalizationTriggeredWhenScmIsFinalizedAndFinalizationInProgress() thro
     when(versionManager.needsFinalization()).thenReturn(true);
 
     HddsProtos.UpgradeStatus scmStatus = HddsProtos.UpgradeStatus.newBuilder()
-        .setScmFinalized(true)
-        .setHddsFinalized(true)
+        .setScmFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
+        .setHddsFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
         .setNumDatanodesFinalized(3)
         .setNumDatanodesTotal(3)
         .build();
@@ -156,17 +158,18 @@ void 
testFinalizationTriggeredWhenScmIsFinalizedAndFinalizationInProgress() thro
   }
 
   /**
-   * When SCM reports hddsFinalized=false (SCM is not yet finalized),
-   * no Ratis request should be submitted.
+   * When SCM reports an hddsFinalizationStatus other than FINALIZED (HDDS is 
unfinalized or still
+   * in progress), no Ratis request should be submitted.
    */
-  @Test
-  void testFinalizationSkippedWhenScmNotYetFinalized() throws Exception {
+  @ParameterizedTest
+  @EnumSource(value = HddsProtos.FinalizationStatus.class, names = 
{"UNFINALIZED", "IN_PROGRESS"})
+  void 
testFinalizationSkippedWhenScmNotYetFinalized(HddsProtos.FinalizationStatus 
hddsStatus) throws Exception {
     when(ozoneManager.isLeaderReady()).thenReturn(true);
     when(versionManager.needsFinalization()).thenReturn(true);
 
     HddsProtos.UpgradeStatus scmStatus = HddsProtos.UpgradeStatus.newBuilder()
-        .setScmFinalized(false)
-        .setHddsFinalized(false)
+        .setScmFinalizationStatus(hddsStatus)
+        .setHddsFinalizationStatus(hddsStatus)
         .setNumDatanodesFinalized(0)
         .setNumDatanodesTotal(3)
         .build();
@@ -247,8 +250,8 @@ void testExceptionFromRatisSubmitIsHandledGracefully() 
throws Exception {
     when(versionManager.needsFinalization()).thenReturn(true);
 
     HddsProtos.UpgradeStatus scmStatus = HddsProtos.UpgradeStatus.newBuilder()
-        .setScmFinalized(true)
-        .setHddsFinalized(true)
+        .setScmFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
+        .setHddsFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
         .setNumDatanodesFinalized(3)
         .setNumDatanodesTotal(3)
         .build();
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/protocolPB/TestOzoneManagerRequestHandler.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/protocolPB/TestOzoneManagerRequestHandler.java
index 764a8286648..0601713b795 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/protocolPB/TestOzoneManagerRequestHandler.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/protocolPB/TestOzoneManagerRequestHandler.java
@@ -474,15 +474,16 @@ public void testQueryUpgradeStatusDispatch() throws 
IOException {
     OzoneManagerRequestHandler handler = getRequestHandler(10);
     OzoneManager ozoneManager = handler.getOzoneManager();
 
+    // Test verifies that the same upgrade status is passed through the 
response regardless of its values.
     HddsProtos.UpgradeStatus hddsStatus = HddsProtos.UpgradeStatus.newBuilder()
-        .setScmFinalized(true)
-        .setHddsFinalized(false)
+        .setScmFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
+        .setHddsFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
         .setNumDatanodesFinalized(3)
         .setNumDatanodesTotal(3)
         .build();
     OzoneManagerProtocolProtos.QueryUpgradeStatusResponse expected =
         OzoneManagerProtocolProtos.QueryUpgradeStatusResponse.newBuilder()
-            .setOmFinalized(true)
+            .setOmFinalizationStatus(HddsProtos.FinalizationStatus.FINALIZED)
             .setHddsStatus(hddsStatus)
             .build();
     Mockito.when(ozoneManager.queryUpgradeStatus()).thenReturn(expected);


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

Reply via email to