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]