HDDS-2198. SCM should not consider containers in CLOSING state to come out of safemode. (#1540)

This commit is contained in:
Nanda kumar 2019-10-04 08:20:58 +05:30 committed by GitHub
parent 1dde3efb91
commit cdaa480dbf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 14 deletions

View File

@ -19,6 +19,7 @@ package org.apache.hadoop.hdds.scm.safemode;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
@ -63,19 +64,18 @@ public class ContainerSafeModeRule extends
" value should be >= 0.0 and <= 1.0");
containerMap = new ConcurrentHashMap<>();
if(containers != null) {
containers.forEach(c -> {
// TODO: There can be containers in OPEN state which were never
containers.forEach(container -> {
// There can be containers in OPEN/CLOSING state which were never
// created by the client. We are not considering these containers for
// 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);
}
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);
getSafeModeMetrics().setNumContainerWithOneReplicaReportedThreshold(cutOff);
}

View File

@ -23,6 +23,7 @@ import static org.junit.Assert.fail;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
@ -60,7 +61,7 @@ public class TestSCMSafeModeManager {
private static EventQueue queue;
private SCMSafeModeManager scmSafeModeManager;
private static Configuration config;
private List<ContainerInfo> containers;
private List<ContainerInfo> containers = Collections.emptyList();
@Rule
public Timeout timeout = new Timeout(1000 * 300);
@ -85,7 +86,8 @@ public class TestSCMSafeModeManager {
@Test
public void testSafeModeStateWithNullContainers() {
new SCMSafeModeManager(config, null, null, queue);
new SCMSafeModeManager(config, Collections.emptyList(),
null, queue);
}
private void testSafeMode(int numContainers) throws Exception {