HDDS-2198. SCM should not consider containers in CLOSING state to come out of safemode. (#1540)
This commit is contained in:
parent
1dde3efb91
commit
cdaa480dbf
|
@ -19,6 +19,7 @@ package org.apache.hadoop.hdds.scm.safemode;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
|
@ -63,19 +64,18 @@ public class ContainerSafeModeRule extends
|
||||||
" value should be >= 0.0 and <= 1.0");
|
" value should be >= 0.0 and <= 1.0");
|
||||||
|
|
||||||
containerMap = new ConcurrentHashMap<>();
|
containerMap = new ConcurrentHashMap<>();
|
||||||
if(containers != null) {
|
containers.forEach(container -> {
|
||||||
containers.forEach(c -> {
|
// There can be containers in OPEN/CLOSING state which were never
|
||||||
// TODO: There can be containers in OPEN state which were never
|
// created by the client. We are not considering these containers for
|
||||||
// created by the client. We are not considering these containers for
|
// now. These containers can be handled by tracking pipelines.
|
||||||
// now. These containers can be handled by tracking pipelines.
|
|
||||||
if (c != null && c.getState() != null &&
|
|
||||||
!c.getState().equals(HddsProtos.LifeCycleState.OPEN)) {
|
|
||||||
containerMap.put(c.getContainerID(), c);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
maxContainer = containerMap.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
Optional.ofNullable(container.getState())
|
||||||
|
.filter(state -> state != HddsProtos.LifeCycleState.OPEN)
|
||||||
|
.filter(state -> state != HddsProtos.LifeCycleState.CLOSING)
|
||||||
|
.ifPresent(s -> containerMap.put(container.getContainerID(),
|
||||||
|
container));
|
||||||
|
});
|
||||||
|
maxContainer = containerMap.size();
|
||||||
long cutOff = (long) Math.ceil(maxContainer * safeModeCutoff);
|
long cutOff = (long) Math.ceil(maxContainer * safeModeCutoff);
|
||||||
getSafeModeMetrics().setNumContainerWithOneReplicaReportedThreshold(cutOff);
|
getSafeModeMetrics().setNumContainerWithOneReplicaReportedThreshold(cutOff);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ import static org.junit.Assert.fail;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@ -60,7 +61,7 @@ public class TestSCMSafeModeManager {
|
||||||
private static EventQueue queue;
|
private static EventQueue queue;
|
||||||
private SCMSafeModeManager scmSafeModeManager;
|
private SCMSafeModeManager scmSafeModeManager;
|
||||||
private static Configuration config;
|
private static Configuration config;
|
||||||
private List<ContainerInfo> containers;
|
private List<ContainerInfo> containers = Collections.emptyList();
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public Timeout timeout = new Timeout(1000 * 300);
|
public Timeout timeout = new Timeout(1000 * 300);
|
||||||
|
@ -85,7 +86,8 @@ public class TestSCMSafeModeManager {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSafeModeStateWithNullContainers() {
|
public void testSafeModeStateWithNullContainers() {
|
||||||
new SCMSafeModeManager(config, null, null, queue);
|
new SCMSafeModeManager(config, Collections.emptyList(),
|
||||||
|
null, queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void testSafeMode(int numContainers) throws Exception {
|
private void testSafeMode(int numContainers) throws Exception {
|
||||||
|
|
Loading…
Reference in New Issue