Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeOperationalState;
import org.apache.hadoop.hdds.scm.DatanodeAdminError;
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
Expand Down Expand Up @@ -268,11 +269,18 @@ public synchronized void startDecommission(DatanodeDetails dn)
throws NodeNotFoundException, InvalidNodeStateException {
NodeStatus nodeStatus = getNodeStatus(dn);
NodeOperationalState opState = nodeStatus.getOperationalState();
HddsProtos.NodeState health = nodeStatus.getHealth();
if (opState == NodeOperationalState.IN_SERVICE) {
LOG.info("Starting Decommission for node {}", dn);
nodeManager.setNodeOperationalState(
dn, NodeOperationalState.DECOMMISSIONING);
monitor.startMonitoring(dn);
if (health != HddsProtos.NodeState.DEAD) {
LOG.info("Starting Decommission for node {}", dn);
nodeManager.setNodeOperationalState(
dn, NodeOperationalState.DECOMMISSIONING);
monitor.startMonitoring(dn);
} else {
LOG.info("{} is dead. Moving to decommissioned immediately", dn);
nodeManager.setNodeOperationalState(
dn, NodeOperationalState.DECOMMISSIONED);
}
} else if (nodeStatus.isDecommission()) {
LOG.info("Start Decommission called on node {} in state {}. Nothing to "+
"do.", dn, opState);
Expand Down Expand Up @@ -354,11 +362,18 @@ public synchronized void startMaintenance(DatanodeDetails dn, int endInHours)
maintenanceEnd =
(System.currentTimeMillis() / 1000L) + (endInHours * 60L * 60L);
}
HddsProtos.NodeState health = nodeStatus.getHealth();
if (opState == NodeOperationalState.IN_SERVICE) {
nodeManager.setNodeOperationalState(
dn, NodeOperationalState.ENTERING_MAINTENANCE, maintenanceEnd);
monitor.startMonitoring(dn);
LOG.info("Starting Maintenance for node {}", dn);
if (health != HddsProtos.NodeState.DEAD) {
nodeManager.setNodeOperationalState(
dn, NodeOperationalState.ENTERING_MAINTENANCE, maintenanceEnd);
monitor.startMonitoring(dn);
LOG.info("Starting Maintenance for node {}", dn);
} else {
LOG.info("{} is dead. Moving to maintenance immediately", dn);
nodeManager.setNodeOperationalState(
dn, NodeOperationalState.IN_MAINTENANCE);
}
} else if (nodeStatus.isMaintenance()) {
LOG.info("Starting Maintenance called on node {} with state {}. "+
"Nothing to do.", dn, opState);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.hdds.scm.TestUtils;
import org.apache.hadoop.hdds.scm.DatanodeAdminError;
import org.apache.hadoop.hdds.scm.container.SimpleMockNodeManager;
import org.apache.hadoop.hdds.scm.ha.SCMContext;
import org.apache.hadoop.hdds.scm.node.states.NodeNotFoundException;
import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
Expand Down Expand Up @@ -176,6 +177,22 @@ public void testNodesCanBeDecommissionedAndRecommissioned()
nodeManager.getNodeStatus(dns.get(10)).getOperationalState());
}

@Test
public void testDeadNodeDecommissionsImmediately()
throws NodeNotFoundException, InvalidNodeStateException {
List<DatanodeDetails> dns = generateDatanodes();
DatanodeDetails dn = dns.get(1);

SimpleMockNodeManager mockNM = new SimpleMockNodeManager();
mockNM.register(dn, NodeStatus.inServiceDead());
NodeDecommissionManager decomMgr = new NodeDecommissionManager(conf, mockNM,
null, SCMContext.emptyContext(), new EventQueue(), null);

decomMgr.startDecommission(dns.get(1));
assertEquals(HddsProtos.NodeOperationalState.DECOMMISSIONED,
mockNM.getNodeStatus(dns.get(1)).getOperationalState());
}

@Test
public void testNodesCanBePutIntoMaintenanceAndRecommissioned()
throws InvalidHostStringException, NodeNotFoundException {
Expand Down Expand Up @@ -219,6 +236,22 @@ public void testNodesCanBePutIntoMaintenanceAndRecommissioned()
nodeManager.getNodeStatus(dns.get(10)).getOperationalState());
}

@Test
public void testDeadNodeGoesToMaintenanceImmediately()
throws NodeNotFoundException, InvalidNodeStateException {
List<DatanodeDetails> dns = generateDatanodes();
DatanodeDetails dn = dns.get(1);

SimpleMockNodeManager mockNM = new SimpleMockNodeManager();
mockNM.register(dn, NodeStatus.inServiceDead());
NodeDecommissionManager decomMgr = new NodeDecommissionManager(conf, mockNM,
null, SCMContext.emptyContext(), new EventQueue(), null);

decomMgr.startMaintenance(dns.get(1), 0);
assertEquals(HddsProtos.NodeOperationalState.IN_MAINTENANCE,
mockNM.getNodeStatus(dns.get(1)).getOperationalState());
}

@Test
public void testNodesCannotTransitionFromDecomToMaint() throws Exception {
List<DatanodeDetails> dns = generateDatanodes();
Expand Down