You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by sa...@apache.org on 2020/12/08 12:28:43 UTC

[ozone] branch HDDS-2823 updated: HDDS-4551: Remove checkLeader in PipelineManager. (#1658)

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

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


The following commit(s) were added to refs/heads/HDDS-2823 by this push:
     new 34c393c  HDDS-4551: Remove checkLeader in PipelineManager. (#1658)
34c393c is described below

commit 34c393c000adda9f8bc232c03ec32d2f64b318de
Author: GlenGeng <gl...@tencent.com>
AuthorDate: Tue Dec 8 20:28:28 2020 +0800

    HDDS-4551: Remove checkLeader in PipelineManager. (#1658)
---
 .../hadoop/hdds/scm/ha/SCMHAManagerImpl.java       |  2 +-
 .../hdds/scm/pipeline/PipelineManagerV2Impl.java   | 33 ++----------
 .../java/org/apache/hadoop/hdds/scm/TestUtils.java |  4 +-
 .../hadoop/hdds/scm/block/TestBlockManager.java    |  2 +-
 .../container/TestCloseContainerEventHandler.java  |  2 +-
 .../scm/container/TestContainerManagerImpl.java    |  2 +-
 .../scm/container/TestSCMContainerManager.java     |  2 +-
 .../hadoop/hdds/scm/ha/MockSCMHAManager.java       | 63 +++++++++++-----------
 .../hdds/scm/node/TestContainerPlacement.java      |  2 +-
 .../hdds/scm/pipeline/TestPipelineManagerImpl.java | 61 +++++++++++++++------
 .../safemode/TestHealthyPipelineSafeModeRule.java  |  6 +--
 .../TestOneReplicaPipelineSafeModeRule.java        |  2 +-
 .../hdds/scm/safemode/TestSCMSafeModeManager.java  | 12 ++---
 .../scm/server/TestSCMBlockProtocolServer.java     |  2 +-
 .../apache/hadoop/ozone/om/TestKeyManagerImpl.java |  2 +-
 15 files changed, 99 insertions(+), 98 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 5271ac6..966db43 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
@@ -48,7 +48,7 @@ public class SCMHAManagerImpl implements SCMHAManager {
   private static final Logger LOG =
       LoggerFactory.getLogger(SCMHAManagerImpl.class);
 
-  private final SCMRatisServerImpl ratisServer;
+  private final SCMRatisServer ratisServer;
   private final ConfigurationSource conf;
 
   /**
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerV2Impl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerV2Impl.java
index 48fbdbf..3f2f6e2 100644
--- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerV2Impl.java
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerV2Impl.java
@@ -49,7 +49,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.NavigableSet;
-import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -144,7 +143,6 @@ public final class PipelineManagerV2Impl implements PipelineManager {
   @Override
   public Pipeline createPipeline(ReplicationType type,
                                  ReplicationFactor factor) throws IOException {
-    checkLeader();
     if (!isPipelineCreationAllowed() && factor != ReplicationFactor.ONE) {
       LOG.debug("Pipeline creation is not allowed until safe mode prechecks " +
           "complete");
@@ -275,7 +273,6 @@ public final class PipelineManagerV2Impl implements PipelineManager {
   @Override
   public void addContainerToPipeline(
       PipelineID pipelineID, ContainerID containerID) throws IOException {
-    checkLeader();
     lock.writeLock().lock();
     try {
       stateManager.addContainerToPipeline(pipelineID, containerID);
@@ -287,7 +284,6 @@ public final class PipelineManagerV2Impl implements PipelineManager {
   @Override
   public void removeContainerFromPipeline(
       PipelineID pipelineID, ContainerID containerID) throws IOException {
-    checkLeader();
     lock.writeLock().lock();
     try {
       stateManager.removeContainerFromPipeline(pipelineID, containerID);
@@ -299,7 +295,6 @@ public final class PipelineManagerV2Impl implements PipelineManager {
   @Override
   public NavigableSet<ContainerID> getContainersInPipeline(
       PipelineID pipelineID) throws IOException {
-    checkLeader();
     lock.readLock().lock();
     try {
       return stateManager.getContainers(pipelineID);
@@ -310,13 +305,11 @@ public final class PipelineManagerV2Impl implements PipelineManager {
 
   @Override
   public int getNumberOfContainers(PipelineID pipelineID) throws IOException {
-    checkLeader();
     return stateManager.getNumberOfContainers(pipelineID);
   }
 
   @Override
   public void openPipeline(PipelineID pipelineId) throws IOException {
-    checkLeader();
     lock.writeLock().lock();
     try {
       Pipeline pipeline = stateManager.getPipeline(pipelineId);
@@ -342,7 +335,6 @@ public final class PipelineManagerV2Impl implements PipelineManager {
    * @throws IOException
    */
   protected void removePipeline(Pipeline pipeline) throws IOException {
-    checkLeader();
     pipelineFactory.close(pipeline.getType(), pipeline);
     PipelineID pipelineID = pipeline.getId();
     lock.writeLock().lock();
@@ -364,7 +356,6 @@ public final class PipelineManagerV2Impl implements PipelineManager {
    */
   protected void closeContainersForPipeline(final PipelineID pipelineId)
       throws IOException {
-    checkLeader();
     Set<ContainerID> containerIDs = stateManager.getContainers(pipelineId);
     for (ContainerID containerID : containerIDs) {
       eventPublisher.fireEvent(SCMEvents.CLOSE_CONTAINER, containerID);
@@ -380,7 +371,6 @@ public final class PipelineManagerV2Impl implements PipelineManager {
   @Override
   public void closePipeline(Pipeline pipeline, boolean onTimeout)
       throws IOException {
-    checkLeader();
     PipelineID pipelineID = pipeline.getId();
     lock.writeLock().lock();
     try {
@@ -410,8 +400,6 @@ public final class PipelineManagerV2Impl implements PipelineManager {
   @Override
   public void scrubPipeline(ReplicationType type, ReplicationFactor factor)
       throws IOException {
-    checkLeader();
-
     Instant currentTime = Instant.now();
     Long pipelineScrubTimeoutInMills = conf.getTimeDuration(
         ScmConfigKeys.OZONE_SCM_PIPELINE_ALLOCATED_TIMEOUT,
@@ -484,7 +472,6 @@ public final class PipelineManagerV2Impl implements PipelineManager {
   @Override
   public void activatePipeline(PipelineID pipelineID)
       throws IOException {
-    checkLeader();
     stateManager.updatePipelineState(pipelineID.getProtobuf(),
         HddsProtos.PipelineState.PIPELINE_OPEN);
   }
@@ -498,7 +485,6 @@ public final class PipelineManagerV2Impl implements PipelineManager {
   @Override
   public void deactivatePipeline(PipelineID pipelineID)
       throws IOException {
-    checkLeader();
     stateManager.updatePipelineState(pipelineID.getProtobuf(),
         HddsProtos.PipelineState.PIPELINE_DORMANT);
   }
@@ -513,7 +499,6 @@ public final class PipelineManagerV2Impl implements PipelineManager {
   @Override
   public void waitPipelineReady(PipelineID pipelineID, long timeout)
       throws IOException {
-    checkLeader();
     long st = Time.monotonicNow();
     if (timeout == 0) {
       timeout = pipelineWaitDefaultTimeout;
@@ -546,7 +531,6 @@ public final class PipelineManagerV2Impl implements PipelineManager {
 
   @Override
   public Map<String, Integer> getPipelineInfo() throws NotLeaderException {
-    checkLeader();
     final Map<String, Integer> pipelineInfo = new HashMap<>();
     for (Pipeline.PipelineState state : Pipeline.PipelineState.values()) {
       pipelineInfo.put(state.toString(), 0);
@@ -632,21 +616,10 @@ public final class PipelineManagerV2Impl implements PipelineManager {
   public StateManager getStateManager() {
     return stateManager;
   }
-  
-  public void setScmhaManager(SCMHAManager scmhaManager) {
-    this.scmhaManager = scmhaManager;
-  }
 
-  /**
-   * return term of underlying RaftServer if role of SCM is leader.
-   * @throws NotLeaderException when it's not leader.
-   */
-  private long checkLeader() throws NotLeaderException {
-    Optional<Long> termOpt = scmhaManager.isLeader();
-    if (!termOpt.isPresent()) {
-      throw scmhaManager.triggerNotLeaderException();
-    }
-    return termOpt.get();
+  @VisibleForTesting
+  public SCMHAManager getScmhaManager() {
+    return scmhaManager;
   }
 
   private void setBackgroundPipelineCreator(
diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/TestUtils.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/TestUtils.java
index e589526..4852fa5 100644
--- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/TestUtils.java
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/TestUtils.java
@@ -475,7 +475,7 @@ public final class TestUtils {
   public static StorageContainerManager getScmSimple(OzoneConfiguration conf)
       throws IOException, AuthenticationException {
     SCMConfigurator configurator = new SCMConfigurator();
-    configurator.setSCMHAManager(MockSCMHAManager.getInstance());
+    configurator.setSCMHAManager(MockSCMHAManager.getInstance(true));
     return StorageContainerManager.createSCM(conf, configurator);
   }
 
@@ -492,7 +492,7 @@ public final class TestUtils {
   public static StorageContainerManager getScm(OzoneConfiguration conf)
       throws IOException, AuthenticationException {
     SCMConfigurator configurator = new SCMConfigurator();
-    configurator.setSCMHAManager(MockSCMHAManager.getInstance());
+    configurator.setSCMHAManager(MockSCMHAManager.getInstance(true));
     return getScm(conf, configurator);
   }
 
diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/block/TestBlockManager.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/block/TestBlockManager.java
index 9eea79f..ebe29fb 100644
--- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/block/TestBlockManager.java
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/block/TestBlockManager.java
@@ -112,7 +112,7 @@ public class TestBlockManager {
     // Override the default Node Manager and SCMHAManager
     // in SCM with the Mock one.
     nodeManager = new MockNodeManager(true, 10);
-    scmHAManager = MockSCMHAManager.getInstance();
+    scmHAManager = MockSCMHAManager.getInstance(true);
 
     eventQueue = new EventQueue();
 
diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestCloseContainerEventHandler.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestCloseContainerEventHandler.java
index fbe4d42..ff6ea6d 100644
--- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestCloseContainerEventHandler.java
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestCloseContainerEventHandler.java
@@ -80,7 +80,7 @@ public class TestCloseContainerEventHandler {
     pipelineManager =
         PipelineManagerV2Impl.newPipelineManager(
             configuration,
-            MockSCMHAManager.getInstance(),
+            MockSCMHAManager.getInstance(true),
             nodeManager,
             scmMetadataStore.getPipelineTable(),
             eventQueue);
diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerManagerImpl.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerManagerImpl.java
index 6492e0a..322b0c3 100644
--- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerManagerImpl.java
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerManagerImpl.java
@@ -60,7 +60,7 @@ public class TestContainerManagerImpl {
     pipelineManager.createPipeline(HddsProtos.ReplicationType.RATIS,
         HddsProtos.ReplicationFactor.THREE);
     containerManager = new ContainerManagerImpl(conf,
-        MockSCMHAManager.getInstance(), pipelineManager,
+        MockSCMHAManager.getInstance(true), pipelineManager,
         SCMDBDefinition.CONTAINERS.getTable(dbStore));
   }
 
diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestSCMContainerManager.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestSCMContainerManager.java
index a45d637..b45f9c1 100644
--- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestSCMContainerManager.java
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestSCMContainerManager.java
@@ -95,7 +95,7 @@ public class TestSCMContainerManager {
     SCMMetadataStore scmMetadataStore = new SCMMetadataStoreImpl(conf);
     pipelineManager = PipelineManagerV2Impl.newPipelineManager(
         conf,
-        MockSCMHAManager.getInstance(),
+        MockSCMHAManager.getInstance(true),
         nodeManager,
         scmMetadataStore.getPipelineTable(),
         new EventQueue());
diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/MockSCMHAManager.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/MockSCMHAManager.java
index ab329a5..a5fd748 100644
--- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/MockSCMHAManager.java
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/MockSCMHAManager.java
@@ -47,28 +47,16 @@ public final class MockSCMHAManager implements SCMHAManager {
   private final SCMRatisServer ratisServer;
   private boolean isLeader;
 
-  public static SCMHAManager getInstance() {
-    return new MockSCMHAManager();
-  }
-
-  public static SCMHAManager getLeaderInstance() {
-    MockSCMHAManager mockSCMHAManager = new MockSCMHAManager();
-    mockSCMHAManager.setIsLeader(true);
-    return mockSCMHAManager;
-  }
-
-  public static SCMHAManager getFollowerInstance() {
-    MockSCMHAManager mockSCMHAManager = new MockSCMHAManager();
-    mockSCMHAManager.setIsLeader(false);
-    return mockSCMHAManager;
+  public static SCMHAManager getInstance(boolean isLeader) {
+    return new MockSCMHAManager(isLeader);
   }
 
   /**
    * Creates MockSCMHAManager instance.
    */
-  private MockSCMHAManager() {
+  private MockSCMHAManager(boolean isLeader) {
     this.ratisServer = new MockRatisServer();
-    this.isLeader = true;
+    this.isLeader = isLeader;
   }
 
   @Override
@@ -127,7 +115,7 @@ public final class MockSCMHAManager implements SCMHAManager {
         null, new ArrayList<>());
   }
 
-  private static class MockRatisServer implements SCMRatisServer {
+  private class MockRatisServer implements SCMRatisServer {
 
     private Map<RequestType, Object> handlers =
         new EnumMap<>(RequestType.class);
@@ -148,19 +136,32 @@ public final class MockSCMHAManager implements SCMHAManager {
       final RaftGroupMemberId raftId = RaftGroupMemberId.valueOf(
           RaftPeerId.valueOf("peer"), RaftGroupId.randomId());
       RaftClientReply reply;
-      try {
-        final Message result = process(request);
-        reply = RaftClientReply.newBuilder()
-            .setClientId(ClientId.randomId())
-            .setServerId(raftId)
-            .setGroupId(RaftGroupId.emptyGroupId())
-            .setCallId(1L)
-            .setSuccess(true)
-            .setMessage(result)
-            .setException(null)
-            .setLogIndex(1L)
-            .build();
-      } catch (Exception ex) {
+      if (isLeader().isPresent()) {
+        try {
+          final Message result = process(request);
+          reply = RaftClientReply.newBuilder()
+              .setClientId(ClientId.randomId())
+              .setServerId(raftId)
+              .setGroupId(RaftGroupId.emptyGroupId())
+              .setCallId(1L)
+              .setSuccess(true)
+              .setMessage(result)
+              .setException(null)
+              .setLogIndex(1L)
+              .build();
+        } catch (Exception ex) {
+          reply = RaftClientReply.newBuilder()
+              .setClientId(ClientId.randomId())
+              .setServerId(raftId)
+              .setGroupId(RaftGroupId.emptyGroupId())
+              .setCallId(1L)
+              .setSuccess(false)
+              .setMessage(Message.EMPTY)
+              .setException(new StateMachineException(raftId, ex))
+              .setLogIndex(1L)
+              .build();
+        }
+      } else {
         reply = RaftClientReply.newBuilder()
             .setClientId(ClientId.randomId())
             .setServerId(raftId)
@@ -168,7 +169,7 @@ public final class MockSCMHAManager implements SCMHAManager {
             .setCallId(1L)
             .setSuccess(false)
             .setMessage(Message.EMPTY)
-            .setException(new StateMachineException(raftId, ex))
+            .setException(triggerNotLeaderException())
             .setLogIndex(1L)
             .build();
       }
diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
index 7fea0c5..26de4fb 100644
--- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
@@ -118,7 +118,7 @@ public class TestContainerPlacement {
     PipelineManager pipelineManager =
         PipelineManagerV2Impl.newPipelineManager(
             config,
-            MockSCMHAManager.getInstance(),
+            MockSCMHAManager.getInstance(true),
             scmNodeManager,
             scmMetadataStore.getPipelineTable(),
             eventQueue);
diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineManagerImpl.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineManagerImpl.java
index 51fff06..1bff1e7 100644
--- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineManagerImpl.java
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineManagerImpl.java
@@ -28,7 +28,6 @@ import org.apache.hadoop.hdds.scm.container.ContainerID;
 import org.apache.hadoop.hdds.scm.container.MockNodeManager;
 import org.apache.hadoop.hdds.scm.exceptions.SCMException;
 import org.apache.hadoop.hdds.scm.ha.MockSCMHAManager;
-import org.apache.hadoop.hdds.scm.ha.SCMHAManager;
 import org.apache.hadoop.hdds.scm.metadata.SCMDBDefinition;
 import org.apache.hadoop.hdds.scm.safemode.SCMSafeModeManager;
 import org.apache.hadoop.hdds.scm.server.SCMDatanodeHeartbeatDispatcher;
@@ -91,15 +90,10 @@ public class TestPipelineManagerImpl {
     FileUtil.fullyDelete(testDir);
   }
 
-  private PipelineManagerV2Impl createPipelineManager(boolean leader)
+  private PipelineManagerV2Impl createPipelineManager(boolean isLeader)
       throws IOException {
-    SCMHAManager scmhaManager;
-    if (leader) {
-      scmhaManager = MockSCMHAManager.getLeaderInstance();
-    } else {
-      scmhaManager = MockSCMHAManager.getFollowerInstance();
-    }
-    return PipelineManagerV2Impl.newPipelineManager(conf, scmhaManager,
+    return PipelineManagerV2Impl.newPipelineManager(conf,
+        MockSCMHAManager.getInstance(isLeader),
         new MockNodeManager(true, 20),
         SCMDBDefinition.PIPELINES.getTable(dbStore),
         new EventQueue());
@@ -195,7 +189,8 @@ public class TestPipelineManagerImpl {
     Assert.assertTrue(pipelineManager.containsPipeline(pipeline.getId()));
     Assert.assertEquals(ALLOCATED, pipeline.getPipelineState());
     // Change to follower
-    pipelineManager.setScmhaManager(MockSCMHAManager.getFollowerInstance());
+    assert pipelineManager.getScmhaManager() instanceof MockSCMHAManager;
+    ((MockSCMHAManager) pipelineManager.getScmhaManager()).setIsLeader(false);
     try {
       pipelineManager.openPipeline(pipeline.getId());
     } catch (NotLeaderException ex) {
@@ -216,7 +211,8 @@ public class TestPipelineManagerImpl {
     Assert.assertTrue(pipelineManager.containsPipeline(pipeline.getId()));
     Assert.assertEquals(ALLOCATED, pipeline.getPipelineState());
     // Change to follower
-    pipelineManager.setScmhaManager(MockSCMHAManager.getFollowerInstance());
+    assert pipelineManager.getScmhaManager() instanceof MockSCMHAManager;
+    ((MockSCMHAManager) pipelineManager.getScmhaManager()).setIsLeader(false);
     try {
       pipelineManager.activatePipeline(pipeline.getId());
     } catch (NotLeaderException ex) {
@@ -237,7 +233,8 @@ public class TestPipelineManagerImpl {
     Assert.assertTrue(pipelineManager.containsPipeline(pipeline.getId()));
     Assert.assertEquals(ALLOCATED, pipeline.getPipelineState());
     // Change to follower
-    pipelineManager.setScmhaManager(MockSCMHAManager.getFollowerInstance());
+    assert pipelineManager.getScmhaManager() instanceof MockSCMHAManager;
+    ((MockSCMHAManager) pipelineManager.getScmhaManager()).setIsLeader(false);
     try {
       pipelineManager.deactivatePipeline(pipeline.getId());
     } catch (NotLeaderException ex) {
@@ -301,7 +298,8 @@ public class TestPipelineManagerImpl {
     Assert.assertTrue(pipelineManager.containsPipeline(pipeline.getId()));
     Assert.assertEquals(ALLOCATED, pipeline.getPipelineState());
     // Change to follower
-    pipelineManager.setScmhaManager(MockSCMHAManager.getFollowerInstance());
+    assert pipelineManager.getScmhaManager() instanceof MockSCMHAManager;
+    ((MockSCMHAManager) pipelineManager.getScmhaManager()).setIsLeader(false);
     try {
       pipelineManager.closePipeline(pipeline, false);
     } catch (NotLeaderException ex) {
@@ -494,12 +492,41 @@ public class TestPipelineManagerImpl {
     pipelineManager.close();
   }
 
-  @Test (expected = NotLeaderException.class)
+  @Test
   public void testScrubPipelineShouldFailOnFollower() throws Exception {
-    PipelineManagerV2Impl pipelineManager = createPipelineManager(false);
+    // No timeout for pipeline scrubber.
+    conf.setTimeDuration(
+        OZONE_SCM_PIPELINE_ALLOCATED_TIMEOUT, -1,
+        TimeUnit.MILLISECONDS);
+
+    PipelineManagerV2Impl pipelineManager = createPipelineManager(true);
     pipelineManager.allowPipelineCreation();
-    pipelineManager.scrubPipeline(HddsProtos.ReplicationType.RATIS,
-        HddsProtos.ReplicationFactor.THREE);
+    Pipeline pipeline = pipelineManager
+        .createPipeline(HddsProtos.ReplicationType.RATIS,
+            HddsProtos.ReplicationFactor.THREE);
+    // At this point, pipeline is not at OPEN stage.
+    Assert.assertEquals(Pipeline.PipelineState.ALLOCATED,
+        pipeline.getPipelineState());
+
+    // pipeline should be seen in pipelineManager as ALLOCATED.
+    Assert.assertTrue(pipelineManager
+        .getPipelines(HddsProtos.ReplicationType.RATIS,
+            HddsProtos.ReplicationFactor.THREE,
+            Pipeline.PipelineState.ALLOCATED).contains(pipeline));
+
+    // Change to follower
+    assert pipelineManager.getScmhaManager() instanceof MockSCMHAManager;
+    ((MockSCMHAManager) pipelineManager.getScmhaManager()).setIsLeader(false);
+
+    try {
+      pipelineManager.scrubPipeline(HddsProtos.ReplicationType.RATIS,
+          HddsProtos.ReplicationFactor.THREE);
+    } catch (NotLeaderException ex) {
+      pipelineManager.close();
+      return;
+    }
+    // Should not reach here.
+    Assert.fail();
   }
 
   @Test
diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestHealthyPipelineSafeModeRule.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestHealthyPipelineSafeModeRule.java
index 8426084..ee1f06c 100644
--- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestHealthyPipelineSafeModeRule.java
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestHealthyPipelineSafeModeRule.java
@@ -74,7 +74,7 @@ public class TestHealthyPipelineSafeModeRule {
       PipelineManagerV2Impl pipelineManager =
           PipelineManagerV2Impl.newPipelineManager(
               config,
-              MockSCMHAManager.getInstance(),
+              MockSCMHAManager.getInstance(true),
               nodeManager,
               scmMetadataStore.getPipelineTable(),
               eventQueue);
@@ -123,7 +123,7 @@ public class TestHealthyPipelineSafeModeRule {
       PipelineManagerV2Impl pipelineManager =
           PipelineManagerV2Impl.newPipelineManager(
               config,
-              MockSCMHAManager.getInstance(),
+              MockSCMHAManager.getInstance(true),
               nodeManager,
               scmMetadataStore.getPipelineTable(),
               eventQueue);
@@ -217,7 +217,7 @@ public class TestHealthyPipelineSafeModeRule {
       PipelineManagerV2Impl pipelineManager =
           PipelineManagerV2Impl.newPipelineManager(
               config,
-              MockSCMHAManager.getInstance(),
+              MockSCMHAManager.getInstance(true),
               nodeManager,
               scmMetadataStore.getPipelineTable(),
               eventQueue);
diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestOneReplicaPipelineSafeModeRule.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestOneReplicaPipelineSafeModeRule.java
index 6860da2..5e41289 100644
--- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestOneReplicaPipelineSafeModeRule.java
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestOneReplicaPipelineSafeModeRule.java
@@ -84,7 +84,7 @@ public class TestOneReplicaPipelineSafeModeRule {
 
     pipelineManager = PipelineManagerV2Impl.newPipelineManager(
         ozoneConfiguration,
-        MockSCMHAManager.getInstance(),
+        MockSCMHAManager.getInstance(true),
         mockNodeManager,
         scmMetadataStore.getPipelineTable(),
         eventQueue);
diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestSCMSafeModeManager.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestSCMSafeModeManager.java
index f081bac..7bbae4f 100644
--- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestSCMSafeModeManager.java
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestSCMSafeModeManager.java
@@ -303,7 +303,7 @@ public class TestSCMSafeModeManager {
       PipelineManager pipelineManager =
           PipelineManagerV2Impl.newPipelineManager(
               conf,
-              MockSCMHAManager.getInstance(),
+              MockSCMHAManager.getInstance(true),
               mockNodeManager,
               scmMetadataStore.getPipelineTable(),
               queue);
@@ -326,7 +326,7 @@ public class TestSCMSafeModeManager {
       PipelineManager pipelineManager =
           PipelineManagerV2Impl.newPipelineManager(
               conf,
-              MockSCMHAManager.getInstance(),
+              MockSCMHAManager.getInstance(true),
               mockNodeManager,
               scmMetadataStore.getPipelineTable(),
               queue);
@@ -348,7 +348,7 @@ public class TestSCMSafeModeManager {
       PipelineManager pipelineManager =
           PipelineManagerV2Impl.newPipelineManager(
               conf,
-              MockSCMHAManager.getInstance(),
+              MockSCMHAManager.getInstance(true),
               mockNodeManager,
               scmMetadataStore.getPipelineTable(),
               queue);
@@ -377,7 +377,7 @@ public class TestSCMSafeModeManager {
     PipelineManagerV2Impl pipelineManager =
         PipelineManagerV2Impl.newPipelineManager(
             conf,
-            MockSCMHAManager.getInstance(),
+            MockSCMHAManager.getInstance(true),
             mockNodeManager,
             scmMetadataStore.getPipelineTable(),
             queue);
@@ -627,7 +627,7 @@ public class TestSCMSafeModeManager {
       PipelineManagerV2Impl pipelineManager =
           PipelineManagerV2Impl.newPipelineManager(
               config,
-              MockSCMHAManager.getInstance(),
+              MockSCMHAManager.getInstance(true),
               nodeManager,
               scmMetadataStore.getPipelineTable(),
               queue);
@@ -690,7 +690,7 @@ public class TestSCMSafeModeManager {
     PipelineManagerV2Impl pipelineManager =
         PipelineManagerV2Impl.newPipelineManager(
             config,
-            MockSCMHAManager.getInstance(),
+            MockSCMHAManager.getInstance(true),
             nodeManager,
             scmMetadataStore.getPipelineTable(),
             queue);
diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMBlockProtocolServer.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMBlockProtocolServer.java
index f4553ab..a87dde9 100644
--- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMBlockProtocolServer.java
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMBlockProtocolServer.java
@@ -59,7 +59,7 @@ public class TestSCMBlockProtocolServer {
     File dir = GenericTestUtils.getRandomizedTestDir();
     config.set(HddsConfigKeys.OZONE_METADATA_DIRS, dir.toString());
     SCMConfigurator configurator = new SCMConfigurator();
-    configurator.setSCMHAManager(MockSCMHAManager.getInstance());
+    configurator.setSCMHAManager(MockSCMHAManager.getInstance(true));
     scm = TestUtils.getScm(config, configurator);
     scm.start();
     scm.exitSafeMode();
diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestKeyManagerImpl.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestKeyManagerImpl.java
index 0330b43..8c8ca72 100644
--- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestKeyManagerImpl.java
+++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestKeyManagerImpl.java
@@ -171,7 +171,7 @@ public class TestKeyManagerImpl {
     SCMConfigurator configurator = new SCMConfigurator();
     configurator.setScmNodeManager(nodeManager);
     configurator.setNetworkTopology(clusterMap);
-    configurator.setSCMHAManager(MockSCMHAManager.getInstance());
+    configurator.setSCMHAManager(MockSCMHAManager.getInstance(true));
     scm = TestUtils.getScm(conf, configurator);
     scm.start();
     scm.exitSafeMode();


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ozone.apache.org
For additional commands, e-mail: commits-help@ozone.apache.org