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

sammichen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 72b5de7548 HDDS-8518. Admin SCM decommission command primordial node 
support (#4649)
72b5de7548 is described below

commit 72b5de754802a816a30bb026cd6a4f4bf957b340
Author: Neil Joshi <[email protected]>
AuthorDate: Mon May 8 03:06:07 2023 -0600

    HDDS-8518. Admin SCM decommission command primordial node support (#4649)
---
 .../hadoop/hdds/scm/ha/SCMHAManagerImpl.java       |  2 -
 .../hadoop/hdds/scm/ha/SCMRatisServerImpl.java     |  3 +-
 .../hdds/scm/server/StorageContainerManager.java   |  5 --
 .../hadoop/hdds/scm/ha/TestSCMHAManagerImpl.java   |  2 -
 .../dist/src/main/compose/ozonesecure-ha/test.sh   |  7 +++
 .../main/smoketest/scmha/scm-decommission.robot    | 60 ++++++++++++++++++++++
 .../ozone/scm/TestDecommissionScmSubcommand.java   |  4 +-
 7 files changed, 71 insertions(+), 12 deletions(-)

diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAManagerImpl.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAManagerImpl.java
index 64a02b50ee..6af0fb9919 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAManagerImpl.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAManagerImpl.java
@@ -371,8 +371,6 @@ public class SCMHAManagerImpl implements SCMHAManager {
    */
   @Override
   public boolean removeSCM(RemoveSCMRequest request) throws IOException {
-    // Currently we don't support decommission of Primordial SCM
-    // The caller should make sure that the requested node is not Primordial 
SCM
 
     String clusterId = scm.getClusterId();
     if (!request.getClusterId().equals(scm.getClusterId())) {
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMRatisServerImpl.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMRatisServerImpl.java
index bf88f2a3fc..230f3067c3 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMRatisServerImpl.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMRatisServerImpl.java
@@ -266,7 +266,8 @@ public class SCMRatisServerImpl implements SCMRatisServer {
                   ":".concat(RaftProtos.RaftPeerRole.LEADER.toString()) :
                   ":".concat(RaftProtos.RaftPeerRole.FOLLOWER.toString()))
                   .concat(":".concat(peer.getId().toString()))
-                  .concat(":".concat(peerInetAddress.getHostAddress()))));
+                  .concat(":".concat(peerInetAddress == null ? "" :
+                      peerInetAddress.getHostAddress()))));
     }
     return ratisRoles;
   }
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 3f9f49ac0b..7d0fd4bd78 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
@@ -2166,11 +2166,6 @@ public final class StorageContainerManager extends 
ServiceRuntimeInfoImpl
       throw new IOException("Cannot remove current leader.");
     }
 
-    // Currently we don't support removal of primordial node.
-    if (scmId.equals(primaryScmNodeId)) {
-      throw new IOException("Removal of primordial node is not supported.");
-    }
-
     Preconditions.checkNotNull(getScmHAManager().getRatisServer()
         .getDivision().getGroup());
 
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestSCMHAManagerImpl.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestSCMHAManagerImpl.java
index 10d15c9170..11209217cc 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestSCMHAManagerImpl.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestSCMHAManagerImpl.java
@@ -168,8 +168,6 @@ class TestSCMHAManagerImpl {
           scm2.removePeerFromHARing(randomScmId));
       assertTrue(ex.getMessage().contains("Peer"));
 
-      // TODO: try removing primordial node from ratis ring
-
       // try removing leader scm from ratis ring
       ex = assertThrows(IOException.class, () ->
           scm2.removePeerFromHARing(scm2.getScmId()));
diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test.sh 
b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test.sh
index 0b39ffb9c1..10d71c08cf 100755
--- a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test.sh
+++ b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test.sh
@@ -70,6 +70,13 @@ docker-compose up -d datanode4
 wait_for_port datanode4 9856 60
 wait_for_execute_command scm4.org 60 "ozone admin datanode list | grep 
datanode4"
 
+# decommission primordial node scm1.org
+SCMID=$(execute_command_in_container scm4.org bash -c "ozone admin scm roles" 
| grep scm4 | awk -F: '{print $4}')
+docker-compose stop scm4.org
+execute_robot_test scm3.org kinit.robot
+wait_for_execute_command scm3.org 60 "ozone admin scm decommission 
--nodeid=${SCMID} | grep Decommissioned"
+execute_robot_test scm3.org scmha/scm-decommission.robot
+
 stop_docker_env
 
 generate_report
diff --git a/hadoop-ozone/dist/src/main/smoketest/scmha/scm-decommission.robot 
b/hadoop-ozone/dist/src/main/smoketest/scmha/scm-decommission.robot
new file mode 100644
index 0000000000..49ce16b233
--- /dev/null
+++ b/hadoop-ozone/dist/src/main/smoketest/scmha/scm-decommission.robot
@@ -0,0 +1,60 @@
+# 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.
+
+*** Settings ***
+Documentation       Smoketest ozone cluster startup
+Library             OperatingSystem
+Library             BuiltIn
+Resource            ../commonlib.robot
+Test Timeout        5 minutes
+
+*** Variables ***
+
+** Keywords ***
+
+*** Test Cases ***
+Transfer Leader to non-primordial node Follower
+    ${result} =             Execute                 ozone admin scm roles 
--service-id=scmservice
+                            LOG                     ${result}
+    ${follower_nodes} =     Get Lines Matching Pattern                      
${result}           scm[23].org:9894:FOLLOWER*
+    ${follower_node} =      Get Line                ${follower_nodes}        0
+    ${follower_split} =     Split String            ${follower_node}         :
+    ${follower_scmId} =     Strip String            ${follower_split[3]}
+
+    ${result} =             Execute                 ozone admin scm transfer 
--service-id=scmservice -n ${follower_scmId}
+                            LOG                     ${result}
+                            Should Contain          ${result}                
Transfer leadership successfully
+
+Decommission SCM Primordial Node
+    ${result} =             Execute                 ozone admin scm roles 
--service-id=scmservice
+    ${nodes_in_quorum} =    Get Lines Matching Pattern                      
${result}           scm[1234].org:9894:*
+    ${node_count} =         Get Line Count          ${nodes_in_quorum}
+    ${node_count_pre} =     Convert to String       ${node_count}
+    ${n} =                  Evaluate                ${node_count}-1
+    ${node_count_expect} =  Convert to String       ${n}
+                            LOG                     SCM Instance Count before 
SCM Decommission: ${node_count_pre}
+    ${primordial_node} =    Get Lines Containing String                     
${result}           scm1
+    ${primordial_split} =   Split String            ${primordial_node}      :
+    ${primordial_scmId} =   Strip String            ${primordial_split[3]}
+    ${decommission_res} =   Execute                 ozone admin scm 
decommission --nodeid=${primordial_scmId}
+                            LOG                     ${decommission_res}
+                            Should Contain          ${decommission_res}        
                 Decommissioned
+    ${result} =             Execute                 ozone admin scm roles 
--service-id=scmservice
+    ${nodes_in_quorum} =    Get Lines Matching Pattern                      
${result}           scm[1234].org:9894:*
+    ${node_count} =         Get Line Count          ${nodes_in_quorum}
+    ${node_count_post} =    Convert to String       ${node_count}
+                            LOG                     SCM Instance Count after 
SCM Decommission: ${node_count_post}
+                            Should be Equal         ${node_count_expect}       
                 ${node_count_post}
+
diff --git 
a/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/scm/TestDecommissionScmSubcommand.java
 
b/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/scm/TestDecommissionScmSubcommand.java
index 794a99e527..a7ba74949a 100644
--- 
a/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/scm/TestDecommissionScmSubcommand.java
+++ 
b/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/scm/TestDecommissionScmSubcommand.java
@@ -88,7 +88,7 @@ public class TestDecommissionScmSubcommand {
     DecommissionScmResponseProto response =
         DecommissionScmResponseProto.newBuilder()
             .setSuccess(false)
-            .setErrorMsg("Removal of primordial node is not supported")
+            .setErrorMsg("Cannot remove current leader.")
             .build();
 
     Mockito.when(client.decommissionScm(any()))
@@ -99,7 +99,7 @@ public class TestDecommissionScmSubcommand {
              new GenericTestUtils.SystemOutCapturer()) {
       cmd.execute(client);
       assertTrue(capture.getOutput().contains(
-          "Removal of primordial"));
+          "remove current leader"));
     }
   }
 


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

Reply via email to