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 ffa63e0cb6f HDDS-13509. Have single constructor in 
ContainerReplicaPendingOps and ContainerReplicaOp (#9118)
ffa63e0cb6f is described below

commit ffa63e0cb6f6303996c9481cecc9d48de67063a7
Author: GUAN-HAO HUANG <[email protected]>
AuthorDate: Tue Nov 11 21:16:04 2025 +0800

    HDDS-13509. Have single constructor in ContainerReplicaPendingOps and 
ContainerReplicaOp (#9118)
---
 .../container/replication/ContainerReplicaOp.java  | 28 +++++++-------
 .../replication/ContainerReplicaPendingOps.java    | 15 +++++---
 .../replication/ECUnderReplicationHandler.java     |  2 +-
 .../QuasiClosedStuckUnderReplicationHandler.java   |  7 +++-
 .../hadoop/hdds/scm/block/TestBlockManager.java    |  2 +-
 .../scm/container/TestContainerReportHandler.java  |  2 +-
 .../scm/container/TestContainerStateManager.java   |  2 +-
 .../TestIncrementalContainerReportHandler.java     |  2 +-
 .../scm/container/balancer/TestMoveManager.java    | 32 ++++++++--------
 .../replication/TestECContainerReplicaCount.java   | 32 ++++++++--------
 .../replication/TestECMisReplicationHandler.java   | 10 ++---
 .../replication/TestECOverReplicationHandler.java  |  4 +-
 .../replication/TestECUnderReplicationHandler.java |  2 +-
 ...TestQuasiClosedStuckOverReplicationHandler.java |  9 ++++-
 ...estQuasiClosedStuckUnderReplicationHandler.java |  4 +-
 .../TestRatisContainerReplicaCount.java            |  8 ++--
 .../TestRatisMisReplicationHandler.java            | 10 ++---
 .../TestRatisOverReplicationHandler.java           | 12 +++---
 .../TestRatisUnderReplicationHandler.java          | 24 ++++++------
 .../replication/TestReplicationManager.java        | 12 ++++--
 .../TestReplicationManagerScenarios.java           |  2 +-
 .../replication/TestReplicationManagerUtil.java    | 24 ++++++------
 .../health/TestDeletingContainerHandler.java       | 16 ++++----
 .../health/TestECMisReplicationCheckHandler.java   |  8 ++--
 .../health/TestECReplicationCheckHandler.java      | 28 +++++++-------
 .../TestQuasiClosedStuckReplicationCheck.java      |  9 ++++-
 .../health/TestRatisReplicationCheckHandler.java   | 44 +++++++++++-----------
 .../TestRatisUnhealthyReplicationCheckHandler.java | 16 ++++----
 .../hdds/scm/node/TestContainerPlacement.java      |  2 +-
 .../hdds/scm/safemode/TestSCMSafeModeManager.java  |  2 +-
 .../scm/AbstractReconContainerManagerTest.java     |  2 +-
 31 files changed, 198 insertions(+), 174 deletions(-)

diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ContainerReplicaOp.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ContainerReplicaOp.java
index 2be951a1814..5ba113e0ebe 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ContainerReplicaOp.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ContainerReplicaOp.java
@@ -21,7 +21,9 @@
 import org.apache.hadoop.ozone.protocol.commands.SCMCommand;
 
 /**
- * Class to wrap details used to track pending replications.
+ * ContainerReplicaOp wraps the information needed to track a pending
+ * replication operation (ADD or DELETE) against a specific datanode.
+ * It uses a single constructor so all call sites follow the same code path.
  */
 public class ContainerReplicaOp {
 
@@ -32,18 +34,16 @@ public class ContainerReplicaOp {
   private final long deadlineEpochMillis;
   private final long containerSize;
 
-  public static ContainerReplicaOp create(PendingOpType opType,
-      DatanodeDetails target, int replicaIndex) {
-    return new ContainerReplicaOp(opType, target, replicaIndex, null,
-        System.currentTimeMillis(), 0);
-  }
-
-  public ContainerReplicaOp(PendingOpType opType,
-      DatanodeDetails target, int replicaIndex, SCMCommand<?> command,
-      long deadlineEpochMillis) {
-    this(opType, target, replicaIndex, command, deadlineEpochMillis, 0);
-  }
-
+  /**
+   * Create a ContainerReplicaOp with all parameters.
+   *
+   * @param opType type of operation
+   * @param target target datanode
+   * @param replicaIndex replica index (zero for Ratis, &gt; 0 for EC)
+   * @param command SCM command associated with the op (nullable)
+   * @param deadlineEpochMillis deadline in epoch milliseconds
+   * @param containerSize size of the container in bytes
+   */
   public ContainerReplicaOp(PendingOpType opType,
       DatanodeDetails target, int replicaIndex, SCMCommand<?> command,
       long deadlineEpochMillis, long containerSize) {
@@ -80,7 +80,7 @@ public long getContainerSize() {
   }
 
   /**
-   * Enum representing different types of pending Ops.
+   * Types of pending operations supported by ContainerReplicaOp.
    */
   public enum PendingOpType {
     ADD, DELETE
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ContainerReplicaPendingOps.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ContainerReplicaPendingOps.java
index 8b1766cd978..2905ae4d4a3 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ContainerReplicaPendingOps.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ContainerReplicaPendingOps.java
@@ -64,14 +64,17 @@ public class ContainerReplicaPendingOps {
   private final ConcurrentHashMap<DatanodeID, SizeAndTime> 
containerSizeScheduled = new ConcurrentHashMap<>();
   private ReplicationManager.ReplicationManagerConfiguration rmConf;
 
-  public ContainerReplicaPendingOps(Clock clock) {
-    this.clock = clock;
-    resetCounters();
-  }
-
+  /**
+   * Creates a ContainerReplicaPendingOps with all parameters.
+   * This is the single constructor that should be used for all cases.
+   *
+   * @param clock the clock to use for timing operations
+   * @param rmConf the replication manager configuration (can be null)
+   */
   public ContainerReplicaPendingOps(Clock clock, 
ReplicationManager.ReplicationManagerConfiguration rmConf) {
-    this(clock);
+    this.clock = clock;
     this.rmConf = rmConf;
+    resetCounters();
   }
 
   /**
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ECUnderReplicationHandler.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ECUnderReplicationHandler.java
index 158c802479f..5da31e9349a 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ECUnderReplicationHandler.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ECUnderReplicationHandler.java
@@ -621,7 +621,7 @@ private void adjustPendingOps(ECContainerReplicaCount 
replicaCount,
                                 DatanodeDetails target, int replicaIndex) {
     replicaCount.addPendingOp(new ContainerReplicaOp(
         ContainerReplicaOp.PendingOpType.ADD, target, replicaIndex, null,
-        Long.MAX_VALUE));
+        Long.MAX_VALUE, 0));
   }
 
   static ByteString integers2ByteString(List<Integer> src) {
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/QuasiClosedStuckUnderReplicationHandler.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/QuasiClosedStuckUnderReplicationHandler.java
index 7730c330a1b..851378c481a 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/QuasiClosedStuckUnderReplicationHandler.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/QuasiClosedStuckUnderReplicationHandler.java
@@ -108,9 +108,12 @@ public int processAndSendCommands(Set<ContainerReplica> 
replicas, List<Container
           .collect(Collectors.toList());
       for (DatanodeDetails target : targets) {
         try {
-          replicationManager.sendThrottledReplicationCommand(containerInfo, 
sourceDatanodes, target, 0);
+          replicationManager.sendThrottledReplicationCommand(
+              containerInfo, sourceDatanodes, target, 0);
           // Add the pending op, so we exclude the node for subsequent origins
-          
mutablePendingOps.add(ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.ADD,
 target, 0));
+          mutablePendingOps.add(new ContainerReplicaOp(
+              ContainerReplicaOp.PendingOpType.ADD, target, 0,
+              null, System.currentTimeMillis(), 0));
           totalCommandsSent++;
         } catch (CommandTargetOverloadedException e) {
           LOG.warn("Cannot replicate container {} because all sources are 
overloaded.", containerInfo);
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 f7f605189d8..6a85a3dcf32 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
@@ -153,7 +153,7 @@ void setUp(@TempDir File tempDir) throws Exception {
             pipelineManager,
             scmMetadataStore.getContainerTable(),
             new ContainerReplicaPendingOps(
-                Clock.system(ZoneId.systemDefault())));
+                Clock.system(ZoneId.systemDefault()), null));
     SCMSafeModeManager safeModeManager = new SCMSafeModeManager(conf,
         nodeManager, pipelineManager, containerManager, serviceManager, 
eventQueue, scmContext);
     SCMConfigurator configurator = new SCMConfigurator();
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 61001b9d38f..e4176e18b35 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
@@ -115,7 +115,7 @@ void setup() throws IOException, 
InvalidStateTransitionException {
         .setContainerStore(SCMDBDefinition.CONTAINERS.getTable(dbStore))
         .setSCMDBTransactionBuffer(scmhaManager.getDBTransactionBuffer())
         .setContainerReplicaPendingOps(new ContainerReplicaPendingOps(
-            Clock.system(ZoneId.systemDefault())))
+            Clock.system(ZoneId.systemDefault()), null))
         .build();
     publisher = 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 0f5b3b6adcd..422b29f1b5b 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
@@ -91,7 +91,7 @@ public void init() throws IOException, TimeoutException {
         .setContainerStore(SCMDBDefinition.CONTAINERS.getTable(dbStore))
         .setSCMDBTransactionBuffer(scmhaManager.getDBTransactionBuffer())
         .setContainerReplicaPendingOps(new ContainerReplicaPendingOps(
-            Clock.system(ZoneId.systemDefault())))
+            Clock.system(ZoneId.systemDefault()), null))
         .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 d9ecaba4935..a87fdaec980 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
@@ -138,7 +138,7 @@ public void setup() throws IOException, 
InvalidStateTransitionException,
         .setContainerStore(SCMDBDefinition.CONTAINERS.getTable(dbStore))
         .setSCMDBTransactionBuffer(scmhaManager.getDBTransactionBuffer())
         .setContainerReplicaPendingOps(new ContainerReplicaPendingOps(
-            Clock.system(ZoneId.systemDefault())))
+            Clock.system(ZoneId.systemDefault()), null))
         .build();
 
     this.publisher = mock(EventPublisher.class);
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestMoveManager.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestMoveManager.java
index dc645ab0e8d..355aab13c41 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestMoveManager.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestMoveManager.java
@@ -201,13 +201,13 @@ public void testMovePendingOpsExist() throws Exception {
     nodes.put(src, NodeStatus.inServiceHealthy());
     nodes.put(tgt, NodeStatus.inServiceHealthy());
 
-    pendingOps.add(new ContainerReplicaOp(ADD, tgt, 0, null, clock.millis()));
+    pendingOps.add(new ContainerReplicaOp(ADD, tgt, 0, null, clock.millis(), 
0));
 
     assertMoveFailsWith(REPLICATION_FAIL_INFLIGHT_REPLICATION,
         containerInfo.containerID());
 
     pendingOps.clear();
-    pendingOps.add(new ContainerReplicaOp(DELETE, src, 0, null, 
clock.millis()));
+    pendingOps.add(new ContainerReplicaOp(DELETE, src, 0, null, 
clock.millis(), 0));
     assertMoveFailsWith(REPLICATION_FAIL_INFLIGHT_DELETION,
         containerInfo.containerID());
   }
@@ -327,7 +327,7 @@ public void testDeleteCommandFails() throws Exception {
         .when(containerManager).getContainer(any(ContainerID.class));
 
     ContainerReplicaOp op = new ContainerReplicaOp(
-        ADD, tgt, 0, null, clock.millis() + 1000);
+        ADD, tgt, 0, null, clock.millis() + 1000, 0);
     moveManager.opCompleted(op, containerInfo.containerID(), false);
 
     MoveManager.MoveResult moveResult = res.get();
@@ -339,14 +339,14 @@ public void testSuccessfulMove() throws Exception {
     CompletableFuture<MoveManager.MoveResult> res = setupSuccessfulMove();
 
     ContainerReplicaOp op = new ContainerReplicaOp(
-        ADD, tgt, 0, null, clock.millis() + 1000);
+        ADD, tgt, 0, null, clock.millis() + 1000, 0);
     moveManager.opCompleted(op, containerInfo.containerID(), false);
 
     verify(replicationManager).sendDeleteCommand(
         eq(containerInfo), eq(0), eq(src), eq(true), anyLong());
 
     op = new ContainerReplicaOp(
-        DELETE, src, 0, null, clock.millis() + 1000);
+        DELETE, src, 0, null, clock.millis() + 1000, 0);
     moveManager.opCompleted(op, containerInfo.containerID(), false);
 
     MoveManager.MoveResult finalResult = res.get();
@@ -376,7 +376,7 @@ public void testSuccessfulMoveNonZeroRepIndex() throws 
Exception {
         anyLong());
 
     ContainerReplicaOp op = new ContainerReplicaOp(
-        ADD, tgt, srcReplica.getReplicaIndex(), null, clock.millis() + 1000);
+        ADD, tgt, srcReplica.getReplicaIndex(), null, clock.millis() + 1000, 
0);
     moveManager.opCompleted(op, containerInfo.containerID(), false);
 
     verify(replicationManager).sendDeleteCommand(
@@ -384,7 +384,7 @@ public void testSuccessfulMoveNonZeroRepIndex() throws 
Exception {
         eq(true), anyLong());
 
     op = new ContainerReplicaOp(
-        DELETE, src, srcReplica.getReplicaIndex(), null, clock.millis() + 
1000);
+        DELETE, src, srcReplica.getReplicaIndex(), null, clock.millis() + 
1000, 0);
     moveManager.opCompleted(op, containerInfo.containerID(), false);
 
     MoveManager.MoveResult finalResult = res.get();
@@ -396,7 +396,7 @@ public void testMoveTimeoutOnAdd() throws Exception {
     CompletableFuture<MoveManager.MoveResult> res = setupSuccessfulMove();
 
     ContainerReplicaOp op = new ContainerReplicaOp(
-        ADD, tgt, 0, null, clock.millis() + 1000);
+        ADD, tgt, 0, null, clock.millis() + 1000, 0);
     moveManager.opCompleted(op, containerInfo.containerID(), true);
 
     MoveManager.MoveResult finalResult = res.get();
@@ -408,14 +408,14 @@ public void testMoveTimeoutOnDelete() throws Exception {
     CompletableFuture<MoveManager.MoveResult> res = setupSuccessfulMove();
 
     ContainerReplicaOp op = new ContainerReplicaOp(
-        ADD, tgt, 0, null, clock.millis() + 1000);
+        ADD, tgt, 0, null, clock.millis() + 1000, 0);
     moveManager.opCompleted(op, containerInfo.containerID(), false);
 
     verify(replicationManager).sendDeleteCommand(
         eq(containerInfo), eq(0), eq(src), eq(true), anyLong());
 
     op = new ContainerReplicaOp(
-        DELETE, src, 0, null, clock.millis() + 1000);
+        DELETE, src, 0, null, clock.millis() + 1000, 0);
     moveManager.opCompleted(op, containerInfo.containerID(), true);
 
     MoveManager.MoveResult finalResult = res.get();
@@ -436,7 +436,7 @@ public void testMoveCompleteSrcNoLongerPresent() throws 
Exception {
       }
     }
     ContainerReplicaOp op = new ContainerReplicaOp(
-        ADD, tgt, 0, null, clock.millis() + 1000);
+        ADD, tgt, 0, null, clock.millis() + 1000, 0);
     moveManager.opCompleted(op, containerInfo.containerID(), false);
 
     MoveManager.MoveResult finalResult = res.get();
@@ -452,7 +452,7 @@ public void testMoveCompleteSrcNotHealthy() throws 
Exception {
 
     nodes.put(src, NodeStatus.inServiceStale());
     ContainerReplicaOp op = new ContainerReplicaOp(
-        ADD, tgt, 0, null, clock.millis() + 1000);
+        ADD, tgt, 0, null, clock.millis() + 1000, 0);
     moveManager.opCompleted(op, containerInfo.containerID(), false);
 
     MoveManager.MoveResult finalResult = res.get();
@@ -470,7 +470,7 @@ public void testMoveCompleteSrcNotInService() throws 
Exception {
         HddsProtos.NodeOperationalState.DECOMMISSIONING,
         HddsProtos.NodeState.HEALTHY));
     ContainerReplicaOp op = new ContainerReplicaOp(
-        ADD, tgt, 0, null, clock.millis() + 1000);
+        ADD, tgt, 0, null, clock.millis() + 1000, 0);
     moveManager.opCompleted(op, containerInfo.containerID(), false);
 
     MoveManager.MoveResult finalResult = res.get();
@@ -489,7 +489,7 @@ public void testMoveCompleteFutureReplicasUnhealthy() 
throws Exception {
             .MisReplicatedHealthResult(containerInfo, false, null));
 
     ContainerReplicaOp op = new ContainerReplicaOp(
-        ADD, tgt, 0, null, clock.millis() + 1000);
+        ADD, tgt, 0, null, clock.millis() + 1000, 0);
     moveManager.opCompleted(op, containerInfo.containerID(), false);
 
     MoveManager.MoveResult finalResult = res.get();
@@ -525,7 +525,7 @@ public void testDeleteNotSentWithExpirationTimeInPast() 
throws Exception {
         eq(tgt), longCaptorReplicate.capture());
 
     ContainerReplicaOp op = new ContainerReplicaOp(
-        ADD, tgt, srcReplica.getReplicaIndex(), null, clock.millis() + 1000);
+        ADD, tgt, srcReplica.getReplicaIndex(), null, clock.millis() + 1000, 
0);
     moveManager.opCompleted(op, containerInfo.containerID(), false);
     ArgumentCaptor<Long> longCaptorDelete = 
ArgumentCaptor.forClass(Long.class);
     verify(replicationManager).sendDeleteCommand(
@@ -541,7 +541,7 @@ public void testDeleteNotSentWithExpirationTimeInPast() 
throws Exception {
     assertTrue((longCaptorDelete.getValue() - 
Duration.ofMinutes(6).toMillis()) > clock.millis());
 
     op = new ContainerReplicaOp(
-        DELETE, src, srcReplica.getReplicaIndex(), null, clock.millis() + 
1000);
+        DELETE, src, srcReplica.getReplicaIndex(), null, clock.millis() + 
1000, 0);
     moveManager.opCompleted(op, containerInfo.containerID(), false);
     MoveManager.MoveResult finalResult = res.get();
     assertEquals(COMPLETED, finalResult);
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECContainerReplicaCount.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECContainerReplicaCount.java
index b80fe5cfc87..bb31e9cb8e1 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECContainerReplicaCount.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECContainerReplicaCount.java
@@ -92,7 +92,7 @@ public void testContainerMissingReplica() {
     // appears missing
     ContainerReplicaOp op = new ContainerReplicaOp(
         ContainerReplicaOp.PendingOpType.ADD,
-        MockDatanodeDetails.randomDatanodeDetails(), 5, null, Long.MAX_VALUE);
+        MockDatanodeDetails.randomDatanodeDetails(), 5, null, Long.MAX_VALUE, 
0);
     rcnt.addPendingOp(op);
     assertTrue(rcnt.isSufficientlyReplicated(true));
     assertEquals(0, rcnt.unavailableIndexes(true).size());
@@ -213,7 +213,7 @@ public void testOverReplicatedContainer() {
     // as not over replicated.
     rcnt.addPendingOp(new ContainerReplicaOp(
         ContainerReplicaOp.PendingOpType.DELETE,
-        MockDatanodeDetails.randomDatanodeDetails(), 2, null, Long.MAX_VALUE));
+        MockDatanodeDetails.randomDatanodeDetails(), 2, null, Long.MAX_VALUE, 
0));
     assertFalse(rcnt.isOverReplicated(true));
   }
 
@@ -227,9 +227,9 @@ public void 
testOverReplicatedContainerFixedWithPendingDelete() {
 
     List<ContainerReplicaOp> pending =
         getContainerReplicaOps(ImmutableList.of(), ImmutableList.of(1));
-    pending.add(ContainerReplicaOp
-        .create(ContainerReplicaOp.PendingOpType.DELETE,
-            MockDatanodeDetails.randomDatanodeDetails(), 2));
+    pending.add(new ContainerReplicaOp(
+        ContainerReplicaOp.PendingOpType.DELETE,
+        MockDatanodeDetails.randomDatanodeDetails(), 2, null, Long.MAX_VALUE, 
0));
 
     ECContainerReplicaCount rcnt =
         new ECContainerReplicaCount(container, replica, pending, 1);
@@ -529,15 +529,17 @@ private List<ContainerReplicaOp> getContainerReplicaOps(
       List<Integer> addIndexes, List<Integer> deleteIndexes) {
     List<ContainerReplicaOp> pending = new ArrayList<>();
     for (Integer addIndex : addIndexes) {
-      pending.add(ContainerReplicaOp
-          .create(ContainerReplicaOp.PendingOpType.ADD,
-              MockDatanodeDetails.randomDatanodeDetails(), addIndex));
+      pending.add(new ContainerReplicaOp(
+          ContainerReplicaOp.PendingOpType.ADD,
+          MockDatanodeDetails.randomDatanodeDetails(), addIndex,
+          null, Long.MAX_VALUE, 0));
     }
 
     for (Integer deleteIndex : deleteIndexes) {
-      pending.add(ContainerReplicaOp
-          .create(ContainerReplicaOp.PendingOpType.DELETE,
-              MockDatanodeDetails.randomDatanodeDetails(), deleteIndex));
+      pending.add(new ContainerReplicaOp(
+          ContainerReplicaOp.PendingOpType.DELETE,
+          MockDatanodeDetails.randomDatanodeDetails(), deleteIndex,
+          null, Long.MAX_VALUE, 0));
     }
     return pending;
   }
@@ -711,19 +713,19 @@ public void 
testSufficientlyReplicatedWithUnhealthyAndPendingDelete() {
     replica.add(unhealthyReplica);
 
     List<ContainerReplicaOp> pendingOps = new ArrayList<>();
-    pendingOps.add(ContainerReplicaOp.create(
+    pendingOps.add(new ContainerReplicaOp(
         ContainerReplicaOp.PendingOpType.DELETE,
         unhealthyReplica.getDatanodeDetails(),
-        unhealthyReplica.getReplicaIndex()));
+        unhealthyReplica.getReplicaIndex(), null, System.currentTimeMillis(), 
0));
 
     ECContainerReplicaCount rcnt =
         new ECContainerReplicaCount(container, replica, pendingOps, 1);
     assertTrue(rcnt.isSufficientlyReplicated(false));
 
     // Add another pending delete to an index that is not an unhealthy index
-    pendingOps.add(ContainerReplicaOp.create(
+    pendingOps.add(new ContainerReplicaOp(
         ContainerReplicaOp.PendingOpType.DELETE,
-        MockDatanodeDetails.randomDatanodeDetails(), 2));
+        MockDatanodeDetails.randomDatanodeDetails(), 2, null, 
System.currentTimeMillis(), 0));
 
     rcnt = new ECContainerReplicaCount(container, replica, pendingOps, 1);
     assertFalse(rcnt.isSufficientlyReplicated(false));
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECMisReplicationHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECMisReplicationHandler.java
index 363097ce400..eb45e3fc9d6 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECMisReplicationHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECMisReplicationHandler.java
@@ -161,13 +161,13 @@ public void testMisReplicationWithPendingOps()
     when(placementPolicy.validateContainerPlacement(anyList(),
             anyInt())).thenReturn(mockedContainerPlacementStatus);
     List<ContainerReplicaOp> pendingOp = singletonList(
-            ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.ADD,
-                    MockDatanodeDetails.randomDatanodeDetails(), 1));
+            new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.ADD,
+                    MockDatanodeDetails.randomDatanodeDetails(), 1, null, 
Long.MAX_VALUE, 0));
     testMisReplication(availableReplicas, placementPolicy,
             pendingOp, 0, 1, 0);
-    pendingOp = singletonList(ContainerReplicaOp
-            .create(ContainerReplicaOp.PendingOpType.DELETE, availableReplicas
-                    .stream().findAny().get().getDatanodeDetails(), 1));
+    pendingOp = singletonList(new ContainerReplicaOp(
+            ContainerReplicaOp.PendingOpType.DELETE, availableReplicas
+                    .stream().findAny().get().getDatanodeDetails(), 1, null, 
Long.MAX_VALUE, 0));
     testMisReplication(availableReplicas, placementPolicy,
             pendingOp, 0, 1, 0);
   }
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECOverReplicationHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECOverReplicationHandler.java
index 2fc978794de..533ac898392 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECOverReplicationHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECOverReplicationHandler.java
@@ -136,8 +136,8 @@ public void testOverReplicationFixedByPendingDelete()
         ContainerReplicaProto.State.CLOSED);
     availableReplicas.add(excess);
     List<ContainerReplicaOp> pendingOps = new ArrayList<>();
-    pendingOps.add(ContainerReplicaOp.create(DELETE,
-        excess.getDatanodeDetails(), 5));
+    pendingOps.add(new ContainerReplicaOp(DELETE,
+        excess.getDatanodeDetails(), 5, null, Long.MAX_VALUE, 0));
     testOverReplicationWithIndexes(availableReplicas, Collections.emptyMap(),
         pendingOps);
   }
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECUnderReplicationHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECUnderReplicationHandler.java
index 5de354fb2de..5d2af561196 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECUnderReplicationHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECUnderReplicationHandler.java
@@ -1073,7 +1073,7 @@ public void 
testDatanodesPendingAddAreNotSelectedAsTargets()
     Set<ContainerReplica> availableReplicas = createReplicas(3);
     DatanodeDetails dn = MockDatanodeDetails.randomDatanodeDetails();
     List<ContainerReplicaOp> pendingOps = ImmutableList.of(
-        ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.ADD, dn, 
4));
+        new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.ADD, dn, 4, 
null, System.currentTimeMillis(), 0));
 
     /*
     Mock the placement policy. If the list of nodes to be excluded does not
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestQuasiClosedStuckOverReplicationHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestQuasiClosedStuckOverReplicationHandler.java
index ba7de78c5e3..67d1fe09371 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestQuasiClosedStuckOverReplicationHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestQuasiClosedStuckOverReplicationHandler.java
@@ -118,8 +118,13 @@ public void testNoCommandsScheduledIfPendingOps() throws 
IOException {
         Pair.of(origin2, HddsProtos.NodeOperationalState.IN_SERVICE),
         Pair.of(origin2, HddsProtos.NodeOperationalState.IN_SERVICE));
     List<ContainerReplicaOp> pendingOps = new ArrayList<>();
-    pendingOps.add(ContainerReplicaOp.create(
-        ContainerReplicaOp.PendingOpType.DELETE, 
MockDatanodeDetails.randomDatanodeDetails(), 0));
+    pendingOps.add(new ContainerReplicaOp(
+        ContainerReplicaOp.PendingOpType.DELETE,
+        MockDatanodeDetails.randomDatanodeDetails(),
+        0,
+        null,
+        Long.MAX_VALUE,
+        0));
 
     int count = handler.processAndSendCommands(replicas, pendingOps, 
getOverReplicatedHealthResult(), 1);
     assertEquals(0, count);
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestQuasiClosedStuckUnderReplicationHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestQuasiClosedStuckUnderReplicationHandler.java
index 20731c948ad..ff7853f8c8d 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestQuasiClosedStuckUnderReplicationHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestQuasiClosedStuckUnderReplicationHandler.java
@@ -132,8 +132,8 @@ public void testNoCommandsScheduledIfPendingOps() throws 
IOException {
         Pair.of(origin, HddsProtos.NodeOperationalState.IN_SERVICE),
         Pair.of(origin, HddsProtos.NodeOperationalState.IN_SERVICE));
     List<ContainerReplicaOp> pendingOps = new ArrayList<>();
-    pendingOps.add(ContainerReplicaOp.create(
-        ContainerReplicaOp.PendingOpType.ADD, 
MockDatanodeDetails.randomDatanodeDetails(), 0));
+    pendingOps.add(new ContainerReplicaOp(
+        ContainerReplicaOp.PendingOpType.ADD, 
MockDatanodeDetails.randomDatanodeDetails(), 0, null, Long.MAX_VALUE, 0));
 
     int count = handler.processAndSendCommands(replicas, pendingOps, 
getUnderReplicatedHealthResult(), 1);
     assertEquals(0, count);
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisContainerReplicaCount.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisContainerReplicaCount.java
index 70116ef3ccf..3d3418b7f5b 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisContainerReplicaCount.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisContainerReplicaCount.java
@@ -568,8 +568,8 @@ void 
testSufficientReplicationWithPendingDeleteOnUnhealthyReplica() {
     replicas.add(unhealthyReplica);
 
     List<ContainerReplicaOp> ops = new ArrayList<>();
-    ops.add(ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.DELETE,
-        unhealthyReplica.getDatanodeDetails(), 0));
+    ops.add(new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.DELETE,
+        unhealthyReplica.getDatanodeDetails(), 0, null, 
System.currentTimeMillis(), 0));
     RatisContainerReplicaCount withoutUnhealthy =
         new RatisContainerReplicaCount(container, replicas, ops, 2, false);
     validate(withoutUnhealthy, true, 0, false, false);
@@ -656,8 +656,8 @@ void testSafelyOverReplicated() {
         createReplicas(container.containerID(), UNHEALTHY, 0, 0);
     replicas.addAll(unhealthyReplicas);
     List<ContainerReplicaOp> ops = new ArrayList<>();
-    ops.add(ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.DELETE,
-        unhealthyReplicas.iterator().next().getDatanodeDetails(), 0));
+    ops.add(new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.DELETE,
+        unhealthyReplicas.iterator().next().getDatanodeDetails(), 0, null, 
System.currentTimeMillis(), 0));
 
     RatisContainerReplicaCount withoutUnhealthy =
         new RatisContainerReplicaCount(container, replicas, ops, 2, false);
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisMisReplicationHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisMisReplicationHandler.java
index 88889da0b26..29b2492475b 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisMisReplicationHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisMisReplicationHandler.java
@@ -162,13 +162,13 @@ public void testMisReplicationWithPendingOps()
     when(placementPolicy.validateContainerPlacement(anyList(),
             anyInt())).thenReturn(mockedContainerPlacementStatus);
     List<ContainerReplicaOp> pendingOp = Collections.singletonList(
-            ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.ADD,
-                    MockDatanodeDetails.randomDatanodeDetails(), 0));
+            new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.ADD,
+                    MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
     testMisReplication(availableReplicas, placementPolicy,
             pendingOp, 0, 1, 0);
-    pendingOp = Collections.singletonList(ContainerReplicaOp
-            .create(ContainerReplicaOp.PendingOpType.DELETE, availableReplicas
-                    .stream().findAny().get().getDatanodeDetails(), 0));
+    pendingOp = Collections.singletonList(new ContainerReplicaOp(
+            ContainerReplicaOp.PendingOpType.DELETE, availableReplicas
+                    .stream().findAny().get().getDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
     testMisReplication(availableReplicas, placementPolicy,
             pendingOp, 0, 1, 0);
   }
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisOverReplicationHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisOverReplicationHandler.java
index 6c4fcd248ee..84dabae7686 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisOverReplicationHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisOverReplicationHandler.java
@@ -113,8 +113,8 @@ public void testOverReplicatedClosedContainer() throws 
IOException {
     Set<ContainerReplica> replicas = createReplicas(container.containerID(),
         ContainerReplicaProto.State.CLOSED, 0, 0, 0, 0, 0);
     List<ContainerReplicaOp> pendingOps = ImmutableList.of(
-        ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.DELETE,
-            MockDatanodeDetails.randomDatanodeDetails(), 0));
+        new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.DELETE,
+            MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
 
     // 1 replica is already pending delete, so only 1 new command should be
     // created
@@ -220,8 +220,8 @@ public void 
testClosedOverReplicatedWithAllUnhealthyReplicas()
     Set<ContainerReplica> replicas = createReplicas(container.containerID(),
         State.UNHEALTHY, 0, 0, 0, 0, 0);
     List<ContainerReplicaOp> pendingOps = ImmutableList.of(
-        ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.DELETE,
-            MockDatanodeDetails.randomDatanodeDetails(), 0));
+        new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.DELETE,
+            MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
 
     // 1 replica is already pending delete, so only 1 new command should be
     // created
@@ -409,8 +409,8 @@ public void testPerfectlyReplicatedContainer() throws 
IOException {
     replicas = createReplicas(container.containerID(),
         ContainerReplicaProto.State.CLOSED, 0, 0, 0, 0);
     List<ContainerReplicaOp> pendingOps = ImmutableList.of(
-        ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.DELETE,
-            MockDatanodeDetails.randomDatanodeDetails(), 0));
+        new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.DELETE,
+            MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
 
     testProcessing(replicas, pendingOps, getOverReplicatedHealthResult(), 0);
   }
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisUnderReplicationHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisUnderReplicationHandler.java
index dd2f9fd51d0..f10fff8695b 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisUnderReplicationHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisUnderReplicationHandler.java
@@ -139,8 +139,8 @@ public void 
testUnderReplicatedWithMissingReplicasAndPendingAdd()
     Set<ContainerReplica> replicas
         = createReplicas(container.containerID(), State.CLOSED, 0);
     List<ContainerReplicaOp> pendingOps = ImmutableList.of(
-        ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.ADD,
-            MockDatanodeDetails.randomDatanodeDetails(), 0));
+        new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.ADD,
+            MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
 
     testProcessing(replicas, pendingOps, getUnderReplicatedHealthResult(), 2,
         1);
@@ -166,8 +166,8 @@ public void testUnderReplicatedFixedByPendingAdd() throws 
IOException {
     Set<ContainerReplica> replicas
         = createReplicas(container.containerID(), State.CLOSED, 0, 0);
     List<ContainerReplicaOp> pendingOps = ImmutableList.of(
-        ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.ADD,
-            MockDatanodeDetails.randomDatanodeDetails(), 0));
+        new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.ADD,
+            MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
 
     testProcessing(replicas, pendingOps, getUnderReplicatedHealthResult(), 2,
         0);
@@ -338,8 +338,8 @@ public void 
testNoTargetsFoundBecauseOfPlacementPolicyPendingDelete() {
     replicas.add(shouldDelete);
 
     List<ContainerReplicaOp> pending = Collections.singletonList(
-        ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.DELETE,
-        shouldDelete.getDatanodeDetails(), 0));
+        new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.DELETE,
+        shouldDelete.getDatanodeDetails(), 0, null, 
System.currentTimeMillis(), 0));
 
     assertThrows(IOException.class,
         () -> handler.processAndSendCommands(replicas,
@@ -389,8 +389,8 @@ public void 
testUnhealthyReplicasAreReplicatedWhenHealthyAreUnavailable()
     Set<ContainerReplica> replicas
         = createReplicas(container.containerID(), State.UNHEALTHY, 0);
     List<ContainerReplicaOp> pendingOps = ImmutableList.of(
-        ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.ADD,
-            MockDatanodeDetails.randomDatanodeDetails(), 0));
+        new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.ADD,
+            MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
System.currentTimeMillis(), 0));
 
     testProcessing(replicas, pendingOps, getUnderReplicatedHealthResult(), 2,
         1);
@@ -504,10 +504,10 @@ public void testCorrectUsedAndExcludedNodesPassed() 
throws IOException {
     List<ContainerReplicaOp> pendingOps = new ArrayList<>();
     DatanodeDetails pendingAdd = MockDatanodeDetails.randomDatanodeDetails();
     DatanodeDetails pendingRemove = 
MockDatanodeDetails.randomDatanodeDetails();
-    pendingOps.add(ContainerReplicaOp.create(
-        ContainerReplicaOp.PendingOpType.ADD, pendingAdd, 0));
-    pendingOps.add(ContainerReplicaOp.create(
-        ContainerReplicaOp.PendingOpType.DELETE, pendingRemove, 0));
+    pendingOps.add(new ContainerReplicaOp(
+        ContainerReplicaOp.PendingOpType.ADD, pendingAdd, 0, null, 
System.currentTimeMillis(), 0));
+    pendingOps.add(new ContainerReplicaOp(
+        ContainerReplicaOp.PendingOpType.DELETE, pendingRemove, 0, null, 
System.currentTimeMillis(), 0));
 
     handler.processAndSendCommands(replicas, pendingOps,
         getUnderReplicatedHealthResult(), 2);
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManager.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManager.java
index 204953a6033..5889ca11efe 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManager.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManager.java
@@ -159,7 +159,7 @@ public void setup() throws IOException {
 
     clock = new TestClock(Instant.now(), ZoneId.systemDefault());
     containerReplicaPendingOps =
-        new ContainerReplicaPendingOps(clock);
+        new ContainerReplicaPendingOps(clock, null);
 
     when(containerManager
         .getContainerReplicas(any(ContainerID.class))).thenAnswer(
@@ -1635,9 +1635,15 @@ public void testPendingOpExpiry() throws 
ContainerNotFoundException {
     DatanodeDetails dn1 = MockDatanodeDetails.randomDatanodeDetails();
     DatanodeDetails dn2 = MockDatanodeDetails.randomDatanodeDetails();
 
-    ContainerReplicaOp addOp = 
ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.ADD, dn1, 1);
+    ContainerReplicaOp addOp = new ContainerReplicaOp(
+        ContainerReplicaOp.PendingOpType.ADD,
+        dn1,
+        1,
+        null,
+        Long.MAX_VALUE,
+        0);
     ContainerReplicaOp delOp = new ContainerReplicaOp(
-        ContainerReplicaOp.PendingOpType.DELETE, dn2, 1, command, 
commandDeadline);
+        ContainerReplicaOp.PendingOpType.DELETE, dn2, 1, command, 
commandDeadline, 0);
 
     replicationManager.opCompleted(addOp, ContainerID.valueOf(1L), false);
     replicationManager.opCompleted(delOp, ContainerID.valueOf(1L), false);
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManagerScenarios.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManagerScenarios.java
index d7d57287077..7baebb2c885 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManagerScenarios.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManagerScenarios.java
@@ -183,7 +183,7 @@ public void setup() throws IOException, 
NodeNotFoundException {
     }).when(nodeManager).addDatanodeCommand(any(), any());
 
     clock = new TestClock(Instant.now(), ZoneId.systemDefault());
-    containerReplicaPendingOps = new ContainerReplicaPendingOps(clock);
+    containerReplicaPendingOps = new ContainerReplicaPendingOps(clock, null);
 
     
when(containerManager.getContainerReplicas(any(ContainerID.class))).thenAnswer(
         invocation -> {
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManagerUtil.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManagerUtil.java
index a3573dc2e47..d5c465aa238 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManagerUtil.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManagerUtil.java
@@ -114,10 +114,10 @@ public void testGetExcludedAndUsedNodes() throws 
NodeNotFoundException {
     DatanodeDetails pendingAdd = MockDatanodeDetails.randomDatanodeDetails();
     DatanodeDetails pendingDelete = 
MockDatanodeDetails.randomDatanodeDetails();
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        ContainerReplicaOp.PendingOpType.ADD, pendingAdd, 0));
-    pending.add(ContainerReplicaOp.create(
-        ContainerReplicaOp.PendingOpType.DELETE, pendingDelete, 0));
+    pending.add(new ContainerReplicaOp(
+        ContainerReplicaOp.PendingOpType.ADD, pendingAdd, 0, null, 
Long.MAX_VALUE, 0));
+    pending.add(new ContainerReplicaOp(
+        ContainerReplicaOp.PendingOpType.DELETE, pendingDelete, 0, null, 
Long.MAX_VALUE, 0));
 
     when(replicationManager.getNodeStatus(any())).thenAnswer(
         invocation -> {
@@ -203,10 +203,10 @@ public void 
testGetUsedAndExcludedNodesForQuasiClosedContainer() throws NodeNotF
     DatanodeDetails pendingAdd = MockDatanodeDetails.randomDatanodeDetails();
     DatanodeDetails pendingDelete = 
MockDatanodeDetails.randomDatanodeDetails();
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        ContainerReplicaOp.PendingOpType.ADD, pendingAdd, 0));
-    pending.add(ContainerReplicaOp.create(
-        ContainerReplicaOp.PendingOpType.DELETE, pendingDelete, 0));
+    pending.add(new ContainerReplicaOp(
+        ContainerReplicaOp.PendingOpType.ADD, pendingAdd, 0, null, 
Long.MAX_VALUE, 0));
+    pending.add(new ContainerReplicaOp(
+        ContainerReplicaOp.PendingOpType.DELETE, pendingDelete, 0, null, 
Long.MAX_VALUE, 0));
 
     when(replicationManager.getNodeStatus(any())).thenAnswer(
         invocation -> {
@@ -286,10 +286,10 @@ public void 
testDatanodesWithInSufficientDiskSpaceAreExcluded() throws NodeNotFo
     DatanodeDetails pendingAdd = MockDatanodeDetails.randomDatanodeDetails();
     DatanodeDetails pendingDelete = 
MockDatanodeDetails.randomDatanodeDetails();
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        ContainerReplicaOp.PendingOpType.ADD, pendingAdd, 0));
-    pending.add(ContainerReplicaOp.create(
-        ContainerReplicaOp.PendingOpType.DELETE, pendingDelete, 0));
+    pending.add(new ContainerReplicaOp(
+        ContainerReplicaOp.PendingOpType.ADD, pendingAdd, 0, null, 
Long.MAX_VALUE, 0));
+    pending.add(new ContainerReplicaOp(
+        ContainerReplicaOp.PendingOpType.DELETE, pendingDelete, 0, null, 
Long.MAX_VALUE, 0));
 
     // set up mocks such ContainerReplicaPendingOps returns the 
containerSizeScheduled map
     ReplicationManagerConfiguration rmConf = new 
ReplicationManagerConfiguration();
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestDeletingContainerHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestDeletingContainerHandler.java
index 9a3a12c73de..38cb42a494f 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestDeletingContainerHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestDeletingContainerHandler.java
@@ -174,8 +174,8 @@ public void testNoNeedResendDeleteCommand() throws 
NotLeaderException {
             ContainerReplicaProto.State.CLOSED, 0, 0, 0);
     List<ContainerReplicaOp> pendingOps = new ArrayList<>();
     containerReplicas.forEach(r -> pendingOps.add(
-        ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.DELETE,
-            r.getDatanodeDetails(), r.getReplicaIndex())));
+        new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.DELETE,
+            r.getDatanodeDetails(), r.getReplicaIndex(), null, Long.MAX_VALUE, 
0)));
     verifyDeleteCommandCount(containerInfo, containerReplicas, pendingOps, 0);
 
     //EC container
@@ -186,8 +186,8 @@ public void testNoNeedResendDeleteCommand() throws 
NotLeaderException {
             ContainerReplicaProto.State.CLOSED, 1, 2, 3, 4, 5);
     pendingOps.clear();
     containerReplicas.forEach(r -> pendingOps.add(
-        ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.DELETE,
-            r.getDatanodeDetails(), r.getReplicaIndex())));
+        new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.DELETE,
+            r.getDatanodeDetails(), r.getReplicaIndex(), null, Long.MAX_VALUE, 
0)));
     verifyDeleteCommandCount(containerInfo, containerReplicas, pendingOps, 0);
 
   }
@@ -207,8 +207,8 @@ public void testResendDeleteCommand() throws 
NotLeaderException {
             ContainerReplicaProto.State.CLOSED, 0, 0, 0);
     List<ContainerReplicaOp> pendingOps = new ArrayList<>();
     containerReplicas.stream().limit(2).forEach(replica -> pendingOps.add(
-        ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.DELETE,
-            replica.getDatanodeDetails(), replica.getReplicaIndex())));
+        new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.DELETE,
+            replica.getDatanodeDetails(), replica.getReplicaIndex(), null, 
Long.MAX_VALUE, 0)));
     verifyDeleteCommandCount(containerInfo, containerReplicas, pendingOps, 1);
 
     //EC container
@@ -219,8 +219,8 @@ public void testResendDeleteCommand() throws 
NotLeaderException {
             ContainerReplicaProto.State.CLOSED, 1, 2, 3, 4, 5);
     pendingOps.clear();
     containerReplicas.stream().limit(3).forEach(replica -> pendingOps.add(
-        ContainerReplicaOp.create(ContainerReplicaOp.PendingOpType.DELETE,
-            replica.getDatanodeDetails(), replica.getReplicaIndex())));
+        new ContainerReplicaOp(ContainerReplicaOp.PendingOpType.DELETE,
+            replica.getDatanodeDetails(), replica.getReplicaIndex(), null, 
Long.MAX_VALUE, 0)));
     //since one delete command is end when testing ratis container, so
     //here should be 1+2 = 3 times
     verifyDeleteCommandCount(containerInfo, containerReplicas, pendingOps, 3);
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestECMisReplicationCheckHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestECMisReplicationCheckHandler.java
index 935f370ae50..43e03b3383d 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestECMisReplicationCheckHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestECMisReplicationCheckHandler.java
@@ -172,8 +172,8 @@ public void 
shouldReturnFalseForMisReplicatedContainerFixedByPending() {
     });
 
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        ADD, MockDatanodeDetails.randomDatanodeDetails(), 1));
+    pending.add(new ContainerReplicaOp(
+        ADD, MockDatanodeDetails.randomDatanodeDetails(), 1, null, 
Long.MAX_VALUE, 0));
 
     Set<ContainerReplica> replicas =  createReplicas(container.containerID(),
         Pair.of(IN_SERVICE, 1), Pair.of(IN_SERVICE, 2),
@@ -229,8 +229,8 @@ public void testMisReplicationWithUnhealthyReplica() {
             State.UNHEALTHY);
     replicas.add(unhealthyReplica);
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        DELETE, unhealthyReplica.getDatanodeDetails(), 1));
+    pending.add(new ContainerReplicaOp(
+        DELETE, unhealthyReplica.getDatanodeDetails(), 1, null, 
Long.MAX_VALUE, 0));
 
     ContainerCheckRequest request = requestBuilder
         .setContainerReplicas(replicas)
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestECReplicationCheckHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestECReplicationCheckHandler.java
index e4ec24f053a..d3f9eb0891c 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestECReplicationCheckHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestECReplicationCheckHandler.java
@@ -139,8 +139,8 @@ public void testUnderReplicatedContainerFixedWithPending() {
     Set<ContainerReplica> replicas
         = createReplicas(container.containerID(), 1, 2, 4, 5);
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        ADD, MockDatanodeDetails.randomDatanodeDetails(), 3));
+    pending.add(new ContainerReplicaOp(
+        ADD, MockDatanodeDetails.randomDatanodeDetails(), 3, null, 
Long.MAX_VALUE, 0));
     ContainerCheckRequest request = requestBuilder
         .setContainerReplicas(replicas)
         .setContainerInfo(container)
@@ -197,8 +197,8 @@ public void 
testUnderReplicatedDueToOutOfServiceFixedWithPending() {
         Pair.of(IN_SERVICE, 3), Pair.of(DECOMMISSIONING, 4),
         Pair.of(IN_SERVICE, 4), Pair.of(DECOMMISSIONED, 5));
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        ADD, MockDatanodeDetails.randomDatanodeDetails(), 5));
+    pending.add(new ContainerReplicaOp(
+        ADD, MockDatanodeDetails.randomDatanodeDetails(), 5, null, 
Long.MAX_VALUE, 0));
     ContainerCheckRequest request = requestBuilder
         .setContainerReplicas(replicas)
         .setContainerInfo(container)
@@ -228,8 +228,8 @@ public void 
testUnderReplicatedDueToOutOfServiceAndMissingReplica() {
         Pair.of(IN_SERVICE, 1), Pair.of(IN_SERVICE, 2),
         Pair.of(DECOMMISSIONING, 4), Pair.of(DECOMMISSIONED, 5));
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        ADD, MockDatanodeDetails.randomDatanodeDetails(), 3));
+    pending.add(new ContainerReplicaOp(
+        ADD, MockDatanodeDetails.randomDatanodeDetails(), 3, null, 
Long.MAX_VALUE, 0));
 
     ContainerCheckRequest request = requestBuilder
         .setContainerReplicas(replicas)
@@ -369,8 +369,8 @@ private void 
testUnderReplicatedAndUnrecoverableWithOfflinePending(
     Set<ContainerReplica> replicas = createReplicas(container.containerID(),
         Pair.of(IN_SERVICE, 1), Pair.of(offlineState, 2));
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        ADD, MockDatanodeDetails.randomDatanodeDetails(), 2));
+    pending.add(new ContainerReplicaOp(
+        ADD, MockDatanodeDetails.randomDatanodeDetails(), 2, null, 
Long.MAX_VALUE, 0));
     ContainerCheckRequest request = requestBuilder
         .setContainerReplicas(replicas)
         .setContainerInfo(container)
@@ -508,10 +508,10 @@ public void testOverReplicatedContainerFixedByPending() {
         Pair.of(IN_SERVICE, 1), Pair.of(IN_SERVICE, 2));
 
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        DELETE, MockDatanodeDetails.randomDatanodeDetails(), 1));
-    pending.add(ContainerReplicaOp.create(
-        DELETE, MockDatanodeDetails.randomDatanodeDetails(), 2));
+    pending.add(new ContainerReplicaOp(
+        DELETE, MockDatanodeDetails.randomDatanodeDetails(), 1, null, 
Long.MAX_VALUE, 0));
+    pending.add(new ContainerReplicaOp(
+        DELETE, MockDatanodeDetails.randomDatanodeDetails(), 2, null, 
Long.MAX_VALUE, 0));
     ContainerCheckRequest request = requestBuilder
         .setContainerReplicas(replicas)
         .setContainerInfo(container)
@@ -665,9 +665,9 @@ public void 
testUnhealthyReplicaWithOtherCopyAndPendingDelete() {
     replicas.add(unhealthyReplica);
 
     List<ContainerReplicaOp> pendingOps = new ArrayList<>();
-    pendingOps.add(ContainerReplicaOp.create(DELETE,
+    pendingOps.add(new ContainerReplicaOp(DELETE,
         unhealthyReplica.getDatanodeDetails(),
-        unhealthyReplica.getReplicaIndex()));
+        unhealthyReplica.getReplicaIndex(), null, Long.MAX_VALUE, 0));
 
     ContainerCheckRequest request = requestBuilder
         .setContainerReplicas(replicas)
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestQuasiClosedStuckReplicationCheck.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestQuasiClosedStuckReplicationCheck.java
index 3e0adbf70d3..74faf643196 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestQuasiClosedStuckReplicationCheck.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestQuasiClosedStuckReplicationCheck.java
@@ -214,7 +214,7 @@ public void testUnderReplicatedWithPendingAddIsNotQueued() {
 
     List<ContainerReplicaOp> pendingOps = new ArrayList<>();
     pendingOps.add(new ContainerReplicaOp(
-        ContainerReplicaOp.PendingOpType.ADD, 
MockDatanodeDetails.randomDatanodeDetails(), 0, null, Long.MAX_VALUE));
+        ContainerReplicaOp.PendingOpType.ADD, 
MockDatanodeDetails.randomDatanodeDetails(), 0, null, Long.MAX_VALUE, 0));
 
     ContainerCheckRequest request = new ContainerCheckRequest.Builder()
         .setPendingOps(Collections.emptyList())
@@ -271,7 +271,12 @@ public void 
testOverReplicatedWithPendingDeleteIsNotQueued() {
 
     List<ContainerReplicaOp> pendingOps = new ArrayList<>();
     pendingOps.add(new ContainerReplicaOp(
-        ContainerReplicaOp.PendingOpType.DELETE, 
MockDatanodeDetails.randomDatanodeDetails(), 0, null, Long.MAX_VALUE));
+        ContainerReplicaOp.PendingOpType.DELETE,
+        MockDatanodeDetails.randomDatanodeDetails(),
+        0,
+        null,
+        Long.MAX_VALUE,
+        0));
 
     ContainerCheckRequest request = new ContainerCheckRequest.Builder()
         .setPendingOps(Collections.emptyList())
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestRatisReplicationCheckHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestRatisReplicationCheckHandler.java
index 59bdc87d369..8e8291814b3 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestRatisReplicationCheckHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestRatisReplicationCheckHandler.java
@@ -167,8 +167,8 @@ public void 
testUnderReplicatedContainerDueToPendingDelete() {
     Set<ContainerReplica> replicas
         = createReplicas(container.containerID(), 0, 0, 0);
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        DELETE, MockDatanodeDetails.randomDatanodeDetails(), 0));
+    pending.add(new ContainerReplicaOp(
+        DELETE, MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
     requestBuilder.setContainerReplicas(replicas)
         .setContainerInfo(container)
         .setPendingOps(pending);
@@ -192,8 +192,8 @@ public void testUnderReplicatedContainerFixedWithPending() {
     Set<ContainerReplica> replicas
         = createReplicas(container.containerID(), 0, 0);
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        ADD, MockDatanodeDetails.randomDatanodeDetails(), 0));
+    pending.add(new ContainerReplicaOp(
+        ADD, MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
     requestBuilder.setContainerReplicas(replicas)
         .setPendingOps(pending)
         .setContainerInfo(container);
@@ -275,8 +275,8 @@ public void 
testUnderReplicatedDueToOutOfServiceFixedWithPending() {
         Pair.of(IN_SERVICE, 0), Pair.of(IN_SERVICE, 0),
         Pair.of(DECOMMISSIONED, 0));
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        ADD, MockDatanodeDetails.randomDatanodeDetails(), 0));
+    pending.add(new ContainerReplicaOp(
+        ADD, MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
 
     requestBuilder.setContainerReplicas(replicas)
         .setPendingOps(pending)
@@ -303,8 +303,8 @@ public void 
testUnderReplicatedDueToOutOfServiceAndMissing() {
     Set<ContainerReplica> replicas = createReplicas(container.containerID(),
         Pair.of(IN_SERVICE, 0), Pair.of(DECOMMISSIONED, 0));
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        ADD, MockDatanodeDetails.randomDatanodeDetails(), 0));
+    pending.add(new ContainerReplicaOp(
+        ADD, MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
 
     requestBuilder.setContainerReplicas(replicas)
         .setPendingOps(pending)
@@ -453,10 +453,10 @@ public void testOverReplicatedContainer() {
         Pair.of(IN_SERVICE, 0), Pair.of(IN_SERVICE, 0));
 
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        DELETE, MockDatanodeDetails.randomDatanodeDetails(), 0));
-    pending.add(ContainerReplicaOp.create(
-        DELETE, MockDatanodeDetails.randomDatanodeDetails(), 0));
+    pending.add(new ContainerReplicaOp(
+        DELETE, MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
+    pending.add(new ContainerReplicaOp(
+        DELETE, MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
 
     requestBuilder.setContainerReplicas(replicas)
         .setPendingOps(pending)
@@ -667,8 +667,8 @@ public void testOverReplicatedContainerFixedByPending() {
         Pair.of(IN_SERVICE, 0), Pair.of(IN_SERVICE, 0));
 
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        DELETE, MockDatanodeDetails.randomDatanodeDetails(), 0));
+    pending.add(new ContainerReplicaOp(
+        DELETE, MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
 
     requestBuilder.setContainerReplicas(replicas)
         .setPendingOps(pending)
@@ -825,10 +825,10 @@ public void 
testUnderReplicatedWithMisReplicationFixedByPending() {
         = createReplicas(container.containerID(), 0, 0);
 
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        ADD, MockDatanodeDetails.randomDatanodeDetails(), 0));
-    pending.add(ContainerReplicaOp.create(
-        ADD, MockDatanodeDetails.randomDatanodeDetails(), 0));
+    pending.add(new ContainerReplicaOp(
+        ADD, MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
+    pending.add(new ContainerReplicaOp(
+        ADD, MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
 
     requestBuilder.setContainerReplicas(replicas)
         .setContainerInfo(container)
@@ -896,10 +896,10 @@ public void testMisReplicatedFixedByPending() {
         = createReplicas(container.containerID(), 0, 0, 0);
 
     List<ContainerReplicaOp> pending = new ArrayList<>();
-    pending.add(ContainerReplicaOp.create(
-        ADD, MockDatanodeDetails.randomDatanodeDetails(), 0));
-    pending.add(ContainerReplicaOp.create(
-        ADD, MockDatanodeDetails.randomDatanodeDetails(), 0));
+    pending.add(new ContainerReplicaOp(
+        ADD, MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
+    pending.add(new ContainerReplicaOp(
+        ADD, MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
 
     requestBuilder.setContainerReplicas(replicas)
         .setContainerInfo(container)
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestRatisUnhealthyReplicationCheckHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestRatisUnhealthyReplicationCheckHandler.java
index 1499b43f69c..08a4c68375a 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestRatisUnhealthyReplicationCheckHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestRatisUnhealthyReplicationCheckHandler.java
@@ -167,9 +167,9 @@ public void 
shouldReturnTrueForUnderReplicatedUnhealthyReplicas() {
         = createReplicas(container.containerID(),
         ContainerReplicaProto.State.UNHEALTHY, 0);
     List<ContainerReplicaOp> pendingOps =
-        ImmutableList.of(ContainerReplicaOp.create(
+        ImmutableList.of(new ContainerReplicaOp(
             ContainerReplicaOp.PendingOpType.ADD,
-            MockDatanodeDetails.randomDatanodeDetails(), 0));
+            MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
     requestBuilder.setContainerReplicas(replicas)
         .setContainerInfo(container)
         .setPendingOps(pendingOps);
@@ -201,9 +201,9 @@ public void testUnderReplicatedFixedByPendingAdd() {
         = createReplicas(container.containerID(),
         ContainerReplicaProto.State.UNHEALTHY, 0, 0);
     List<ContainerReplicaOp> pendingOps =
-        ImmutableList.of(ContainerReplicaOp.create(
+        ImmutableList.of(new ContainerReplicaOp(
             ContainerReplicaOp.PendingOpType.ADD,
-            MockDatanodeDetails.randomDatanodeDetails(), 0));
+            MockDatanodeDetails.randomDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
     requestBuilder.setContainerReplicas(replicas)
         .setContainerInfo(container)
         .setPendingOps(pendingOps);
@@ -235,9 +235,9 @@ public void testUnderReplicatedDueToPendingDelete() {
         = createReplicas(container.containerID(),
         ContainerReplicaProto.State.UNHEALTHY, 0, 0, 0);
     List<ContainerReplicaOp> pendingOps =
-        ImmutableList.of(ContainerReplicaOp.create(
+        ImmutableList.of(new ContainerReplicaOp(
             ContainerReplicaOp.PendingOpType.DELETE,
-            replicas.stream().findFirst().get().getDatanodeDetails(), 0));
+            replicas.stream().findFirst().get().getDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
     requestBuilder.setContainerReplicas(replicas)
         .setContainerInfo(container)
         .setPendingOps(pendingOps);
@@ -297,9 +297,9 @@ public void testOverReplicationFixedByPendingDelete() {
         = createReplicas(container.containerID(),
         ContainerReplicaProto.State.UNHEALTHY, 0, 0, 0, 0);
     List<ContainerReplicaOp> pendingOps =
-        ImmutableList.of(ContainerReplicaOp.create(
+        ImmutableList.of(new ContainerReplicaOp(
             ContainerReplicaOp.PendingOpType.DELETE,
-            replicas.stream().findFirst().get().getDatanodeDetails(), 0));
+            replicas.stream().findFirst().get().getDatanodeDetails(), 0, null, 
Long.MAX_VALUE, 0));
     requestBuilder.setContainerReplicas(replicas)
         .setContainerInfo(container)
         .setPendingOps(pendingOps);
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
index d94c54e826e..90301d6fccd 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
@@ -158,7 +158,7 @@ ContainerManager createContainerManager()
         scmhaManager, sequenceIdGen, pipelineManager,
         SCMDBDefinition.CONTAINERS.getTable(dbStore),
         new ContainerReplicaPendingOps(
-            Clock.system(ZoneId.systemDefault())));
+            Clock.system(ZoneId.systemDefault()), null));
   }
 
   /**
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestSCMSafeModeManager.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestSCMSafeModeManager.java
index 405a3de340a..1cbd6bc3725 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestSCMSafeModeManager.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestSCMSafeModeManager.java
@@ -549,7 +549,7 @@ public void testContainerSafeModeRuleEC(int data, int 
parity) throws Exception {
     ContainerManager containerManager = new ContainerManagerImpl(config,
         SCMHAManagerStub.getInstance(true), null, pipelineManager,
         scmMetadataStore.getContainerTable(),
-        new ContainerReplicaPendingOps(Clock.system(ZoneId.systemDefault())));
+        new ContainerReplicaPendingOps(Clock.system(ZoneId.systemDefault()), 
null));
 
     scmSafeModeManager = new SCMSafeModeManager(config, nodeManager, 
pipelineManager,
         containerManager, serviceManager, queue, scmContext);
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/AbstractReconContainerManagerTest.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/AbstractReconContainerManagerTest.java
index 2490d351ee0..33e20413bfd 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/AbstractReconContainerManagerTest.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/AbstractReconContainerManagerTest.java
@@ -104,7 +104,7 @@ public void setUp(@TempDir File tempDir) throws Exception {
         scmhaManager,
         scmContext);
     ContainerReplicaPendingOps pendingOps = new ContainerReplicaPendingOps(
-        Clock.system(ZoneId.systemDefault()));
+        Clock.system(ZoneId.systemDefault()), null);
 
     containerManager = new ReconContainerManager(
         conf,


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

Reply via email to