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

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


The following commit(s) were added to refs/heads/master by this push:
     new 44a6a3f  BlockManager should allocate a block in excluded pipelines if 
none other left (#19)
44a6a3f is described below

commit 44a6a3f08c1b01dbf2cba84868e37e59329b4a1d
Author: Lokesh Jain <lj...@apache.org>
AuthorDate: Tue Oct 15 17:13:33 2019 +0530

    BlockManager should allocate a block in excluded pipelines if none other 
left (#19)
---
 .../scm/container/common/helpers/ExcludeList.java  |  5 ++
 .../hadoop/hdds/scm/block/BlockManagerImpl.java    | 12 +++++
 .../hadoop/hdds/scm/block/TestBlockManager.java    | 61 +++++++++++++++++-----
 3 files changed, 66 insertions(+), 12 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/common/helpers/ExcludeList.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/common/helpers/ExcludeList.java
index eb215d6..180da40 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/common/helpers/ExcludeList.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/common/helpers/ExcludeList.java
@@ -103,6 +103,11 @@ public class ExcludeList {
     return excludeList;
   }
 
+  public boolean isEmpty() {
+    return datanodes.isEmpty() && containerIds.isEmpty() && pipelineIds
+        .isEmpty();
+  }
+
   public void clear() {
     datanodes.clear();
     containerIds.clear();
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
index 4c182c3..845bdf1 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
@@ -185,6 +185,12 @@ public class BlockManagerImpl implements BlockManager, 
BlockmanagerMXBean {
               .getPipelines(type, factor, Pipeline.PipelineState.OPEN,
                   excludeList.getDatanodes(), excludeList.getPipelineIds());
       Pipeline pipeline = null;
+      if (availablePipelines.size() == 0 && !excludeList.isEmpty()) {
+        // if no pipelines can be found, try finding pipeline without
+        // exclusion
+        availablePipelines = pipelineManager
+            .getPipelines(type, factor, Pipeline.PipelineState.OPEN);
+      }
       if (availablePipelines.size() == 0) {
         try {
           // TODO: #CLUTIL Remove creation logic when all replication types and
@@ -196,6 +202,12 @@ public class BlockManagerImpl implements BlockManager, 
BlockmanagerMXBean {
           availablePipelines = pipelineManager
               .getPipelines(type, factor, Pipeline.PipelineState.OPEN,
                   excludeList.getDatanodes(), excludeList.getPipelineIds());
+          if (availablePipelines.size() == 0 && !excludeList.isEmpty()) {
+            // if no pipelines can be found, try finding pipeline without
+            // exclusion
+            availablePipelines = pipelineManager
+                .getPipelines(type, factor, Pipeline.PipelineState.OPEN);
+          }
           if (availablePipelines.size() == 0) {
             LOG.info("Could not find available pipeline of type:{} and " +
                 "factor:{} even after retrying", type, factor);
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 e5c4766..ae8aee9 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
@@ -40,7 +40,9 @@ import 
org.apache.hadoop.hdds.scm.container.common.helpers.AllocatedBlock;
 import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList;
 import org.apache.hadoop.hdds.scm.events.SCMEvents;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
-import org.apache.hadoop.hdds.scm.pipeline.PipelineManager;
+import org.apache.hadoop.hdds.scm.pipeline.PipelineProvider;
+import org.apache.hadoop.hdds.scm.pipeline.MockRatisPipelineProvider;
+import org.apache.hadoop.hdds.scm.pipeline.SCMPipelineManager;
 import org.apache.hadoop.hdds.scm.server.SCMConfigurator;
 import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
 import org.apache.hadoop.hdds.server.events.EventQueue;
@@ -65,7 +67,7 @@ public class TestBlockManager {
   private StorageContainerManager scm;
   private SCMContainerManager mapping;
   private MockNodeManager nodeManager;
-  private PipelineManager pipelineManager;
+  private SCMPipelineManager pipelineManager;
   private BlockManagerImpl blockManager;
   private File testDir;
   private final static long DEFAULT_BLOCK_SIZE = 128 * MB;
@@ -95,13 +97,20 @@ public class TestBlockManager {
 
     // Override the default Node Manager in SCM with this Mock Node Manager.
     nodeManager = new MockNodeManager(true, 10);
+    pipelineManager =
+        new SCMPipelineManager(conf, nodeManager, new EventQueue(), null);
+    PipelineProvider mockRatisProvider =
+        new MockRatisPipelineProvider(nodeManager,
+            pipelineManager.getStateManager(), conf);
+    pipelineManager.setPipelineProvider(HddsProtos.ReplicationType.RATIS,
+        mockRatisProvider);
     SCMConfigurator configurator = new SCMConfigurator();
     configurator.setScmNodeManager(nodeManager);
+    configurator.setPipelineManager(pipelineManager);
     scm = TestUtils.getScm(conf, configurator);
 
     // Initialize these fields so that the tests can pass.
     mapping = (SCMContainerManager) scm.getContainerManager();
-    pipelineManager = scm.getPipelineManager();
     blockManager = (BlockManagerImpl) scm.getScmBlockManager();
 
     eventQueue = new EventQueue();
@@ -112,14 +121,8 @@ public class TestBlockManager {
     CloseContainerEventHandler closeContainerHandler =
         new CloseContainerEventHandler(pipelineManager, mapping);
     eventQueue.addHandler(SCMEvents.CLOSE_CONTAINER, closeContainerHandler);
-    if(conf.getBoolean(ScmConfigKeys.DFS_CONTAINER_RATIS_ENABLED_KEY,
-        ScmConfigKeys.DFS_CONTAINER_RATIS_ENABLED_DEFAULT)){
-      factor = HddsProtos.ReplicationFactor.THREE;
-      type = HddsProtos.ReplicationType.RATIS;
-    } else {
-      factor = HddsProtos.ReplicationFactor.ONE;
-      type = HddsProtos.ReplicationType.STAND_ALONE;
-    }
+    factor = HddsProtos.ReplicationFactor.THREE;
+    type = HddsProtos.ReplicationType.RATIS;
   }
 
   @After
@@ -139,6 +142,39 @@ public class TestBlockManager {
   }
 
   @Test
+  public void testAllocateBlockWithExclusion() throws Exception {
+    eventQueue.fireEvent(SCMEvents.SAFE_MODE_STATUS, safeModeStatus);
+    GenericTestUtils.waitFor(() -> {
+      return !blockManager.isScmInSafeMode();
+    }, 10, 1000 * 5);
+    try {
+      while (true) {
+        pipelineManager.createPipeline(type, factor);
+      }
+    } catch (IOException e) {
+    }
+    ExcludeList excludeList = new ExcludeList();
+    excludeList
+        .addPipeline(pipelineManager.getPipelines(type, 
factor).get(0).getId());
+    AllocatedBlock block = blockManager
+        .allocateBlock(DEFAULT_BLOCK_SIZE, type, factor, containerOwner,
+            excludeList);
+    Assert.assertNotNull(block);
+    Assert.assertNotEquals(block.getPipeline().getId(),
+        excludeList.getPipelineIds().get(0));
+
+    for (Pipeline pipeline : pipelineManager.getPipelines(type, factor)) {
+      excludeList.addPipeline(pipeline.getId());
+    }
+    block = blockManager
+        .allocateBlock(DEFAULT_BLOCK_SIZE, type, factor, containerOwner,
+            excludeList);
+    Assert.assertNotNull(block);
+    Assert.assertTrue(
+        excludeList.getPipelineIds().contains(block.getPipeline().getId()));
+  }
+
+  @Test
   public void testAllocateBlockInParallel() throws Exception {
     eventQueue.fireEvent(SCMEvents.SAFE_MODE_STATUS, safeModeStatus);
     GenericTestUtils.waitFor(() -> {
@@ -264,7 +300,8 @@ public class TestBlockManager {
 
     // create pipelines
     for (int i = 0;
-         i < nodeManager.getNodes(HddsProtos.NodeState.HEALTHY).size(); i++) {
+         i < nodeManager.getNodes(HddsProtos.NodeState.HEALTHY).size() / factor
+             .getNumber(); i++) {
       pipelineManager.createPipeline(type, factor);
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: hdfs-commits-unsubscr...@hadoop.apache.org
For additional commands, e-mail: hdfs-commits-h...@hadoop.apache.org

Reply via email to