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

avijayan pushed a commit to branch HDDS-3698-upgrade
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/HDDS-3698-upgrade by this push:
     new 6519142  HDDS-4178. SCM Finalize client command implementation (#1651)
6519142 is described below

commit 6519142ca92c04989f107f4eb75fb129d3050102
Author: prashantpogde <[email protected]>
AuthorDate: Mon Dec 14 14:52:07 2020 -0800

    HDDS-4178. SCM Finalize client command implementation (#1651)
---
 .../apache/hadoop/hdds/scm/client/ScmClient.java   |   6 +
 .../protocol/StorageContainerLocationProtocol.java |   7 +
 .../ozone/upgrade/BasicUpgradeFinalizer.java       |   4 +-
 ...inerLocationProtocolClientSideTranslatorPB.java |  47 +++++++
 .../src/main/proto/ScmAdminProtocol.proto          |  22 +++
 .../interface-client/src/main/proto/hdds.proto     |  13 ++
 ...inerLocationProtocolServerSideTranslatorPB.java |  65 +++++++++
 .../hdds/scm/server/SCMClientProtocolServer.java   |  14 ++
 .../hdds/scm/server/StorageContainerManager.java   |  18 ++-
 .../scm/server/upgrade/SCMUpgradeFinalizer.java    |   5 +
 .../hdds/scm/cli/ContainerOperationClient.java     |  13 ++
 .../hdds/scm/cli/upgrade/AllScmCommands.java       |  59 ++++++++
 .../cli/upgrade/FinalizeScmUpgradeSubcommand.java  | 152 +++++++++++++++++++++
 .../cli/upgrade/FinalizeUpgradeCommandUtil.java    |  92 +++++++++++++
 .../hadoop/hdds/scm/cli/upgrade/package-info.java  |  22 +++
 ...OzoneManagerProtocolClientSideTranslatorPB.java |   3 +-
 .../src/main/proto/OmClientProtocol.proto          |  17 +--
 .../request/upgrade/OMFinalizeUpgradeRequest.java  |   3 +-
 .../protocolPB/OzoneManagerRequestHandler.java     |   2 +-
 .../ozone/admin/om/FinalizeUpgradeSubCommand.java  |  77 ++---------
 20 files changed, 557 insertions(+), 84 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java
index e4369fa..84831c1 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java
@@ -25,6 +25,7 @@ import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
 import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos
     .ContainerDataProto;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer.StatusAndMessages;
 
 import java.io.Closeable;
 import java.io.IOException;
@@ -246,5 +247,10 @@ public interface ScmClient extends Closeable {
    */
   boolean getReplicationManagerStatus() throws IOException;
 
+  StatusAndMessages finalizeScmUpgrade(String upgradeClientID)
+      throws IOException;
 
+  StatusAndMessages queryUpgradeFinalizationProgress(String upgradeClientID,
+                                                     boolean force)
+      throws IOException;
 }
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java
index 1d58c97..94ef442 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java
@@ -30,6 +30,7 @@ import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer.StatusAndMessages;
 import org.apache.hadoop.security.KerberosInfo;
 
 /**
@@ -230,4 +231,10 @@ public interface StorageContainerLocationProtocol extends 
Closeable {
    */
   boolean getReplicationManagerStatus() throws IOException;
 
+  StatusAndMessages finalizeScmUpgrade(String upgradeClientID)
+      throws IOException;
+
+  StatusAndMessages queryUpgradeFinalizationProgress(String upgradeClientID,
+                                                     boolean force)
+      throws IOException;
 }
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/BasicUpgradeFinalizer.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/BasicUpgradeFinalizer.java
index 3099cef..552da54 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/BasicUpgradeFinalizer.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/BasicUpgradeFinalizer.java
@@ -218,10 +218,8 @@ public class BasicUpgradeFinalizer<T, V extends 
AbstractLayoutVersionManager>
 
   protected void emitNOOPMsg(String feature) {
     String msg = "No finalization work defined for feature: " + feature + ".";
-    String msg2 = "Skipping.";
 
     logAndEmit(msg);
-    logAndEmit(msg2);
   }
 
   protected void emitStartingMsg() {
@@ -265,7 +263,7 @@ public class BasicUpgradeFinalizer<T, V extends 
AbstractLayoutVersionManager>
     logAndEmit(msg);
   }
 
-  private void logAndEmit(String msg) {
+  protected void logAndEmit(String msg) {
     LOG.info(msg);
     msgs.offer(msg);
   }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
index 0733940..318b424 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
@@ -28,7 +28,12 @@ import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hadoop.hdds.annotation.InterfaceAudience;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.GetScmInfoResponseProto;
+import 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.UpgradeFinalizationStatus;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos;
+import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.FinalizeScmUpgradeRequestProto;
+import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.FinalizeScmUpgradeResponseProto;
+import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.QueryUpgradeFinalizationProgressRequestProto;
+import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.QueryUpgradeFinalizationProgressResponseProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.SafeModeRuleStatusProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.GetSafeModeRuleStatusesResponseProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.GetSafeModeRuleStatusesRequestProto;
@@ -72,6 +77,8 @@ import org.apache.hadoop.hdds.tracing.TracingUtil;
 import org.apache.hadoop.ipc.ProtobufHelper;
 import org.apache.hadoop.ipc.ProtocolTranslator;
 import org.apache.hadoop.ipc.RPC;
+import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer;
+import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer.StatusAndMessages;
 
 import com.google.common.base.Preconditions;
 import com.google.protobuf.RpcController;
@@ -535,6 +542,46 @@ public final class 
StorageContainerLocationProtocolClientSideTranslatorPB
   }
 
   @Override
+  public StatusAndMessages finalizeScmUpgrade(String upgradeClientID)
+      throws IOException {
+    FinalizeScmUpgradeRequestProto req = FinalizeScmUpgradeRequestProto.
+        newBuilder()
+        .setUpgradeClientId(upgradeClientID)
+        .build();
+
+    FinalizeScmUpgradeResponseProto response =
+        submitRequest(Type.FinalizeScmUpgrade,
+            builder -> builder.setFinalizeScmUpgradeRequest(req))
+            .getFinalizeScmUpgradeResponse();
+
+    UpgradeFinalizationStatus status = response.getStatus();
+    return new StatusAndMessages(
+        UpgradeFinalizer.Status.valueOf(status.getStatus().name()),
+        status.getMessagesList());
+  }
+
+  @Override
+  public StatusAndMessages queryUpgradeFinalizationProgress(
+      String upgradeClientID, boolean force) throws IOException {
+    QueryUpgradeFinalizationProgressRequestProto req =
+        QueryUpgradeFinalizationProgressRequestProto.
+            newBuilder()
+            .setUpgradeClientId(upgradeClientID)
+            .setTakeover(force)
+            .build();
+
+    QueryUpgradeFinalizationProgressResponseProto response =
+        submitRequest(Type.QueryUpgradeFinalizationProgress,
+            builder -> builder.setQueryUpgradeFinalizationProgressRequest(req))
+            .getQueryUpgradeFinalizationProgressResponse();
+
+    UpgradeFinalizationStatus status = response.getStatus();
+    return new StatusAndMessages(
+        UpgradeFinalizer.Status.valueOf(status.getStatus().name()),
+        status.getMessagesList());
+  }
+
+  @Override
   public Object getUnderlyingProxyObject() {
     return rpcProxy;
   }
diff --git a/hadoop-hdds/interface-admin/src/main/proto/ScmAdminProtocol.proto 
b/hadoop-hdds/interface-admin/src/main/proto/ScmAdminProtocol.proto
index 91dbebe..886b43c 100644
--- a/hadoop-hdds/interface-admin/src/main/proto/ScmAdminProtocol.proto
+++ b/hadoop-hdds/interface-admin/src/main/proto/ScmAdminProtocol.proto
@@ -62,6 +62,9 @@ message ScmContainerLocationRequest {
   optional GetPipelineRequestProto getPipelineRequest = 24;
   optional GetContainerWithPipelineBatchRequestProto 
getContainerWithPipelineBatchRequest = 25;
   optional GetSafeModeRuleStatusesRequestProto getSafeModeRuleStatusesRequest 
= 26;
+  optional FinalizeScmUpgradeRequestProto finalizeScmUpgradeRequest = 27;
+  optional QueryUpgradeFinalizationProgressRequestProto
+  queryUpgradeFinalizationProgressRequest = 28;
 }
 
 message ScmContainerLocationResponse {
@@ -96,6 +99,9 @@ message ScmContainerLocationResponse {
   optional GetPipelineResponseProto getPipelineResponse = 24;
   optional GetContainerWithPipelineBatchResponseProto 
getContainerWithPipelineBatchResponse = 25;
   optional GetSafeModeRuleStatusesResponseProto 
getSafeModeRuleStatusesResponse = 26;
+  optional FinalizeScmUpgradeResponseProto finalizeScmUpgradeResponse = 27;
+  optional QueryUpgradeFinalizationProgressResponseProto
+  queryUpgradeFinalizationProgressResponse = 28;
   enum Status {
     OK = 1;
     CONTAINER_ALREADY_EXISTS = 2;
@@ -126,6 +132,8 @@ enum Type {
   GetPipeline = 19;
   GetContainerWithPipelineBatch = 20;
   GetSafeModeRuleStatuses = 21;
+  FinalizeScmUpgrade = 22;
+  QueryUpgradeFinalizationProgress = 23;
 }
 
 /**
@@ -343,6 +351,20 @@ message ReplicationManagerStatusResponseProto {
   required bool isRunning = 1;
 }
 
+message FinalizeScmUpgradeRequestProto {
+  required string upgradeClientId = 1;
+}
+message FinalizeScmUpgradeResponseProto {
+  required hadoop.hdds.UpgradeFinalizationStatus status = 1;
+}
+message QueryUpgradeFinalizationProgressRequestProto {
+  required string upgradeClientId = 1;
+  optional bool takeover = 2;
+}
+message QueryUpgradeFinalizationProgressResponseProto {
+  required hadoop.hdds.UpgradeFinalizationStatus status = 1;
+}
+
 /**
  * Protocol used from an HDFS node to StorageContainerManager.  See the request
  * and response messages for details of the RPC calls.
diff --git a/hadoop-hdds/interface-client/src/main/proto/hdds.proto 
b/hadoop-hdds/interface-client/src/main/proto/hdds.proto
index d8306fa..3517731 100644
--- a/hadoop-hdds/interface-client/src/main/proto/hdds.proto
+++ b/hadoop-hdds/interface-client/src/main/proto/hdds.proto
@@ -277,3 +277,16 @@ message BlockID {
     required ContainerBlockID containerBlockID = 1;
     optional uint64 blockCommitSequenceId = 2 [default = 0];
 }
+
+message UpgradeFinalizationStatus {
+    enum Status {
+        ALREADY_FINALIZED = 1;
+        STARTING_FINALIZATION = 2;
+        FINALIZATION_IN_PROGRESS = 3;
+        FINALIZATION_DONE = 4;
+        FINALIZATION_REQUIRED = 5;
+    }
+    required Status status = 1;
+    repeated string messages = 2;
+}
+
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
index d5496b4..9285555 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
@@ -25,6 +25,7 @@ import java.util.Map;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hadoop.hdds.annotation.InterfaceAudience;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.UpgradeFinalizationStatus;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ActivatePipelineRequestProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ActivatePipelineResponseProto;
@@ -34,6 +35,8 @@ import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolPro
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerResponseProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.DeactivatePipelineRequestProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.DeactivatePipelineResponseProto;
+import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.FinalizeScmUpgradeRequestProto;
+import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.FinalizeScmUpgradeResponseProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ForceExitSafeModeRequestProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ForceExitSafeModeResponseProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.GetContainerRequestProto;
@@ -50,6 +53,8 @@ import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolPro
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ListPipelineResponseProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.NodeQueryResponseProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.PipelineResponseProto;
+import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.QueryUpgradeFinalizationProgressRequestProto;
+import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.QueryUpgradeFinalizationProgressResponseProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ReplicationManagerStatusRequestProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ReplicationManagerStatusResponseProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.SCMCloseContainerRequestProto;
@@ -81,6 +86,8 @@ import com.google.protobuf.RpcController;
 import com.google.protobuf.ServiceException;
 import static 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.PipelineResponseProto.Error.errorPipelineAlreadyExists;
 import static 
org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.PipelineResponseProto.Error.success;
+
+import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer.StatusAndMessages;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -90,6 +97,7 @@ import org.slf4j.LoggerFactory;
  * {@link StorageContainerLocationProtocol} server implementation.
  */
 @InterfaceAudience.Private
+@SuppressWarnings({"method"})
 public final class StorageContainerLocationProtocolServerSideTranslatorPB
     implements StorageContainerLocationProtocolPB {
 
@@ -128,6 +136,7 @@ public final class 
StorageContainerLocationProtocolServerSideTranslatorPB
             request.getTraceID());
   }
 
+  @SuppressWarnings("methodlength")
   public ScmContainerLocationResponse processRequest(
       ScmContainerLocationRequest request) throws ServiceException {
     try {
@@ -270,6 +279,21 @@ public final class 
StorageContainerLocationProtocolServerSideTranslatorPB
             .setGetSafeModeRuleStatusesResponse(getSafeModeRuleStatues(
                 request.getGetSafeModeRuleStatusesRequest()))
             .build();
+      case FinalizeScmUpgrade:
+        return ScmContainerLocationResponse.newBuilder()
+            .setCmdType(request.getCmdType())
+            .setStatus(Status.OK)
+            .setFinalizeScmUpgradeResponse(getFinalizeScmUpgrade(
+                request.getFinalizeScmUpgradeRequest()))
+            .build();
+      case QueryUpgradeFinalizationProgress:
+        return ScmContainerLocationResponse.newBuilder()
+            .setCmdType(request.getCmdType())
+            .setStatus(Status.OK)
+            .setQueryUpgradeFinalizationProgressResponse(
+                getQueryUpgradeFinalizationProgress(
+                request.getQueryUpgradeFinalizationProgressRequest()))
+            .build();
       default:
         throw new IllegalArgumentException(
             "Unknown command type: " + request.getCmdType());
@@ -467,6 +491,47 @@ public final class 
StorageContainerLocationProtocolServerSideTranslatorPB
         .addAllSafeModeRuleStatusesProto(proto).build();
   }
 
+  public FinalizeScmUpgradeResponseProto getFinalizeScmUpgrade(
+      FinalizeScmUpgradeRequestProto request) throws IOException {
+    StatusAndMessages progress =
+        impl.finalizeScmUpgrade(request.getUpgradeClientId());
+
+    UpgradeFinalizationStatus.Status protoStatus =
+        UpgradeFinalizationStatus.Status.valueOf(progress.status().name());
+
+    UpgradeFinalizationStatus response =
+        UpgradeFinalizationStatus.newBuilder()
+            .setStatus(protoStatus)
+            .addAllMessages(progress.msgs())
+            .build();
+
+    return FinalizeScmUpgradeResponseProto.newBuilder()
+        .setStatus(response)
+        .build();
+  }
+
+  public QueryUpgradeFinalizationProgressResponseProto
+      getQueryUpgradeFinalizationProgress(
+          QueryUpgradeFinalizationProgressRequestProto request)
+      throws IOException {
+    StatusAndMessages progress =
+        impl.queryUpgradeFinalizationProgress(request.getUpgradeClientId(),
+            request.getTakeover());
+
+    UpgradeFinalizationStatus.Status protoStatus =
+        UpgradeFinalizationStatus.Status.valueOf(progress.status().name());
+
+    UpgradeFinalizationStatus response =
+        UpgradeFinalizationStatus.newBuilder()
+            .setStatus(protoStatus)
+            .addAllMessages(progress.msgs())
+            .build();
+
+    return QueryUpgradeFinalizationProgressResponseProto.newBuilder()
+        .setStatus(response)
+        .build();
+  }
+
   public ForceExitSafeModeResponseProto forceExitSafeMode(
       ForceExitSafeModeRequestProto request)
       throws IOException {
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 df5c147..49a4233 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
@@ -83,6 +83,8 @@ import static 
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_HANDLER_COUNT_K
 import static 
org.apache.hadoop.hdds.scm.server.StorageContainerManager.startRpcServer;
 import static org.apache.hadoop.hdds.server.ServerUtils.getRemoteUserName;
 import static org.apache.hadoop.hdds.server.ServerUtils.updateRPCListenAddress;
+
+import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer.StatusAndMessages;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -560,6 +562,18 @@ public class SCMClientProtocolServer implements
     return scm.getReplicationManager().isRunning();
   }
 
+  @Override
+  public StatusAndMessages finalizeScmUpgrade(String upgradeClientID) throws
+      IOException {
+    return scm.finalizeUpgrade(upgradeClientID);
+  }
+
+  @Override
+  public StatusAndMessages queryUpgradeFinalizationProgress(
+      String upgradeClientID, boolean force) throws  IOException {
+    return scm.queryUpgradeFinalizationProgress(upgradeClientID, force);
+  }
+
   /**
    * Queries a list of Node that match a set of statuses.
    *
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
index c0b4689..48d5cdc 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
@@ -90,6 +90,7 @@ import 
org.apache.hadoop.hdds.scm.pipeline.PipelineReportHandler;
 import org.apache.hadoop.hdds.scm.pipeline.SCMPipelineManager;
 import 
org.apache.hadoop.hdds.scm.pipeline.choose.algorithms.PipelineChoosePolicyFactory;
 import org.apache.hadoop.hdds.scm.safemode.SCMSafeModeManager;
+import org.apache.hadoop.hdds.scm.server.upgrade.SCMUpgradeFinalizer;
 import org.apache.hadoop.hdds.security.exception.SCMSecurityException;
 import org.apache.hadoop.hdds.security.x509.SecurityConfig;
 import 
org.apache.hadoop.hdds.security.x509.certificate.authority.CertificateServer;
@@ -111,6 +112,8 @@ import org.apache.hadoop.ozone.OzoneSecurityUtil;
 import org.apache.hadoop.ozone.common.Storage.StorageState;
 import org.apache.hadoop.ozone.lease.LeaseManager;
 import org.apache.hadoop.ozone.lock.LockManager;
+import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer;
+import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer.StatusAndMessages;
 import org.apache.hadoop.security.SecurityUtil;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;
@@ -211,6 +214,7 @@ public final class StorageContainerManager extends 
ServiceRuntimeInfoImpl
   private PipelineChoosePolicy pipelineChoosePolicy;
 
   private HDDSLayoutVersionManager scmLayoutVersionManager;
+  private UpgradeFinalizer<StorageContainerManager> upgradeFinalizer;
 
   /**
    * Creates a new StorageContainerManager. Configuration will be
@@ -246,7 +250,6 @@ public final class StorageContainerManager extends 
ServiceRuntimeInfoImpl
     configuration = conf;
     initMetrics();
     containerReportCache = buildContainerReportCache();
-
     /**
      * It is assumed the scm --init command creates the SCM Storage Config.
      */
@@ -262,6 +265,8 @@ public final class StorageContainerManager extends 
ServiceRuntimeInfoImpl
     scmLayoutVersionManager =
         HDDSLayoutVersionManager.initialize(scmStorageConfig);
 
+    upgradeFinalizer = new SCMUpgradeFinalizer(scmLayoutVersionManager);
+
     /**
      * Important : This initialization sequence is assumed by some of our 
tests.
      * The testSecureOzoneCluster assumes that security checks have to be
@@ -1265,4 +1270,15 @@ public final class StorageContainerManager extends 
ServiceRuntimeInfoImpl
      */
     pipelineManager.resumePipelineCreation();
   }
+
+  public StatusAndMessages finalizeUpgrade(String upgradeClientID)
+      throws IOException{
+    return upgradeFinalizer.finalize(upgradeClientID, this);
+  }
+
+  public StatusAndMessages queryUpgradeFinalizationProgress(
+      String upgradeClientID, boolean takeover
+  ) throws IOException {
+    return upgradeFinalizer.reportStatus(upgradeClientID, takeover);
+  }
 }
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 bf91ccd..ccc6030 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
@@ -75,7 +75,12 @@ public class SCMUpgradeFinalizer extends
          * all existing pipelines are closed and pipeline Manger would freeze
          * all new pipeline creation.
          */
+        String msg = "  Existing pipelines and containers will be closed " +
+            "during Upgrade.";
+        msg += "\n  New pipelines creation will remain frozen until Upgrade " +
+            "is finalized.";
         storageContainerManager.preFinalizeUpgrade();
+        logAndEmit(msg);
 
         for (HDDSLayoutFeature f : versionManager.unfinalizedFeatures()) {
           finalizeFeature(f, storageContainerManager.getScmStorageConfig());
diff --git 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
index 96cd530..4560548 100644
--- 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
+++ 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
@@ -51,6 +51,7 @@ import org.apache.hadoop.ipc.ProtobufRpcEngine;
 import org.apache.hadoop.ipc.RPC;
 import org.apache.hadoop.net.NetUtils;
 import org.apache.hadoop.ozone.OzoneSecurityUtil;
+import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer.StatusAndMessages;
 import org.apache.hadoop.security.UserGroupInformation;
 
 import com.google.common.base.Preconditions;
@@ -508,4 +509,16 @@ public class ContainerOperationClient implements ScmClient 
{
     return storageContainerLocationClient.getReplicationManagerStatus();
   }
 
+  @Override
+  public StatusAndMessages finalizeScmUpgrade(String upgradeClientID)
+      throws IOException {
+    return storageContainerLocationClient.finalizeScmUpgrade(upgradeClientID);
+  }
+
+  @Override
+  public StatusAndMessages queryUpgradeFinalizationProgress(
+      String upgradeClientID, boolean force) throws IOException {
+    return storageContainerLocationClient.queryUpgradeFinalizationProgress(
+        upgradeClientID, force);
+  }
 }
diff --git 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/upgrade/AllScmCommands.java
 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/upgrade/AllScmCommands.java
new file mode 100644
index 0000000..300c599
--- /dev/null
+++ 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/upgrade/AllScmCommands.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hdds.scm.cli.upgrade;
+
+import java.util.concurrent.Callable;
+
+import org.apache.hadoop.hdds.cli.GenericCli;
+import org.apache.hadoop.hdds.cli.HddsVersionProvider;
+import org.apache.hadoop.hdds.cli.OzoneAdmin;
+import org.apache.hadoop.hdds.cli.SubcommandWithParent;
+import org.kohsuke.MetaInfServices;
+
+import picocli.CommandLine.Command;
+import picocli.CommandLine.Model.CommandSpec;
+import picocli.CommandLine.Spec;
+
+/**
+ * Subcommand to group Upgrade related operations.
+ */
+@Command(
+    name = "scm",
+    description = "Storage Container Manager specific operations",
+    mixinStandardHelpOptions = true,
+    versionProvider = HddsVersionProvider.class,
+    subcommands = {
+        FinalizeScmUpgradeSubcommand.class,
+    })
+@MetaInfServices(SubcommandWithParent.class)
+public class AllScmCommands implements Callable<Void>, SubcommandWithParent {
+
+  @Spec
+  private CommandSpec spec;
+
+  @Override
+  public Void call() throws Exception {
+    GenericCli.missingSubcommand(spec);
+    return null;
+  }
+
+  @Override
+  public Class<?> getParentType() {
+    return OzoneAdmin.class;
+  }
+}
diff --git 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/upgrade/FinalizeScmUpgradeSubcommand.java
 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/upgrade/FinalizeScmUpgradeSubcommand.java
new file mode 100644
index 0000000..73533b9
--- /dev/null
+++ 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/upgrade/FinalizeScmUpgradeSubcommand.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hdds.scm.cli.upgrade;
+
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.emitCancellationMsg;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.emitExitMsg;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.emitFinishedMsg;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.emitGeneralErrorMsg;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.handleInvalidRequestAfterInitiatingFinalization;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.isDone;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.isFinalized;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.isInprogress;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.isStarting;
+
+import java.io.IOException;
+import java.util.UUID;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import org.apache.hadoop.hdds.cli.HddsVersionProvider;
+import org.apache.hadoop.hdds.scm.cli.ScmSubcommand;
+import org.apache.hadoop.hdds.scm.client.ScmClient;
+import org.apache.hadoop.ozone.upgrade.UpgradeException;
+import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer;
+import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer.StatusAndMessages;
+
+import picocli.CommandLine;
+
+/**
+ * Handler of Finalize SCM command.
+ */
[email protected](
+    name = "finalizeupgrade",
+    description = "Finalize SCM Upgrade",
+    mixinStandardHelpOptions = true,
+    versionProvider = HddsVersionProvider.class)
+
+public class FinalizeScmUpgradeSubcommand extends ScmSubcommand {
+  @CommandLine.Option(
+      names = {"--takeover"},
+      description = "Forces takeover of monitoring from another client, if "
+          + "finalization has already been started and did not finish yet."
+  )
+  private boolean force;
+
+  @Override
+  public void execute(ScmClient scmClient) throws IOException {
+    String upgradeClientID = "Upgrade-Client-" + UUID.randomUUID().toString();
+    try {
+      StatusAndMessages finalizationResponse =
+          scmClient.finalizeScmUpgrade(upgradeClientID);
+      if (isFinalized(finalizationResponse.status())){
+        System.out.println("Upgrade has already been finalized.");
+        emitExitMsg();
+        return;
+      } else if (!isStarting(finalizationResponse.status())){
+        System.err.println("Invalid response from Storage Container Manager.");
+        System.err.println(
+            "Current finalization status is: " + finalizationResponse.status()
+        );
+        throw new IOException("Exiting...");
+      }
+    } catch (UpgradeException e) {
+      handleInvalidRequestAfterInitiatingFinalization(force, e);
+    }
+    monitorAndWaitFinalization(scmClient, upgradeClientID);
+    return;
+  }
+
+  private void monitorAndWaitFinalization(ScmClient client,
+                                          String upgradeClientID)
+      throws IOException {
+    ExecutorService exec = Executors.newSingleThreadExecutor();
+    Future<?> monitor =
+        exec.submit(new UpgradeMonitor(client, upgradeClientID, force));
+    try {
+      monitor.get();
+      emitFinishedMsg("Storage Container Manager");
+    } catch (CancellationException |InterruptedException e) {
+      emitCancellationMsg("Storage Container Manager");
+    } catch (ExecutionException e) {
+      emitGeneralErrorMsg();
+      throw new IOException(e.getCause());
+    } finally {
+      exec.shutdown();
+    }
+  }
+
+  private static class UpgradeMonitor implements Callable<Void> {
+
+    private ScmClient client;
+    private String upgradeClientID;
+    private boolean force;
+
+    UpgradeMonitor(
+        ScmClient client,
+        String upgradeClientID,
+        boolean force
+    ) {
+      this.client = client;
+      this.upgradeClientID = upgradeClientID;
+      this.force = force;
+    }
+
+    @Override
+    public Void call() throws Exception {
+      boolean finished = false;
+      while (!finished) {
+        Thread.sleep(500);
+        // do not check for exceptions, if one happens during monitoring we
+        // should report it and exit.
+        UpgradeFinalizer.StatusAndMessages progress =
+            client.queryUpgradeFinalizationProgress(upgradeClientID, force);
+        // this can happen after trying to takeover the request after the fact
+        // when there is already nothing to take over.
+        if (isFinalized(progress.status())) {
+          System.out.println("Finalization already finished.");
+          emitExitMsg();
+          return null;
+        }
+        if (isInprogress(progress.status()) || isDone(progress.status())) {
+          progress.msgs().stream().forEachOrdered(System.out::println);
+        }
+        if (isDone(progress.status())) {
+          emitExitMsg();
+          finished = true;
+        }
+      }
+      return null;
+    }
+  }
+}
diff --git 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/upgrade/FinalizeUpgradeCommandUtil.java
 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/upgrade/FinalizeUpgradeCommandUtil.java
new file mode 100644
index 0000000..80a45d2
--- /dev/null
+++ 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/upgrade/FinalizeUpgradeCommandUtil.java
@@ -0,0 +1,92 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership.  The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations 
under
+ * the License.
+ */
+
+package org.apache.hadoop.hdds.scm.cli.upgrade;
+
+import static org.apache.hadoop.ozone.upgrade.UpgradeException
+    .ResultCodes.INVALID_REQUEST;
+
+import java.io.IOException;
+
+import org.apache.hadoop.ozone.upgrade.UpgradeException;
+import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer;
+
+/**
+ * Base class to help with Upgrade finalization command.
+ */
+
+public final class FinalizeUpgradeCommandUtil {
+
+  private FinalizeUpgradeCommandUtil() {
+
+  }
+
+  public static void handleInvalidRequestAfterInitiatingFinalization(
+      boolean force, UpgradeException e) throws IOException {
+    if (e.getResult().equals(INVALID_REQUEST)) {
+      if (force) {
+        return;
+      }
+      System.err.println("Finalization is already in progress, it is not"
+          + "possible to initiate it again.");
+      e.printStackTrace(System.err);
+      System.err.println("If you want to track progress from a new client"
+          + "for any reason, use --takeover, and the status update will be"
+          + "received by the new client. Note that with forcing to monitor"
+          + "progress from a new client, the old one initiated the upgrade"
+          + "will not be able to monitor the progress further and exit.");
+      throw new IOException("Exiting...");
+    } else {
+      throw e;
+    }
+  }
+
+  public static void emitExitMsg() {
+    System.out.println("Exiting...");
+  }
+
+  public static boolean isFinalized(UpgradeFinalizer.Status status) {
+    return status.equals(UpgradeFinalizer.Status.ALREADY_FINALIZED);
+  }
+
+  public static boolean isDone(UpgradeFinalizer.Status status) {
+    return status.equals(UpgradeFinalizer.Status.FINALIZATION_DONE);
+  }
+
+  public static boolean isInprogress(UpgradeFinalizer.Status status) {
+    return status.equals(UpgradeFinalizer.Status.FINALIZATION_IN_PROGRESS);
+  }
+
+  public static boolean isStarting(UpgradeFinalizer.Status status) {
+    return status.equals(UpgradeFinalizer.Status.STARTING_FINALIZATION);
+  }
+
+  public static void emitGeneralErrorMsg() {
+    System.err.println("Finalization was not successful.");
+  }
+
+  public static void emitFinishedMsg(String component) {
+    System.out.println("Finalization of " + component +"'s metadata upgrade "
+        + "finished.");
+  }
+
+  public static void emitCancellationMsg(String component) {
+    System.err.println("Finalization command was cancelled. Note that, this"
+        + "will not cancel finalization in " + component +". Progress can be"
+        + "monitored in the Ozone Manager's log.");
+  }
+}
diff --git 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/upgrade/package-info.java
 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/upgrade/package-info.java
new file mode 100644
index 0000000..f5b4438
--- /dev/null
+++ 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/upgrade/package-info.java
@@ -0,0 +1,22 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Contains all of the upgrade related scm commands.
+ */
+package org.apache.hadoop.hdds.scm.cli.upgrade;
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
index b6ea86a..cb0edcd 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import java.util.stream.Collectors;
 
 import org.apache.hadoop.hdds.annotation.InterfaceAudience;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos
+    .UpgradeFinalizationStatus;
 import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList;
 import org.apache.hadoop.hdds.tracing.TracingUtil;
 import org.apache.hadoop.io.Text;
@@ -138,7 +140,6 @@ import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.SetAclR
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.SetBucketPropertyRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.SetVolumePropertyRequest;
 import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
-import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.UpgradeFinalizationStatus;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.VolumeInfo;
 import org.apache.hadoop.ozone.protocolPB.OMPBHelper;
 import org.apache.hadoop.ozone.security.OzoneTokenIdentifier;
diff --git 
a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto 
b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
index c9eba9d..d0df304 100644
--- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
+++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
@@ -1048,25 +1048,12 @@ message DBUpdatesResponse {
     repeated bytes data = 2;
 }
 
-
-message UpgradeFinalizationStatus {
-  enum Status {
-    ALREADY_FINALIZED = 1;
-    STARTING_FINALIZATION = 2;
-    FINALIZATION_IN_PROGRESS = 3;
-    FINALIZATION_DONE = 4;
-    FINALIZATION_REQUIRED = 5;
-  }
-  required Status status = 1;
-  repeated string messages = 2;
-}
-
 message FinalizeUpgradeRequest {
   required string upgradeClientId = 1;
 }
 
 message FinalizeUpgradeResponse {
-    required UpgradeFinalizationStatus status = 1;
+    required hadoop.hdds.UpgradeFinalizationStatus status = 1;
 }
 
 message FinalizeUpgradeProgressRequest {
@@ -1075,7 +1062,7 @@ message FinalizeUpgradeProgressRequest {
 }
 
 message FinalizeUpgradeProgressResponse {
-    required UpgradeFinalizationStatus status = 1;
+    required hadoop.hdds.UpgradeFinalizationStatus status = 1;
 }
 
 message PrepareRequest {
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeRequest.java
index d720957..767a901 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeRequest.java
@@ -19,6 +19,8 @@ package org.apache.hadoop.ozone.om.request.upgrade;
 
 import static 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.FinalizeUpgrade;
 
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos
+    .UpgradeFinalizationStatus;
 import org.apache.hadoop.ozone.om.OzoneManager;
 import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper;
 import org.apache.hadoop.ozone.om.request.OMClientRequest;
@@ -29,7 +31,6 @@ import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Finaliz
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.FinalizeUpgradeResponse;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
-import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.UpgradeFinalizationStatus;
 import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer.StatusAndMessages;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
index dcf3e14..c2f9822 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.UpgradeFinalizationStatus;
 import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList;
 import org.apache.hadoop.hdds.utils.db.SequenceNumberNotFoundException;
 import org.apache.hadoop.ozone.OzoneAcl;
@@ -77,7 +78,6 @@ import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Service
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ServiceListResponse;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status;
 import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
-import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.UpgradeFinalizationStatus;
 import org.apache.hadoop.ozone.security.acl.OzoneObjInfo;
 
 import com.google.common.collect.Lists;
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizeUpgradeSubCommand.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizeUpgradeSubCommand.java
index 7bf1484..a80437e 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizeUpgradeSubCommand.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizeUpgradeSubCommand.java
@@ -17,9 +17,19 @@
 
 package org.apache.hadoop.ozone.admin.om;
 
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.emitCancellationMsg;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.emitExitMsg;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.emitFinishedMsg;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.emitGeneralErrorMsg;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.handleInvalidRequestAfterInitiatingFinalization;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.isDone;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.isFinalized;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.isInprogress;
+import static 
org.apache.hadoop.hdds.scm.cli.upgrade.FinalizeUpgradeCommandUtil.isStarting;
+
 import org.apache.hadoop.hdds.cli.HddsVersionProvider;
-import org.apache.hadoop.ozone.om.exceptions.OMException;
 import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
+import org.apache.hadoop.ozone.upgrade.UpgradeException;
 import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer;
 import picocli.CommandLine;
 
@@ -32,8 +42,6 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 
-import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.INVALID_REQUEST;
-
 /**
  * Handler of ozone admin om finalizeUpgrade command.
  */
@@ -91,8 +99,8 @@ public class FinalizeUpgradeSubCommand implements 
Callable<Void> {
         );
         throw new IOException("Exiting...");
       }
-    } catch (OMException e) {
-      handleInvalidRequestAfterInitiatingFinalization(e);
+    } catch (UpgradeException e) {
+      handleInvalidRequestAfterInitiatingFinalization(force, e);
     }
     monitorAndWaitFinalization(client, upgradeClientID);
     return null;
@@ -105,9 +113,9 @@ public class FinalizeUpgradeSubCommand implements 
Callable<Void> {
         exec.submit(new UpgradeMonitor(client, upgradeClientID, force));
     try {
       monitor.get();
-      emitFinishedMsg();
+      emitFinishedMsg("Ozone Manager");
     } catch (CancellationException|InterruptedException e) {
-      emitCancellationMsg();
+      emitCancellationMsg("Ozone Manager");
     } catch (ExecutionException e) {
       emitGeneralErrorMsg();
       throw e;
@@ -116,26 +124,6 @@ public class FinalizeUpgradeSubCommand implements 
Callable<Void> {
     }
   }
 
-  private void handleInvalidRequestAfterInitiatingFinalization(
-      OMException e) throws IOException {
-    if (e.getResult().equals(INVALID_REQUEST)) {
-      if (force) {
-        return;
-      }
-      System.err.println("Finalization is already in progress, it is not"
-          + "possible to initiate it again.");
-      e.printStackTrace(System.err);
-      System.err.println("If you want to track progress from a new client"
-          + "for any reason, use --takeover, and the status update will be"
-          + "received by the new client. Note that with forcing to monitor"
-          + "progress from a new client, the old one initiated the upgrade"
-          + "will not be able to monitor the progress further and exit.");
-      throw new IOException("Exiting...");
-    } else {
-      throw e;
-    }
-  }
-
   private static class UpgradeMonitor implements Callable<Void> {
 
     private OzoneManagerProtocol client;
@@ -178,40 +166,5 @@ public class FinalizeUpgradeSubCommand implements 
Callable<Void> {
       }
       return null;
     }
-
-  }
-  private static void emitExitMsg() {
-    System.out.println("Exiting...");
-  }
-
-  private static boolean isFinalized(UpgradeFinalizer.Status status) {
-    return status.equals(UpgradeFinalizer.Status.ALREADY_FINALIZED);
-  }
-
-  private static boolean isDone(UpgradeFinalizer.Status status) {
-    return status.equals(UpgradeFinalizer.Status.FINALIZATION_DONE);
-  }
-
-  private static boolean isInprogress(UpgradeFinalizer.Status status) {
-    return status.equals(UpgradeFinalizer.Status.FINALIZATION_IN_PROGRESS);
-  }
-
-  private static boolean isStarting(UpgradeFinalizer.Status status) {
-    return status.equals(UpgradeFinalizer.Status.STARTING_FINALIZATION);
-  }
-
-  private static void emitGeneralErrorMsg() {
-    System.err.println("Finalization was not successful.");
-  }
-
-  private static void emitFinishedMsg() {
-    System.out.println("Finalization of Ozone Manager's metadata upgrade "
-        + "finished.");
-  }
-
-  private static void emitCancellationMsg() {
-    System.err.println("Finalization command was cancelled. Note that, this"
-        + "will not cancel finalization in Ozone Manager. Progress can be"
-        + "monitored in the Ozone Manager's log.");
   }
 }


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

Reply via email to