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 8ac62eb954 HDDS-8813. Prepare for dynamic config in ReplicationManager
(#4874)
8ac62eb954 is described below
commit 8ac62eb954099bb41cc90cdf9db2a664f23b739f
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Tue Jun 13 07:49:15 2023 +0200
HDDS-8813. Prepare for dynamic config in ReplicationManager (#4874)
---
.../replication/OverReplicatedProcessor.java | 6 +-
.../container/replication/ReplicationManager.java | 171 +++++++++------------
.../replication/UnderReplicatedProcessor.java | 8 +-
.../replication/UnhealthyReplicationProcessor.java | 15 +-
.../replication/TestOverReplicatedProcessor.java | 2 +-
.../replication/TestUnderReplicatedProcessor.java | 2 +-
6 files changed, 98 insertions(+), 106 deletions(-)
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/OverReplicatedProcessor.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/OverReplicatedProcessor.java
index 9868d6e03c..32dfce119d 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/OverReplicatedProcessor.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/OverReplicatedProcessor.java
@@ -18,6 +18,8 @@
package org.apache.hadoop.hdds.scm.container.replication;
import java.io.IOException;
+import java.time.Duration;
+import java.util.function.Supplier;
/**
* Class used to pick messages from the ReplicationManager over replicated
@@ -28,8 +30,8 @@ public class OverReplicatedProcessor extends
UnhealthyReplicationProcessor
<ContainerHealthResult.OverReplicatedHealthResult> {
public OverReplicatedProcessor(ReplicationManager replicationManager,
- long intervalInMillis) {
- super(replicationManager, intervalInMillis);
+ Supplier<Duration> interval) {
+ super(replicationManager, interval);
}
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManager.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManager.java
index 460655ba39..2cc64f8ed5 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManager.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManager.java
@@ -22,6 +22,7 @@ import com.google.common.annotations.VisibleForTesting;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.hadoop.hdds.HddsConfigKeys;
+import org.apache.hadoop.hdds.client.ReplicationConfig;
import org.apache.hadoop.hdds.conf.Config;
import org.apache.hadoop.hdds.conf.ConfigGroup;
import org.apache.hadoop.hdds.conf.ConfigType;
@@ -95,7 +96,6 @@ import static
org.apache.hadoop.hdds.protocol.DatanodeDetails.isDecommission;
import static org.apache.hadoop.hdds.protocol.DatanodeDetails.isMaintenance;
import static
org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState.HEALTHY;
import static
org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType.EC;
-import static
org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType.RATIS;
/**
* Replication Manager (RM) is the one which is responsible for making sure
@@ -190,17 +190,11 @@ public class ReplicationManager implements SCMService {
private final RatisUnderReplicationHandler ratisUnderReplicationHandler;
private final RatisOverReplicationHandler ratisOverReplicationHandler;
private final RatisMisReplicationHandler ratisMisReplicationHandler;
- private final int maintenanceRedundancy;
- private final int ratisMaintenanceMinReplicas;
private Thread underReplicatedProcessorThread;
private Thread overReplicatedProcessorThread;
private final UnderReplicatedProcessor underReplicatedProcessor;
private final OverReplicatedProcessor overReplicatedProcessor;
private final HealthCheck containerCheckChain;
- private final int datanodeReplicationLimit;
- private final int reconstructionCommandWeight;
- private final int datanodeDeleteLimit;
- private final double inflightReplicationFactor;
/**
* Constructs ReplicationManager instance with the given configuration.
@@ -236,7 +230,6 @@ public class ReplicationManager implements SCMService {
this.running = false;
this.clock = clock;
this.containerReport = new ReplicationManagerReport();
- this.metrics = null;
this.eventPublisher = eventPublisher;
this.waitTimeInMillis = conf.getTimeDuration(
HddsConfigKeys.HDDS_SCM_WAIT_TIME_AFTER_SAFE_MODE_EXIT,
@@ -249,12 +242,6 @@ public class ReplicationManager implements SCMService {
this.ratisReplicationCheckHandler =
new RatisReplicationCheckHandler(ratisContainerPlacement);
this.nodeManager = nodeManager;
- this.maintenanceRedundancy = rmConf.maintenanceRemainingRedundancy;
- this.ratisMaintenanceMinReplicas = rmConf.getMaintenanceReplicaMinimum();
- this.datanodeReplicationLimit = rmConf.getDatanodeReplicationLimit();
- this.reconstructionCommandWeight = rmConf.getReconstructionCommandWeight();
- this.datanodeDeleteLimit = rmConf.getDatanodeDeleteLimit();
- this.inflightReplicationFactor =
rmConf.getInflightReplicationLimitFactor();
ecUnderReplicationHandler = new ECUnderReplicationHandler(
ecContainerPlacement, conf, this);
@@ -269,11 +256,9 @@ public class ReplicationManager implements SCMService {
ratisMisReplicationHandler = new RatisMisReplicationHandler(
ratisContainerPlacement, conf, this);
underReplicatedProcessor =
- new UnderReplicatedProcessor(this,
- rmConf.getUnderReplicatedInterval());
+ new UnderReplicatedProcessor(this, rmConf::getUnderReplicatedInterval);
overReplicatedProcessor =
- new OverReplicatedProcessor(this,
- rmConf.getOverReplicatedInterval());
+ new OverReplicatedProcessor(this, rmConf::getOverReplicatedInterval);
// Chain together the series of checks that are needed to validate the
// containers when they are checked by RM.
@@ -386,7 +371,7 @@ public class ReplicationManager implements SCMService {
break;
}
report.increment(c.getState());
- if (c.getReplicationType() != EC && rmConf.isLegacyEnabled()) {
+ if (rmConf.isLegacyEnabled() && !isEC(c.getReplicationConfig())) {
legacyReplicationManager.processContainer(c, report);
continue;
}
@@ -416,7 +401,8 @@ public class ReplicationManager implements SCMService {
* inflight replications allowed across the cluster at any given
time.
*/
public long getReplicationInFlightLimit() {
- if (inflightReplicationFactor <= 0) {
+ final double factor = rmConf.getInflightReplicationLimitFactor();
+ if (factor <= 0) {
return 0;
}
// Any healthy node in the cluster can participate in replication by being
@@ -425,8 +411,8 @@ public class ReplicationManager implements SCMService {
// dead. Therefore we simply count the number of healthy nodes and include
// those which are not in service.
int healthyNodes = nodeManager.getNodeCount(null, HEALTHY);
- return (long) Math.ceil(
- healthyNodes * datanodeReplicationLimit * inflightReplicationFactor);
+ return (long) Math.ceil(healthyNodes * rmConf.getDatanodeReplicationLimit()
+ * factor);
}
/**
@@ -502,12 +488,13 @@ public class ReplicationManager implements SCMService {
try {
int commandCount = nodeManager.getTotalDatanodeCommandCount(datanode,
Type.deleteContainerCommand);
- if (commandCount >= datanodeDeleteLimit) {
+ int deleteLimit = rmConf.getDatanodeDeleteLimit();
+ if (commandCount >= deleteLimit) {
metrics.incrDeleteContainerCmdsDeferredTotal();
throw new CommandTargetOverloadedException("Cannot schedule a delete "
+
"container command for container " + container.containerID() +
" on datanode " + datanode + " as it has too many pending delete "
+
- "commands (" + commandCount + ")");
+ "commands (" + commandCount + " > " + deleteLimit + ")");
}
sendDeleteCommand(container, replicaIndex, datanode, force);
} catch (NodeNotFoundException e) {
@@ -561,7 +548,7 @@ public class ReplicationManager implements SCMService {
"available for reconstruction of " + containerInfo.getContainerID());
}
DatanodeDetails target = selectAndOptionallyExcludeDatanode(
- reconstructionCommandWeight, targetWithCmds);
+ rmConf.getReconstructionCommandWeight(), targetWithCmds);
sendDatanodeCommand(command, containerInfo, target);
}
@@ -600,9 +587,8 @@ public class ReplicationManager implements SCMService {
int replicationLimit = getReplicationLimit(dn);
if (totalCount >= replicationLimit) {
LOG.debug("Datanode {} has reached the maximum of {} queued " +
- "commands for state {}, replication + reconstruction * {}: {}",
- dn, replicationLimit, dn.getPersistedOpState(),
- reconstructionCommandWeight, totalCount);
+ "commands for state {}: {}",
+ dn, replicationLimit, dn.getPersistedOpState(), totalCount);
addExcludedNode(dn);
continue;
}
@@ -622,7 +608,8 @@ public class ReplicationManager implements SCMService {
Type.reconstructECContainersCommand);
int replicateCount = counts.get(Type.replicateContainerCommand);
int reconstructCount = counts.get(Type.reconstructECContainersCommand);
- return replicateCount + reconstructCount * reconstructionCommandWeight;
+ return replicateCount +
+ reconstructCount * rmConf.getReconstructionCommandWeight();
}
/**
@@ -767,32 +754,24 @@ public class ReplicationManager implements SCMService {
containerID);
List<ContainerReplicaOp> pendingOps =
containerReplicaPendingOps.getPendingOps(containerID);
- if (result.getContainerInfo().getReplicationType() == EC) {
- if (result.getHealthState()
- == ContainerHealthResult.HealthState.UNDER_REPLICATED) {
- return ecUnderReplicationHandler.processAndSendCommands(replicas,
- pendingOps, result, maintenanceRedundancy);
- } else if (result.getHealthState()
- == ContainerHealthResult.HealthState.MIS_REPLICATED) {
- return ecMisReplicationHandler.processAndSendCommands(replicas,
- pendingOps, result, maintenanceRedundancy);
- } else {
- throw new IllegalArgumentException("Unexpected health state: "
- + result.getHealthState());
- }
- }
+
+ final boolean isEC =
isEC(result.getContainerInfo().getReplicationConfig());
+ final UnhealthyReplicationHandler handler;
+
if (result.getHealthState()
== ContainerHealthResult.HealthState.UNDER_REPLICATED) {
- return ratisUnderReplicationHandler.processAndSendCommands(replicas,
- pendingOps, result, ratisMaintenanceMinReplicas);
+ handler = isEC ? ecUnderReplicationHandler
+ : ratisUnderReplicationHandler;
} else if (result.getHealthState()
== ContainerHealthResult.HealthState.MIS_REPLICATED) {
- return ratisMisReplicationHandler.processAndSendCommands(replicas,
- pendingOps, result, ratisMaintenanceMinReplicas);
+ handler = isEC ? ecMisReplicationHandler : ratisMisReplicationHandler;
} else {
throw new IllegalArgumentException("Unexpected health state: "
+ result.getHealthState());
}
+
+ return handler.processAndSendCommands(replicas, pendingOps, result,
+ getRemainingMaintenanceRedundancy(isEC));
}
int processOverReplicatedContainer(
@@ -802,12 +781,13 @@ public class ReplicationManager implements SCMService {
containerID);
List<ContainerReplicaOp> pendingOps =
containerReplicaPendingOps.getPendingOps(containerID);
- if (result.getContainerInfo().getReplicationType() == EC) {
- return ecOverReplicationHandler.processAndSendCommands(replicas,
- pendingOps, result, maintenanceRedundancy);
- }
- return ratisOverReplicationHandler.processAndSendCommands(replicas,
- pendingOps, result, ratisMaintenanceMinReplicas);
+
+ final boolean isEC =
isEC(result.getContainerInfo().getReplicationConfig());
+ final UnhealthyReplicationHandler handler = isEC ? ecOverReplicationHandler
+ : ratisOverReplicationHandler;
+
+ return handler.processAndSendCommands(replicas,
+ pendingOps, result, getRemainingMaintenanceRedundancy(isEC));
}
public long getScmTerm() throws NotLeaderException {
@@ -858,21 +838,17 @@ public class ReplicationManager implements SCMService {
throws ContainerNotFoundException {
synchronized (containerInfo) {
ContainerID containerID = containerInfo.containerID();
+ final boolean isEC = isEC(containerInfo.getReplicationConfig());
+
Set<ContainerReplica> replicas = containerManager.getContainerReplicas(
containerID);
List<ContainerReplicaOp> pendingOps =
containerReplicaPendingOps.getPendingOps(containerID);
- // There is a different config for EC and Ratis maintenance
- // minimum replicas, so we must pass through the correct one.
- int maintRedundancy = maintenanceRedundancy;
- if (containerInfo.getReplicationType() == RATIS) {
- maintRedundancy = ratisMaintenanceMinReplicas;
- }
ContainerCheckRequest checkRequest = new ContainerCheckRequest.Builder()
.setContainerInfo(containerInfo)
.setContainerReplicas(replicas)
- .setMaintenanceRedundancy(maintRedundancy)
+ .setMaintenanceRedundancy(getRemainingMaintenanceRedundancy(isEC))
.setReport(report)
.setPendingOps(pendingOps)
.setReplicationQueue(repQueue)
@@ -931,11 +907,10 @@ public class ReplicationManager implements SCMService {
* interval and processes all the containers in the system.
*/
private synchronized void run() {
- final long interval = rmConf.getInterval().toMillis();
try {
while (running) {
processAll();
- wait(interval);
+ wait(rmConf.getInterval().toMillis());
}
} catch (Throwable t) {
if (t instanceof InterruptedException) {
@@ -958,14 +933,12 @@ public class ReplicationManager implements SCMService {
public ContainerReplicaCount getContainerReplicaCount(ContainerID
containerID)
throws ContainerNotFoundException {
ContainerInfo container = containerManager.getContainer(containerID);
- if (container.getReplicationType() == EC) {
- return getECContainerReplicaCount(container);
- }
+ final boolean isEC = isEC(container.getReplicationConfig());
- if (rmConf.isLegacyEnabled()) {
+ if (!isEC && rmConf.isLegacyEnabled()) {
return legacyReplicationManager.getContainerReplicaCount(container);
} else {
- return getRatisContainerReplicaCount(container);
+ return getContainerReplicaCount(container, isEC);
}
}
@@ -977,16 +950,18 @@ public class ReplicationManager implements SCMService {
*/
public ContainerHealthResult getContainerReplicationHealth(
ContainerInfo containerInfo, Set<ContainerReplica> replicas) {
- ContainerCheckRequest.Builder request = new ContainerCheckRequest.Builder()
+ final boolean isEC = isEC(containerInfo.getReplicationConfig());
+ ContainerCheckRequest request = new ContainerCheckRequest.Builder()
.setContainerInfo(containerInfo)
.setContainerReplicas(replicas)
- .setPendingOps(getPendingReplicationOps(containerInfo.containerID()));
- if (containerInfo.getReplicationConfig().getReplicationType() == EC) {
- request.setMaintenanceRedundancy(maintenanceRedundancy);
- return ecReplicationCheckHandler.checkHealth(request.build());
+ .setPendingOps(getPendingReplicationOps(containerInfo.containerID()))
+ .setMaintenanceRedundancy(getRemainingMaintenanceRedundancy(isEC))
+ .build();
+
+ if (isEC) {
+ return ecReplicationCheckHandler.checkHealth(request);
} else {
- request.setMaintenanceRedundancy(ratisMaintenanceMinReplicas);
- return ratisReplicationCheckHandler.checkHealth(request.build());
+ return ratisReplicationCheckHandler.checkHealth(request);
}
}
@@ -1305,8 +1280,8 @@ public class ReplicationManager implements SCMService {
return Duration.ofMillis(interval);
}
- public long getUnderReplicatedInterval() {
- return underReplicatedInterval;
+ public Duration getUnderReplicatedInterval() {
+ return Duration.ofMillis(underReplicatedInterval);
}
public void setUnderReplicatedInterval(Duration duration) {
@@ -1317,8 +1292,8 @@ public class ReplicationManager implements SCMService {
this.overReplicatedInterval = duration.toMillis();
}
- public long getOverReplicatedInterval() {
- return overReplicatedInterval;
+ public Duration getOverReplicatedInterval() {
+ return Duration.ofMillis(overReplicatedInterval);
}
public long getEventTimeout() {
@@ -1466,24 +1441,20 @@ public class ReplicationManager implements SCMService {
}
}
- private ECContainerReplicaCount getECContainerReplicaCount(
- ContainerInfo containerInfo) throws ContainerNotFoundException {
- Set<ContainerReplica> replicas = containerManager.getContainerReplicas(
- containerInfo.containerID());
- List<ContainerReplicaOp> pendingOps =
- containerReplicaPendingOps.getPendingOps(containerInfo.containerID());
- return new ECContainerReplicaCount(
- containerInfo, replicas, pendingOps, maintenanceRedundancy);
- }
+ private ContainerReplicaCount getContainerReplicaCount(
+ ContainerInfo container, boolean isEC) throws ContainerNotFoundException
{
- private RatisContainerReplicaCount getRatisContainerReplicaCount(
- ContainerInfo containerInfo) throws ContainerNotFoundException {
- Set<ContainerReplica> replicas =
- containerManager.getContainerReplicas(containerInfo.containerID());
+ ContainerID id = container.containerID();
+ Set<ContainerReplica> replicas = containerManager.getContainerReplicas(id);
List<ContainerReplicaOp> pendingOps =
- containerReplicaPendingOps.getPendingOps(containerInfo.containerID());
- return new RatisContainerReplicaCount(containerInfo, replicas, pendingOps,
- ratisMaintenanceMinReplicas, false);
+ containerReplicaPendingOps.getPendingOps(id);
+ final int redundancy = getRemainingMaintenanceRedundancy(isEC);
+
+ return isEC
+ ? new ECContainerReplicaCount(container, replicas, pendingOps,
+ redundancy)
+ : new RatisContainerReplicaCount(container, replicas, pendingOps,
+ redundancy, false);
}
public ContainerReplicaPendingOps getContainerReplicaPendingOps() {
@@ -1492,7 +1463,7 @@ public class ReplicationManager implements SCMService {
private int getReplicationLimit(DatanodeDetails datanode) {
HddsProtos.NodeOperationalState state = datanode.getPersistedOpState();
- int limit = datanodeReplicationLimit;
+ int limit = rmConf.getDatanodeReplicationLimit();
if (isMaintenance(state) || isDecommission(state)) {
limit = replicationServerConf.scaleOutOfServiceLimit(limit);
}
@@ -1512,5 +1483,15 @@ public class ReplicationManager implements SCMService {
throw new IllegalStateException("Unable to find NodeStatus for " + dn,
e);
}
}
+
+ private int getRemainingMaintenanceRedundancy(boolean isEC) {
+ return isEC
+ ? rmConf.getMaintenanceRemainingRedundancy()
+ : rmConf.getMaintenanceReplicaMinimum();
+ }
+
+ private static boolean isEC(ReplicationConfig replicationConfig) {
+ return replicationConfig.getReplicationType() == EC;
+ }
}
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/UnderReplicatedProcessor.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/UnderReplicatedProcessor.java
index 20ff8fdff0..cb52714f49 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/UnderReplicatedProcessor.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/UnderReplicatedProcessor.java
@@ -18,6 +18,8 @@
package org.apache.hadoop.hdds.scm.container.replication;
import java.io.IOException;
+import java.time.Duration;
+import java.util.function.Supplier;
/**
* Class used to pick messages from the ReplicationManager under replicated
@@ -27,9 +29,9 @@ import java.io.IOException;
public class UnderReplicatedProcessor extends UnhealthyReplicationProcessor
<ContainerHealthResult.UnderReplicatedHealthResult> {
- public UnderReplicatedProcessor(ReplicationManager replicationManager,
- long intervalInMillis) {
- super(replicationManager, intervalInMillis);
+ UnderReplicatedProcessor(ReplicationManager replicationManager,
+ Supplier<Duration> interval) {
+ super(replicationManager, interval);
}
@Override
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/UnhealthyReplicationProcessor.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/UnhealthyReplicationProcessor.java
index f237a913f3..1f04edd2ee 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/UnhealthyReplicationProcessor.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/UnhealthyReplicationProcessor.java
@@ -25,9 +25,11 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
+import java.time.Duration;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.function.Supplier;
/**
* Class used to pick messages from the respective ReplicationManager
@@ -41,12 +43,12 @@ public abstract class
UnhealthyReplicationProcessor<HealthResult extends
.getLogger(UnhealthyReplicationProcessor.class);
private final ReplicationManager replicationManager;
private volatile boolean runImmediately = false;
- private final long intervalInMillis;
+ private final Supplier<Duration> interval;
public UnhealthyReplicationProcessor(ReplicationManager replicationManager,
- long intervalInMillis) {
+ Supplier<Duration> interval) {
this.replicationManager = replicationManager;
- this.intervalInMillis = intervalInMillis;
+ this.interval = interval;
}
/**
@@ -160,9 +162,14 @@ public abstract class
UnhealthyReplicationProcessor<HealthResult extends
if (replicationManager.shouldRun()) {
processAll(replicationManager.getQueue());
}
+
+ final Duration duration = interval.get();
+ if (!runImmediately && LOG.isDebugEnabled()) {
+ LOG.debug("May wait {} before next run", duration);
+ }
synchronized (this) {
if (!runImmediately) {
- wait(intervalInMillis);
+ wait(duration.toMillis());
}
runImmediately = false;
}
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestOverReplicatedProcessor.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestOverReplicatedProcessor.java
index 65d517fbb3..3ef1c8f989 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestOverReplicatedProcessor.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestOverReplicatedProcessor.java
@@ -55,7 +55,7 @@ public class TestOverReplicatedProcessor {
queue = new ReplicationQueue();
repConfig = new ECReplicationConfig(3, 2);
overReplicatedProcessor = new OverReplicatedProcessor(
- replicationManager, rmConf.getOverReplicatedInterval());
+ replicationManager, rmConf::getOverReplicatedInterval);
Mockito.when(replicationManager.shouldRun()).thenReturn(true);
// Even through the limit has been exceeded, it should not stop over-rep
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestUnderReplicatedProcessor.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestUnderReplicatedProcessor.java
index 60584a3e88..d7c3f220a4 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestUnderReplicatedProcessor.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestUnderReplicatedProcessor.java
@@ -56,7 +56,7 @@ public class TestUnderReplicatedProcessor {
queue = new ReplicationQueue();
repConfig = new ECReplicationConfig(3, 2);
underReplicatedProcessor = new UnderReplicatedProcessor(
- replicationManager, rmConf.getUnderReplicatedInterval());
+ replicationManager, rmConf::getUnderReplicatedInterval);
Mockito.when(replicationManager.shouldRun()).thenReturn(true);
Mockito.when(replicationManager.getMetrics())
.thenReturn(ReplicationManagerMetrics.create(replicationManager));
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]