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

siddhant 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 dd952d4aae HDDS-8008. Move pendingOps into ContainerStateManagerImpl 
to ensure consistent state (#4298)
dd952d4aae is described below

commit dd952d4aaeb41a665c7b8a808abdaca5050219c6
Author: Stephen O'Donnell <[email protected]>
AuthorDate: Mon Feb 27 06:36:04 2023 +0000

    HDDS-8008. Move pendingOps into ContainerStateManagerImpl to ensure 
consistent state (#4298)
---
 .../hdds/scm/container/ContainerManagerImpl.java   | 13 +--------
 .../scm/container/ContainerStateManagerImpl.java   | 33 ++++++++++++++++++----
 .../scm/container/TestContainerReportHandler.java  |  5 ++++
 .../scm/container/TestContainerStateManager.java   |  5 ++++
 .../TestIncrementalContainerReportHandler.java     |  5 ++++
 .../replication/TestLegacyReplicationManager.java  |  3 ++
 6 files changed, 47 insertions(+), 17 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 a3281efcf2..a4d6f36c59 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
@@ -85,10 +85,6 @@ public class ContainerManagerImpl implements 
ContainerManager {
 
   @SuppressWarnings("java:S2245") // no need for secure random
   private final Random random = new Random();
-  // Used to track pending replication and delete for container replicas. In
-  // ContainerManager, we try to remove any replicas we see added or deleted
-  // in case they have been created by replication / delete command
-  private final ContainerReplicaPendingOps containerReplicaPendingOps;
 
   /**
    *
@@ -112,6 +108,7 @@ public class ContainerManagerImpl implements 
ContainerManager {
         .setRatisServer(scmHaManager.getRatisServer())
         .setContainerStore(containerStore)
         .setSCMDBTransactionBuffer(scmHaManager.getDBTransactionBuffer())
+        .setContainerReplicaPendingOps(containerReplicaPendingOps)
         .build();
 
     this.numContainerPerVolume = conf
@@ -119,7 +116,6 @@ public class ContainerManagerImpl implements 
ContainerManager {
             ScmConfigKeys.OZONE_SCM_PIPELINE_OWNER_CONTAINER_COUNT_DEFAULT);
 
     this.scmContainerManagerMetrics = SCMContainerManagerMetrics.create();
-    this.containerReplicaPendingOps = containerReplicaPendingOps;
   }
 
   @Override
@@ -332,9 +328,6 @@ public class ContainerManagerImpl implements 
ContainerManager {
       throws ContainerNotFoundException {
     if (containerExist(cid)) {
       containerStateManager.updateContainerReplica(cid, replica);
-      // Clear any pending additions for this replica as we have now seen it.
-      containerReplicaPendingOps.completeAddReplica(cid,
-          replica.getDatanodeDetails(), replica.getReplicaIndex());
     } else {
       throwContainerNotFoundException(cid);
     }
@@ -346,10 +339,6 @@ public class ContainerManagerImpl implements 
ContainerManager {
       throws ContainerNotFoundException, ContainerReplicaNotFoundException {
     if (containerExist(cid)) {
       containerStateManager.removeContainerReplica(cid, replica);
-      // Remove any pending delete replication operations for the deleted
-      // replica.
-      containerReplicaPendingOps.completeDeleteReplica(cid,
-          replica.getDatanodeDetails(), replica.getReplicaIndex());
     } else {
       throwContainerNotFoundException(cid);
     }
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java
index 3f83d89c04..f79542885a 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java
@@ -38,6 +38,7 @@ import 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleEvent;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleState;
 import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType;
 import org.apache.hadoop.hdds.scm.ScmConfigKeys;
+import 
org.apache.hadoop.hdds.scm.container.replication.ContainerReplicaPendingOps;
 import org.apache.hadoop.hdds.scm.container.states.ContainerState;
 import org.apache.hadoop.hdds.scm.container.states.ContainerStateMap;
 import org.apache.hadoop.hdds.scm.ha.CheckedConsumer;
@@ -122,6 +123,13 @@ public final class ContainerStateManagerImpl
    */
   private final StateMachine<LifeCycleState, LifeCycleEvent> stateMachine;
 
+  /**
+   * Pending Ops table used by Replication Manager to track pending moves. As
+   * replicas are added or removed, we make a call to the pendingOps object to
+   * mark the pending operations as completed.
+   */
+  private final ContainerReplicaPendingOps containerReplicaPendingOps;
+
   /**
    * We use the containers in round-robin fashion for operations like block
    * allocation. This map is used for remembering the last used container.
@@ -147,8 +155,8 @@ public final class ContainerStateManagerImpl
   private ContainerStateManagerImpl(final Configuration conf,
       final PipelineManager pipelineManager,
       final Table<ContainerID, ContainerInfo> containerStore,
-      final DBTransactionBuffer buffer)
-      throws IOException {
+      final DBTransactionBuffer buffer,
+      final ContainerReplicaPendingOps pendingOps) throws IOException {
     this.confSrc = OzoneConfiguration.of(conf);
     this.pipelineManager = pipelineManager;
     this.containerStore = containerStore;
@@ -160,6 +168,7 @@ public final class ContainerStateManagerImpl
     this.transactionBuffer = buffer;
     this.lockManager =
         new LockManager<>(confSrc, true);
+    this.containerReplicaPendingOps = pendingOps;
     initialize();
   }
 
@@ -402,6 +411,9 @@ public final class ContainerStateManagerImpl
     lockManager.writeLock(id);
     try {
       containers.updateContainerReplica(id, replica);
+      // Clear any pending additions for this replica as we have now seen it.
+      containerReplicaPendingOps.completeAddReplica(id,
+          replica.getDatanodeDetails(), replica.getReplicaIndex());
     } finally {
       lockManager.writeUnlock(id);
     }
@@ -412,8 +424,11 @@ public final class ContainerStateManagerImpl
                                      final ContainerReplica replica) {
     lockManager.writeLock(id);
     try {
-      containers.removeContainerReplica(id,
-          replica);
+      containers.removeContainerReplica(id, replica);
+      // Remove any pending delete replication operations for the deleted
+      // replica.
+      containerReplicaPendingOps.completeDeleteReplica(id,
+          replica.getDatanodeDetails(), replica.getReplicaIndex());
     } finally {
       lockManager.writeUnlock(id);
     }
@@ -562,6 +577,7 @@ public final class ContainerStateManagerImpl
     private SCMRatisServer scmRatisServer;
     private Table<ContainerID, ContainerInfo> table;
     private DBTransactionBuffer transactionBuffer;
+    private ContainerReplicaPendingOps containerReplicaPendingOps;
 
     public Builder setSCMDBTransactionBuffer(DBTransactionBuffer buffer) {
       this.transactionBuffer = buffer;
@@ -588,13 +604,20 @@ public final class ContainerStateManagerImpl
       return this;
     }
 
+    public Builder setContainerReplicaPendingOps(
+        final ContainerReplicaPendingOps pendingOps) {
+      containerReplicaPendingOps = pendingOps;
+      return this;
+    }
+
     public ContainerStateManager build() throws IOException {
       Preconditions.checkNotNull(conf);
       Preconditions.checkNotNull(pipelineMgr);
       Preconditions.checkNotNull(table);
 
       final ContainerStateManager csm = new ContainerStateManagerImpl(
-          conf, pipelineMgr, table, transactionBuffer);
+          conf, pipelineMgr, table, transactionBuffer,
+          containerReplicaPendingOps);
 
       final SCMHAInvocationHandler invocationHandler =
           new SCMHAInvocationHandler(RequestType.CONTAINER, csm,
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerReportHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerReportHandler.java
index a48f3470a3..469b1ddf24 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerReportHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerReportHandler.java
@@ -29,6 +29,7 @@ import org.apache.hadoop.hdds.protocol.proto
 import org.apache.hadoop.hdds.protocol.proto
     .StorageContainerDatanodeProtocolProtos.ContainerReplicaProto;
 import org.apache.hadoop.hdds.scm.HddsTestUtils;
+import 
org.apache.hadoop.hdds.scm.container.replication.ContainerReplicaPendingOps;
 import org.apache.hadoop.hdds.scm.ha.SCMHAManagerStub;
 import org.apache.hadoop.hdds.scm.ha.SCMHAManager;
 import org.apache.hadoop.hdds.scm.metadata.SCMDBDefinition;
@@ -57,6 +58,8 @@ import org.mockito.Mockito;
 
 import java.io.File;
 import java.io.IOException;
+import java.time.Clock;
+import java.time.ZoneId;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -106,6 +109,8 @@ public class TestContainerReportHandler {
         .setRatisServer(scmhaManager.getRatisServer())
         .setContainerStore(SCMDBDefinition.CONTAINERS.getTable(dbStore))
         .setSCMDBTransactionBuffer(scmhaManager.getDBTransactionBuffer())
+        .setContainerReplicaPendingOps(new ContainerReplicaPendingOps(
+            conf, Clock.system(ZoneId.systemDefault())))
         .build();
     publisher = Mockito.mock(EventPublisher.class);
 
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerStateManager.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerStateManager.java
index e731e90b33..1b5f6a3f00 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerStateManager.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerStateManager.java
@@ -19,6 +19,8 @@ package org.apache.hadoop.hdds.scm.container;
 
 import java.io.File;
 import java.io.IOException;
+import java.time.Clock;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Set;
 import java.util.UUID;
@@ -35,6 +37,7 @@ import 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor;
 import org.apache.hadoop.hdds.protocol.proto
     .StorageContainerDatanodeProtocolProtos.ContainerReplicaProto;
 
+import 
org.apache.hadoop.hdds.scm.container.replication.ContainerReplicaPendingOps;
 import org.apache.hadoop.hdds.scm.ha.SCMHAManagerStub;
 import org.apache.hadoop.hdds.scm.ha.SCMHAManager;
 import org.apache.hadoop.hdds.scm.metadata.SCMDBDefinition;
@@ -92,6 +95,8 @@ public class TestContainerStateManager {
         .setRatisServer(scmhaManager.getRatisServer())
         .setContainerStore(SCMDBDefinition.CONTAINERS.getTable(dbStore))
         .setSCMDBTransactionBuffer(scmhaManager.getDBTransactionBuffer())
+        .setContainerReplicaPendingOps(new ContainerReplicaPendingOps(
+            conf, Clock.system(ZoneId.systemDefault())))
         .build();
 
   }
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestIncrementalContainerReportHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestIncrementalContainerReportHandler.java
index 47b932a12e..c7928b21d2 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestIncrementalContainerReportHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestIncrementalContainerReportHandler.java
@@ -30,6 +30,7 @@ import org.apache.hadoop.hdds.protocol.proto
 import org.apache.hadoop.hdds.protocol.proto
     .StorageContainerDatanodeProtocolProtos.IncrementalContainerReportProto;
 import org.apache.hadoop.hdds.scm.HddsTestUtils;
+import 
org.apache.hadoop.hdds.scm.container.replication.ContainerReplicaPendingOps;
 import org.apache.hadoop.hdds.scm.ha.SCMHAManagerStub;
 import org.apache.hadoop.hdds.scm.ha.SCMContext;
 import org.apache.hadoop.hdds.scm.ha.SCMHAManager;
@@ -64,6 +65,8 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.time.Clock;
+import java.time.ZoneId;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -136,6 +139,8 @@ public class TestIncrementalContainerReportHandler {
         .setRatisServer(scmhaManager.getRatisServer())
         .setContainerStore(SCMDBDefinition.CONTAINERS.getTable(dbStore))
         .setSCMDBTransactionBuffer(scmhaManager.getDBTransactionBuffer())
+        .setContainerReplicaPendingOps(new ContainerReplicaPendingOps(
+            conf, Clock.system(ZoneId.systemDefault())))
         .build();
 
     this.publisher = Mockito.mock(EventPublisher.class);
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestLegacyReplicationManager.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestLegacyReplicationManager.java
index eb1e8c97ea..6afb362611 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestLegacyReplicationManager.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestLegacyReplicationManager.java
@@ -78,6 +78,7 @@ import org.mockito.Mockito;
 
 import java.io.File;
 import java.io.IOException;
+import java.time.Clock;
 import java.time.Instant;
 import java.time.ZoneId;
 import java.util.ArrayList;
@@ -172,6 +173,8 @@ public class TestLegacyReplicationManager {
         .setRatisServer(scmhaManager.getRatisServer())
         .setContainerStore(SCMDBDefinition.CONTAINERS.getTable(dbStore))
         .setSCMDBTransactionBuffer(scmhaManager.getDBTransactionBuffer())
+        .setContainerReplicaPendingOps(new ContainerReplicaPendingOps(
+            conf, Clock.system(ZoneId.systemDefault())))
         .build();
     serviceManager = new SCMServiceManager();
 


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

Reply via email to