You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by na...@apache.org on 2019/03/13 12:01:10 UTC
[hadoop] branch ozone-0.4 updated: HDDS-1209. Fix the block
allocation logic in SCM when client wants to exclude all available open
containers in a chosen pipeline.
This is an automated email from the ASF dual-hosted git repository.
nanda pushed a commit to branch ozone-0.4
in repository https://gitbox.apache.org/repos/asf/hadoop.git
The following commit(s) were added to refs/heads/ozone-0.4 by this push:
new 34f0ad0 HDDS-1209. Fix the block allocation logic in SCM when client wants to exclude all available open containers in a chosen pipeline.
34f0ad0 is described below
commit 34f0ad064d487a053baa275e8adacbcf8a927eed
Author: Aravindan Vijayan <av...@apache.org>
AuthorDate: Wed Mar 13 17:12:43 2019 +0530
HDDS-1209. Fix the block allocation logic in SCM when client wants to exclude all available open containers in a chosen pipeline.
Signed-off-by: Nanda kumar <na...@apache.org>
(cherry picked from commit 1f47fb7a2fa9bfb9fd2a7ca5c9f1128fabc32784)
---
.../hadoop/hdds/scm/block/BlockManagerImpl.java | 20 ++------
.../hdds/scm/container/ContainerManager.java | 11 +++++
.../hdds/scm/container/SCMContainerManager.java | 7 +++
.../TestContainerStateManagerIntegration.java | 55 ++++++++++++++++++++++
4 files changed, 77 insertions(+), 16 deletions(-)
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 0e4bb50..d285afd 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
@@ -35,7 +35,6 @@ import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ScmOps;
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
import org.apache.hadoop.hdds.scm.ScmUtils;
import org.apache.hadoop.hdds.scm.chillmode.ChillModePrecheck;
-import org.apache.hadoop.hdds.scm.container.ContainerID;
import org.apache.hadoop.hdds.scm.container.ContainerInfo;
import org.apache.hadoop.hdds.scm.container.ContainerManager;
import org.apache.hadoop.hdds.scm.container.common.helpers.AllocatedBlock;
@@ -62,7 +61,6 @@ import static org.apache.hadoop.ozone.OzoneConfigKeys
.OZONE_BLOCK_DELETING_SERVICE_TIMEOUT;
import static org.apache.hadoop.ozone.OzoneConfigKeys
.OZONE_BLOCK_DELETING_SERVICE_TIMEOUT_DEFAULT;
-import java.util.function.Predicate;
/** Block Manager manages the block access for SCM. */
@@ -203,15 +201,10 @@ public class BlockManagerImpl implements EventHandler<Boolean>,
}
// look for OPEN containers that match the criteria.
- containerInfo = containerManager
- .getMatchingContainer(size, owner, pipeline);
-
- // TODO: if getMachingContainer results in containers which are in exclude
- // list, we may end up in this loop forever. This case needs to be
- // addressed.
- if (containerInfo != null && (excludeList.getContainerIds() == null
- || !discardContainer(containerInfo.containerID(),
- excludeList.getContainerIds()))) {
+ containerInfo = containerManager.getMatchingContainer(size, owner,
+ pipeline, excludeList.getContainerIds());
+
+ if (containerInfo != null) {
return newBlock(containerInfo);
}
}
@@ -224,11 +217,6 @@ public class BlockManagerImpl implements EventHandler<Boolean>,
return null;
}
- private boolean discardContainer(ContainerID containerId,
- List<ContainerID> containers) {
- Predicate<ContainerID> predicate = p -> p.equals(containerId);
- return containers.parallelStream().anyMatch(predicate);
- }
/**
* newBlock - returns a new block assigned to a container.
*
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManager.java
index 4691ea7..b2fe4b4 100644
--- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManager.java
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManager.java
@@ -152,4 +152,15 @@ public interface ContainerManager extends Closeable {
*/
ContainerInfo getMatchingContainer(long size, String owner,
Pipeline pipeline);
+
+ /**
+ * Returns ContainerInfo which matches the requirements.
+ * @param size - the amount of space required in the container
+ * @param owner - the user which requires space in its owned container
+ * @param pipeline - pipeline to which the container should belong.
+ * @param excludedContainerIDS - containerIds to be excluded.
+ * @return ContainerInfo for the matching container.
+ */
+ ContainerInfo getMatchingContainer(long size, String owner,
+ Pipeline pipeline, List<ContainerID> excludedContainerIDS);
}
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/SCMContainerManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/SCMContainerManager.java
index 96c54f3..374772d 100644
--- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/SCMContainerManager.java
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/SCMContainerManager.java
@@ -353,6 +353,12 @@ public class SCMContainerManager implements ContainerManager {
*/
public ContainerInfo getMatchingContainer(final long sizeRequired,
String owner, Pipeline pipeline) {
+ return getMatchingContainer(sizeRequired, owner, pipeline, Collections
+ .emptyList());
+ }
+
+ public ContainerInfo getMatchingContainer(final long sizeRequired,
+ String owner, Pipeline pipeline, List<ContainerID> excludedContainers) {
try {
//TODO: #CLUTIL See if lock is required here
NavigableSet<ContainerID> containerIDs =
@@ -378,6 +384,7 @@ public class SCMContainerManager implements ContainerManager {
}
}
+ containerIDs.removeAll(excludedContainers);
ContainerInfo containerInfo =
containerStateManager.getMatchingContainer(sizeRequired, owner,
pipeline.getId(), containerIDs);
diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerStateManagerIntegration.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerStateManagerIntegration.java
index 46c6e18..add278c 100644
--- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerStateManagerIntegration.java
+++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerStateManagerIntegration.java
@@ -16,6 +16,8 @@
*/
package org.apache.hadoop.hdds.scm.container;
+import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.NavigableSet;
@@ -196,6 +198,59 @@ public class TestContainerStateManagerIntegration {
}
@Test
+ public void testGetMatchingContainerWithExcludedList() throws IOException {
+ long cid;
+ ContainerWithPipeline container1 = scm.getClientProtocolServer().
+ allocateContainer(xceiverClientManager.getType(),
+ xceiverClientManager.getFactor(), containerOwner);
+ cid = container1.getContainerInfo().getContainerID();
+
+ // each getMatchingContainer call allocates a container in the
+ // pipeline till the pipeline has numContainerPerOwnerInPipeline number of
+ // containers.
+ for (int i = 1; i < numContainerPerOwnerInPipeline; i++) {
+ ContainerInfo info = containerManager
+ .getMatchingContainer(OzoneConsts.GB * 3, containerOwner,
+ container1.getPipeline());
+ Assert.assertTrue(info.getContainerID() > cid);
+ cid = info.getContainerID();
+ }
+
+ // At this point there are already three containers in the pipeline.
+ // next container should be the same as first container
+ ContainerInfo info = containerManager
+ .getMatchingContainer(OzoneConsts.GB * 3, containerOwner,
+ container1.getPipeline(), Collections.singletonList(new
+ ContainerID(1)));
+ Assert.assertNotEquals(container1.getContainerInfo().getContainerID(),
+ info.getContainerID());
+ }
+
+
+ @Test
+ public void testCreateContainerLogicWithExcludedList() throws IOException {
+ long cid;
+ ContainerWithPipeline container1 = scm.getClientProtocolServer().
+ allocateContainer(xceiverClientManager.getType(),
+ xceiverClientManager.getFactor(), containerOwner);
+ cid = container1.getContainerInfo().getContainerID();
+
+ for (int i = 1; i < numContainerPerOwnerInPipeline; i++) {
+ ContainerInfo info = containerManager
+ .getMatchingContainer(OzoneConsts.GB * 3, containerOwner,
+ container1.getPipeline());
+ Assert.assertTrue(info.getContainerID() > cid);
+ cid = info.getContainerID();
+ }
+
+ ContainerInfo info = containerManager
+ .getMatchingContainer(OzoneConsts.GB * 3, containerOwner,
+ container1.getPipeline(), Arrays.asList(new ContainerID(1), new
+ ContainerID(2), new ContainerID(3)));
+ Assert.assertEquals(info.getContainerID(), 4);
+ }
+
+ @Test
@Ignore("TODO:HDDS-1159")
public void testGetMatchingContainerMultipleThreads()
throws IOException, InterruptedException {
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org