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

adoroszlai 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 5d5eb45d14 Revert "HDDS-9151. Close EC Pipeline when container 
transitions to closing (#5191)" (#5270)
5d5eb45d14 is described below

commit 5d5eb45d14952056faaf2150db273a2f152ff867
Author: Stephen O'Donnell <[email protected]>
AuthorDate: Tue Sep 12 15:24:08 2023 +0100

    Revert "HDDS-9151. Close EC Pipeline when container transitions to closing 
(#5191)" (#5270)
    
    This reverts commit 77dc4dbf00b609610b55b3df28839d77804e3956.
---
 .../hdds/scm/container/ContainerManagerImpl.java   | 51 ++++++++----------
 .../hdds/scm/pipeline/PipelineManagerImpl.java     | 23 +-------
 .../hdds/scm/pipeline/TestPipelineManagerImpl.java | 61 ++--------------------
 3 files changed, 27 insertions(+), 108 deletions(-)

diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java
index b0e8b986fc..34604edb3b 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java
@@ -172,27 +172,24 @@ public class ContainerManagerImpl implements 
ContainerManager {
   public ContainerInfo allocateContainer(
       final ReplicationConfig replicationConfig, final String owner)
       throws IOException {
+    // Acquire pipeline manager lock, to avoid any updates to pipeline
+    // while allocate container happens. This is to avoid scenario like
+    // mentioned in HDDS-5655.
+    pipelineManager.acquireReadLock();
+    lock.lock();
     List<Pipeline> pipelines;
     Pipeline pipeline;
     ContainerInfo containerInfo = null;
-    lock.lock();
     try {
-      // Acquire pipeline manager lock, to avoid any updates to pipeline
-      // while allocate container happens. This is to avoid scenario like
-      // mentioned in HDDS-5655.
-      pipelineManager.acquireReadLock();
-      try {
-        pipelines = pipelineManager
-            .getPipelines(replicationConfig, Pipeline.PipelineState.OPEN);
-        if (!pipelines.isEmpty()) {
-          pipeline = pipelines.get(random.nextInt(pipelines.size()));
-          containerInfo = createContainer(pipeline, owner);
-        }
-      } finally {
-        pipelineManager.releaseReadLock();
+      pipelines = pipelineManager
+          .getPipelines(replicationConfig, Pipeline.PipelineState.OPEN);
+      if (!pipelines.isEmpty()) {
+        pipeline = pipelines.get(random.nextInt(pipelines.size()));
+        containerInfo = createContainer(pipeline, owner);
       }
     } finally {
       lock.unlock();
+      pipelineManager.releaseReadLock();
     }
 
     if (pipelines.isEmpty()) {
@@ -205,26 +202,22 @@ public class ContainerManagerImpl implements 
ContainerManager {
             " matching pipeline for replicationConfig: " + replicationConfig
             + ", State:PipelineState.OPEN", e);
       }
-
+      pipelineManager.acquireReadLock();
       lock.lock();
       try {
-        pipelineManager.acquireReadLock();
-        try {
-          pipelines = pipelineManager
-              .getPipelines(replicationConfig, Pipeline.PipelineState.OPEN);
-          if (!pipelines.isEmpty()) {
-            pipeline = pipelines.get(random.nextInt(pipelines.size()));
-            containerInfo = createContainer(pipeline, owner);
-          } else {
-            throw new IOException("Could not allocate container. Cannot get " +
-                " any matching pipeline for replicationConfig: " +
-                replicationConfig + ", State:PipelineState.OPEN");
-          }
-        } finally {
-          pipelineManager.releaseReadLock();
+        pipelines = pipelineManager
+            .getPipelines(replicationConfig, Pipeline.PipelineState.OPEN);
+        if (!pipelines.isEmpty()) {
+          pipeline = pipelines.get(random.nextInt(pipelines.size()));
+          containerInfo = createContainer(pipeline, owner);
+        } else {
+          throw new IOException("Could not allocate container. Cannot get any" 
+
+              " matching pipeline for replicationConfig: " + replicationConfig
+              + ", State:PipelineState.OPEN");
         }
       } finally {
         lock.unlock();
+        pipelineManager.releaseReadLock();
       }
     }
     return containerInfo;
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerImpl.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerImpl.java
index 470491379e..d5cb5504eb 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerImpl.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerImpl.java
@@ -400,27 +400,8 @@ public class PipelineManagerImpl implements 
PipelineManager {
   @Override
   public void removeContainerFromPipeline(
       PipelineID pipelineID, ContainerID containerID) throws IOException {
-    acquireWriteLock();
-    try {
-      Pipeline pipeline = stateManager.getPipeline(pipelineID);
-      stateManager.removeContainerFromPipeline(pipelineID, containerID);
-      if (pipeline.getReplicationConfig().getReplicationType()
-          == ReplicationType.EC) {
-        // For EC, a pipeline is used for only a single container. When that
-        // container is closed or removed from the pipeline, the pipeline 
should
-        // also be closed. For EC, if a pipeline had a container and then the
-        // container is removed via this method, the pipeline is no longer
-        // useful - nothing will allocate a new container on it. Therefore, we
-        // close the pipeline here to free up the pipeline slot for a new
-        // pipeline to get created
-        closePipeline(pipeline, true);
-      }
-    } catch (PipelineNotFoundException e) {
-      LOG.warn("Pipeline {} not found when removing container {}",
-          pipelineID, containerID, e);
-    } finally {
-      releaseWriteLock();
-    }
+    // should not lock here, since no ratis operation happens.
+    stateManager.removeContainerFromPipeline(pipelineID, containerID);
   }
 
   @Override
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 ea6d13b183..33243b650e 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
@@ -87,7 +87,6 @@ import static 
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_DATANODE_PIPELINE_L
 import static 
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_DATANODE_PIPELINE_LIMIT_DEFAULT;
 import static 
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_PIPELINE_ALLOCATED_TIMEOUT;
 import static 
org.apache.hadoop.hdds.scm.pipeline.Pipeline.PipelineState.ALLOCATED;
-import static 
org.apache.hadoop.hdds.scm.pipeline.Pipeline.PipelineState.CLOSED;
 import static org.apache.hadoop.hdds.scm.pipeline.Pipeline.PipelineState.OPEN;
 import static org.apache.hadoop.test.MetricsAsserts.getLongCounter;
 import static org.apache.hadoop.test.MetricsAsserts.getMetrics;
@@ -353,60 +352,6 @@ public class TestPipelineManagerImpl {
     }
   }
 
-  @Test
-  public void testRemoveContainerFromPipeline() throws Exception {
-    try (PipelineManagerImpl pipelineManager = createPipelineManager(true)) {
-      Pipeline ratisPipeline =  pipelineManager.createPipeline(
-          RatisReplicationConfig.getInstance(ReplicationFactor.THREE));
-      pipelineManager.openPipeline(ratisPipeline.getId());
-      ECReplicationConfig ecRepConfig = new ECReplicationConfig(3, 2);
-      Pipeline ecPipeline = pipelineManager.createPipeline(ecRepConfig);
-      pipelineManager.openPipeline(ecPipeline.getId());
-
-      ContainerInfo ratisContainerInfo = HddsTestUtils.
-          getContainer(HddsProtos.LifeCycleState.OPEN, ratisPipeline.getId());
-      ContainerInfo ecContainerInfo = HddsTestUtils.getECContainer(
-          HddsProtos.LifeCycleState.OPEN, ecPipeline.getId(), ecRepConfig);
-
-      pipelineManager.addContainerToPipeline(ratisPipeline.getId(),
-          ratisContainerInfo.containerID());
-      pipelineManager.addContainerToPipeline(ecPipeline.getId(),
-          ecContainerInfo.containerID());
-
-      List<Pipeline> ratisPipelines = pipelineManager.getPipelines(
-          RatisReplicationConfig.getInstance(ReplicationFactor.THREE),
-          Pipeline.PipelineState.OPEN);
-
-      List<Pipeline> ecPipelines = pipelineManager.getPipelines(
-          ecRepConfig, Pipeline.PipelineState.OPEN);
-
-      // Background pipeline creator could create additional Ratis pipelines,
-      // so an equals check may not work. EC pipelines are created on demand,
-      // so an equals check is fine.
-      Assertions.assertTrue(ratisPipelines.contains(ratisPipeline));
-      Assertions.assertEquals(1, ecPipelines.size());
-
-      // Ensure both pipelines have a single container
-      Assertions.assertEquals(1, pipelineManager
-          .getContainersInPipeline(ratisPipeline.getId()).size());
-      Assertions.assertEquals(1, pipelineManager
-          .getContainersInPipeline(ecPipeline.getId()).size());
-
-      // Remove the container from the Ratis pipeline - this should leave the
-      // pipeline in the OPEN state
-      pipelineManager.removeContainerFromPipeline(ratisPipeline.getId(),
-          ratisContainerInfo.containerID());
-      Assertions.assertEquals(OPEN, pipelineManager
-          .getPipeline(ratisPipeline.getId()).getPipelineState());
-
-      // Removing from the EC pipeline should trigger the pipeline to close.
-      pipelineManager.removeContainerFromPipeline(ecPipeline.getId(),
-          ecContainerInfo.containerID());
-      Assertions.assertEquals(CLOSED, pipelineManager
-          .getPipeline(ecPipeline.getId()).getPipelineState());
-    }
-  }
-
   @Test
   public void testClosePipelineShouldFailOnFollower() throws Exception {
     try (PipelineManagerImpl pipelineManager = createPipelineManager(true)) {
@@ -594,7 +539,7 @@ public class TestPipelineManagerImpl {
     Assertions.assertTrue(pipelineManager
         .getPipelines(RatisReplicationConfig
                 .getInstance(ReplicationFactor.THREE),
-            CLOSED).contains(closedPipeline));
+            Pipeline.PipelineState.CLOSED).contains(closedPipeline));
 
     // Set the clock to "now". All pipelines were created before this.
     testClock.set(Instant.now());
@@ -612,7 +557,7 @@ public class TestPipelineManagerImpl {
     Assertions.assertFalse(pipelineManager
         .getPipelines(RatisReplicationConfig
                 .getInstance(ReplicationFactor.THREE),
-            CLOSED).contains(closedPipeline));
+            Pipeline.PipelineState.CLOSED).contains(closedPipeline));
 
     testClock.fastForward((60000));
 
@@ -647,7 +592,7 @@ public class TestPipelineManagerImpl {
 
     pipelineManager.scrubPipelines();
     pipeline = pipelineManager.getPipeline(pipeline.getId());
-    Assertions.assertEquals(CLOSED,
+    Assertions.assertEquals(Pipeline.PipelineState.CLOSED,
         pipeline.getPipelineState());
   }
 


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

Reply via email to