use of org.apache.hadoop.ozone.protocol.commands.ReregisterCommand in project ozone by apache.
the class ReconNodeManager method processHeartbeat.
/**
* Send heartbeat to indicate the datanode is alive and doing well.
*
* @param datanodeDetails - DatanodeDetailsProto.
* @param layoutInfo - Layout Version Proto
* @return SCMheartbeat response.
*/
@Override
public List<SCMCommand> processHeartbeat(DatanodeDetails datanodeDetails, LayoutVersionProto layoutInfo) {
List<SCMCommand> cmds = new ArrayList<>();
long currentTime = Time.now();
if (needUpdate(datanodeDetails, currentTime)) {
cmds.add(new ReregisterCommand());
LOG.info("Sending ReregisterCommand() for " + datanodeDetails.getHostName());
datanodeHeartbeatMap.put(datanodeDetails.getUuid(), Time.now());
return cmds;
}
// Update heartbeat map with current time
datanodeHeartbeatMap.put(datanodeDetails.getUuid(), Time.now());
cmds.addAll(super.processHeartbeat(datanodeDetails, layoutInfo));
return cmds.stream().filter(c -> ALLOWED_COMMANDS.contains(c.getType())).collect(toList());
}
use of org.apache.hadoop.ozone.protocol.commands.ReregisterCommand in project ozone by apache.
the class SCMDatanodeHeartbeatDispatcher method dispatch.
/**
* Dispatches heartbeat to registered event handlers.
*
* @param heartbeat heartbeat to be dispatched.
*
* @return list of SCMCommand
*/
public List<SCMCommand> dispatch(SCMHeartbeatRequestProto heartbeat) {
DatanodeDetails datanodeDetails = DatanodeDetails.getFromProtoBuf(heartbeat.getDatanodeDetails());
List<SCMCommand> commands;
// Heartbeat for unregistered nodes.
if (!nodeManager.isNodeRegistered(datanodeDetails)) {
LOG.info("SCM received heartbeat from an unregistered datanode {}. " + "Asking datanode to re-register.", datanodeDetails);
UUID dnID = datanodeDetails.getUuid();
nodeManager.addDatanodeCommand(dnID, new ReregisterCommand());
commands = nodeManager.getCommandQueue(dnID);
} else {
LayoutVersionProto layoutVersion = null;
if (!heartbeat.hasDataNodeLayoutVersion()) {
// Backward compatibility to make sure old Datanodes can still talk to
// SCM.
layoutVersion = toLayoutVersionProto(INITIAL_VERSION.layoutVersion(), INITIAL_VERSION.layoutVersion());
} else {
layoutVersion = heartbeat.getDataNodeLayoutVersion();
}
LOG.debug("Processing DataNode Layout Report.");
nodeManager.processLayoutVersionReport(datanodeDetails, layoutVersion);
// should we dispatch heartbeat through eventPublisher?
commands = nodeManager.processHeartbeat(datanodeDetails, layoutVersion);
if (heartbeat.hasNodeReport()) {
LOG.debug("Dispatching Node Report.");
eventPublisher.fireEvent(NODE_REPORT, new NodeReportFromDatanode(datanodeDetails, heartbeat.getNodeReport()));
}
if (heartbeat.hasContainerReport()) {
LOG.debug("Dispatching Container Report.");
eventPublisher.fireEvent(CONTAINER_REPORT, new ContainerReportFromDatanode(datanodeDetails, heartbeat.getContainerReport()));
}
final List<IncrementalContainerReportProto> icrs = heartbeat.getIncrementalContainerReportList();
if (icrs.size() > 0) {
LOG.debug("Dispatching ICRs.");
for (IncrementalContainerReportProto icr : icrs) {
eventPublisher.fireEvent(INCREMENTAL_CONTAINER_REPORT, new IncrementalContainerReportFromDatanode(datanodeDetails, icr));
}
}
if (heartbeat.hasContainerActions()) {
LOG.debug("Dispatching Container Actions.");
eventPublisher.fireEvent(CONTAINER_ACTIONS, new ContainerActionsFromDatanode(datanodeDetails, heartbeat.getContainerActions()));
}
if (heartbeat.hasPipelineReports()) {
LOG.debug("Dispatching Pipeline Report.");
eventPublisher.fireEvent(PIPELINE_REPORT, new PipelineReportFromDatanode(datanodeDetails, heartbeat.getPipelineReports()));
}
if (heartbeat.hasPipelineActions()) {
LOG.debug("Dispatching Pipeline Actions.");
eventPublisher.fireEvent(PIPELINE_ACTIONS, new PipelineActionsFromDatanode(datanodeDetails, heartbeat.getPipelineActions()));
}
if (heartbeat.getCommandStatusReportsCount() != 0) {
LOG.debug("Dispatching Command Status Report.");
for (CommandStatusReportsProto commandStatusReport : heartbeat.getCommandStatusReportsList()) {
eventPublisher.fireEvent(CMD_STATUS_REPORT, new CommandStatusReportFromDatanode(datanodeDetails, commandStatusReport));
}
}
}
return commands;
}
use of org.apache.hadoop.ozone.protocol.commands.ReregisterCommand in project ozone by apache.
the class TestReconNodeManager method testReconNodeDB.
@Test
public void testReconNodeDB() throws IOException, NodeNotFoundException {
ReconStorageConfig scmStorageConfig = new ReconStorageConfig(conf, new ReconUtils());
EventQueue eventQueue = new EventQueue();
NetworkTopology clusterMap = new NetworkTopologyImpl(conf);
Table<UUID, DatanodeDetails> nodeTable = ReconSCMDBDefinition.NODES.getTable(store);
ReconNodeManager reconNodeManager = new ReconNodeManager(conf, scmStorageConfig, eventQueue, clusterMap, nodeTable, versionManager);
ReconNewNodeHandler reconNewNodeHandler = new ReconNewNodeHandler(reconNodeManager);
assertTrue(reconNodeManager.getAllNodes().isEmpty());
DatanodeDetails datanodeDetails = randomDatanodeDetails();
String uuidString = datanodeDetails.getUuidString();
// Register a random datanode.
reconNodeManager.register(datanodeDetails, null, null);
reconNewNodeHandler.onMessage(reconNodeManager.getNodeByUuid(uuidString), null);
assertEquals(1, reconNodeManager.getAllNodes().size());
assertNotNull(reconNodeManager.getNodeByUuid(uuidString));
// If any commands are added to the eventQueue without using the onMessage
// interface, then they should be filtered out and not returned to the DN
// when it heartbeats.
// This command should never be returned by Recon
reconNodeManager.addDatanodeCommand(datanodeDetails.getUuid(), new SetNodeOperationalStateCommand(1234, DECOMMISSIONING, 0));
// This one should be returned
reconNodeManager.addDatanodeCommand(datanodeDetails.getUuid(), new ReregisterCommand());
// OperationalState sanity check
final DatanodeDetails dnDetails = reconNodeManager.getNodeByUuid(datanodeDetails.getUuidString());
assertEquals(HddsProtos.NodeOperationalState.IN_SERVICE, dnDetails.getPersistedOpState());
assertEquals(dnDetails.getPersistedOpState(), reconNodeManager.getNodeStatus(dnDetails).getOperationalState());
assertEquals(dnDetails.getPersistedOpStateExpiryEpochSec(), reconNodeManager.getNodeStatus(dnDetails).getOpStateExpiryEpochSeconds());
// Upon processing the heartbeat, the illegal command should be filtered out
List<SCMCommand> returnedCmds = reconNodeManager.processHeartbeat(datanodeDetails, defaultLayoutVersionProto());
assertEquals(1, returnedCmds.size());
assertEquals(SCMCommandProto.Type.reregisterCommand, returnedCmds.get(0).getType());
// Now feed a DECOMMISSIONED heartbeat of the same DN
datanodeDetails.setPersistedOpState(HddsProtos.NodeOperationalState.DECOMMISSIONED);
datanodeDetails.setPersistedOpStateExpiryEpochSec(12345L);
reconNodeManager.processHeartbeat(datanodeDetails, defaultLayoutVersionProto());
// Check both persistedOpState and NodeStatus#operationalState
assertEquals(HddsProtos.NodeOperationalState.DECOMMISSIONED, dnDetails.getPersistedOpState());
assertEquals(dnDetails.getPersistedOpState(), reconNodeManager.getNodeStatus(dnDetails).getOperationalState());
assertEquals(12345L, dnDetails.getPersistedOpStateExpiryEpochSec());
assertEquals(dnDetails.getPersistedOpStateExpiryEpochSec(), reconNodeManager.getNodeStatus(dnDetails).getOpStateExpiryEpochSeconds());
// Close the DB, and recreate the instance of Recon Node Manager.
eventQueue.close();
reconNodeManager.close();
reconNodeManager = new ReconNodeManager(conf, scmStorageConfig, eventQueue, clusterMap, nodeTable, versionManager);
// Verify that the node information was persisted and loaded back.
assertEquals(1, reconNodeManager.getAllNodes().size());
assertNotNull(reconNodeManager.getNodeByUuid(datanodeDetails.getUuidString()));
}
Aggregations