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