Skip to content

Commit b68b94c

Browse files
authored
HDDS-12617. Use DatanodeID as keys in NodeStateMap. (#8100)
1 parent b71d408 commit b68b94c

File tree

13 files changed

+116
-177
lines changed

13 files changed

+116
-177
lines changed

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeStateManager.java

Lines changed: 29 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import java.util.stream.Collectors;
4444
import org.apache.hadoop.hdds.conf.ConfigurationSource;
4545
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
46+
import org.apache.hadoop.hdds.protocol.DatanodeID;
4647
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
4748
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeOperationalState;
4849
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState;
@@ -309,12 +310,11 @@ public void addNode(DatanodeDetails datanodeDetails,
309310
LayoutVersionProto layoutInfo) throws NodeAlreadyExistsException {
310311
NodeStatus newNodeStatus = newNodeStatus(datanodeDetails, layoutInfo);
311312
nodeStateMap.addNode(datanodeDetails, newNodeStatus, layoutInfo);
312-
UUID dnID = datanodeDetails.getUuid();
313313
try {
314314
updateLastKnownLayoutVersion(datanodeDetails, layoutInfo);
315315
} catch (NodeNotFoundException ex) {
316-
LOG.error("Inconsistent NodeStateMap! Datanode with ID {} was " +
317-
"added but not found in map: {}", dnID, nodeStateMap);
316+
throw new IllegalStateException("Inconsistent NodeStateMap! Datanode "
317+
+ datanodeDetails.getID() + " was added but not found in map: " + nodeStateMap);
318318
}
319319
}
320320

@@ -374,12 +374,11 @@ public int getPipelinesCount(DatanodeDetails datanodeDetails) {
374374
*/
375375
public DatanodeInfo getNode(DatanodeDetails datanodeDetails)
376376
throws NodeNotFoundException {
377-
return getNode(datanodeDetails.getUuid());
377+
return getNode(datanodeDetails.getID());
378378
}
379379

380-
public DatanodeInfo getNode(UUID uuid)
381-
throws NodeNotFoundException {
382-
return nodeStateMap.getNodeInfo(uuid);
380+
public DatanodeInfo getNode(DatanodeID datanodeID) throws NodeNotFoundException {
381+
return nodeStateMap.getNodeInfo(datanodeID);
383382
}
384383

385384
/**
@@ -389,7 +388,7 @@ public DatanodeInfo getNode(UUID uuid)
389388
*/
390389
public void updateLastHeartbeatTime(DatanodeDetails datanodeDetails)
391390
throws NodeNotFoundException {
392-
nodeStateMap.getNodeInfo(datanodeDetails.getUuid())
391+
nodeStateMap.getNodeInfo(datanodeDetails.getID())
393392
.updateLastHeartbeatTime();
394393
}
395394

@@ -403,7 +402,7 @@ public void updateLastHeartbeatTime(DatanodeDetails datanodeDetails)
403402
public void updateLastKnownLayoutVersion(DatanodeDetails datanodeDetails,
404403
LayoutVersionProto layoutInfo)
405404
throws NodeNotFoundException {
406-
nodeStateMap.getNodeInfo(datanodeDetails.getUuid())
405+
nodeStateMap.getNodeInfo(datanodeDetails.getID())
407406
.updateLastKnownLayoutVersion(layoutInfo);
408407
}
409408

@@ -417,8 +416,7 @@ public void updateLastKnownLayoutVersion(DatanodeDetails datanodeDetails,
417416
public void updateNode(DatanodeDetails datanodeDetails,
418417
LayoutVersionProto layoutInfo)
419418
throws NodeNotFoundException {
420-
DatanodeInfo datanodeInfo =
421-
nodeStateMap.getNodeInfo(datanodeDetails.getUuid());
419+
final DatanodeInfo datanodeInfo = nodeStateMap.getNodeInfo(datanodeDetails.getID());
422420
NodeStatus newNodeStatus = newNodeStatus(datanodeDetails, layoutInfo);
423421
LOG.info("updating node {} from {} to {} with status {}",
424422
datanodeDetails.getUuidString(),
@@ -440,7 +438,7 @@ public void updateNode(DatanodeDetails datanodeDetails,
440438
*/
441439
public NodeStatus getNodeStatus(DatanodeDetails datanodeDetails)
442440
throws NodeNotFoundException {
443-
return nodeStateMap.getNodeStatus(datanodeDetails.getUuid());
441+
return nodeStateMap.getNodeStatus(datanodeDetails.getID());
444442
}
445443

446444
/**
@@ -582,12 +580,12 @@ public void setNodeOperationalState(DatanodeDetails dn,
582580
public void setNodeOperationalState(DatanodeDetails dn,
583581
NodeOperationalState newState,
584582
long stateExpiryEpochSec) throws NodeNotFoundException {
585-
DatanodeInfo dni = nodeStateMap.getNodeInfo(dn.getUuid());
583+
final DatanodeID id = dn.getID();
584+
final DatanodeInfo dni = nodeStateMap.getNodeInfo(id);
586585
NodeStatus oldStatus = dni.getNodeStatus();
587586
if (oldStatus.getOperationalState() != newState ||
588587
oldStatus.getOpStateExpiryEpochSeconds() != stateExpiryEpochSec) {
589-
nodeStateMap.updateNodeOperationalState(
590-
dn.getUuid(), newState, stateExpiryEpochSec);
588+
nodeStateMap.updateNodeOperationalState(id, newState, stateExpiryEpochSec);
591589
// This will trigger an event based on the nodes health when the
592590
// operational state changes. Eg a node that was IN_MAINTENANCE goes
593591
// to IN_SERVICE + HEALTHY. This will trigger the HEALTHY node event to
@@ -680,58 +678,49 @@ public void removePipeline(Pipeline pipeline) {
680678

681679
/**
682680
* Adds the given container to the specified datanode.
683-
*
684-
* @param uuid - datanode uuid
685-
* @param containerId - containerID
686681
* @throws NodeNotFoundException - if datanode is not known. For new datanode
687682
* use addDatanodeInContainerMap call.
688683
*/
689-
public void addContainer(final UUID uuid,
684+
public void addContainer(final DatanodeID datanodeID,
690685
final ContainerID containerId)
691686
throws NodeNotFoundException {
692-
nodeStateMap.addContainer(uuid, containerId);
687+
nodeStateMap.addContainer(datanodeID, containerId);
693688
}
694689

695690
/**
696691
* Removes the given container from the specified datanode.
697-
*
698-
* @param uuid - datanode uuid
699-
* @param containerId - containerID
700692
* @throws NodeNotFoundException - if datanode is not known. For new datanode
701693
* use addDatanodeInContainerMap call.
702694
*/
703-
public void removeContainer(final UUID uuid,
695+
public void removeContainer(final DatanodeID datanodeID,
704696
final ContainerID containerId)
705697
throws NodeNotFoundException {
706-
nodeStateMap.removeContainer(uuid, containerId);
698+
nodeStateMap.removeContainer(datanodeID, containerId);
707699
}
708700

709701
/**
710702
* Update set of containers available on a datanode.
711-
* @param uuid - DatanodeID
712-
* @param containerIds - Set of containerIDs
713703
* @throws NodeNotFoundException - if datanode is not known.
714704
*/
715-
public void setContainers(UUID uuid, Set<ContainerID> containerIds)
705+
public void setContainers(DatanodeID datanodeID, Set<ContainerID> containerIds)
716706
throws NodeNotFoundException {
717-
nodeStateMap.setContainers(uuid, containerIds);
707+
nodeStateMap.setContainers(datanodeID, containerIds);
718708
}
719709

720710
/**
721711
* Return set of containerIDs available on a datanode. This is a copy of the
722712
* set which resides inside NodeStateMap and hence can be modified without
723713
* synchronization or side effects.
724-
* @param uuid - DatanodeID
725714
* @return - set of containerIDs
726715
*/
727-
public Set<ContainerID> getContainers(UUID uuid)
716+
public Set<ContainerID> getContainers(DatanodeID datanodeID)
728717
throws NodeNotFoundException {
729-
return nodeStateMap.getContainers(uuid);
718+
return nodeStateMap.getContainers(datanodeID);
730719
}
731720

732-
public int getContainerCount(UUID uuid)
721+
public int getContainerCount(DatanodeID datanodeID)
733722
throws NodeNotFoundException {
734-
return nodeStateMap.getContainerCount(uuid);
723+
return nodeStateMap.getContainerCount(datanodeID);
735724
}
736725

737726
/**
@@ -792,7 +781,7 @@ public synchronized void forceNodesToHealthyReadOnly() {
792781
try {
793782
List<DatanodeInfo> nodes = nodeStateMap.getDatanodeInfos(null, HEALTHY);
794783
for (DatanodeInfo node : nodes) {
795-
nodeStateMap.updateNodeHealthState(node.getUuid(),
784+
nodeStateMap.updateNodeHealthState(node.getID(),
796785
HEALTHY_READONLY);
797786
if (state2EventMap.containsKey(HEALTHY_READONLY)) {
798787
// At this point pipeline creation is already frozen and the node's
@@ -860,7 +849,7 @@ public synchronized void checkNodesHealth() {
860849

861850
try {
862851
for (DatanodeInfo node : nodeStateMap.getAllDatanodeInfos()) {
863-
NodeStatus status = nodeStateMap.getNodeStatus(node.getUuid());
852+
NodeStatus status = nodeStateMap.getNodeStatus(node.getID());
864853
switch (status.getHealth()) {
865854
case HEALTHY:
866855
updateNodeLayoutVersionState(node, layoutMisMatchCondition, status,
@@ -967,7 +956,7 @@ private void updateNodeState(DatanodeInfo node, Predicate<Long> condition,
967956
NodeState newHealthState = nodeHealthSM.
968957
getNextState(status.getHealth(), lifeCycleEvent);
969958
NodeStatus newStatus =
970-
nodeStateMap.updateNodeHealthState(node.getUuid(), newHealthState);
959+
nodeStateMap.updateNodeHealthState(node.getID(), newHealthState);
971960
fireHealthStateEvent(newStatus.getHealth(), node);
972961
}
973962
} catch (InvalidStateTransitionException e) {
@@ -1006,7 +995,7 @@ private void updateNodeLayoutVersionState(DatanodeInfo node,
1006995
NodeState newHealthState = nodeHealthSM.getNextState(status.getHealth(),
1007996
lifeCycleEvent);
1008997
NodeStatus newStatus =
1009-
nodeStateMap.updateNodeHealthState(node.getUuid(), newHealthState);
998+
nodeStateMap.updateNodeHealthState(node.getID(), newHealthState);
1010999
fireHealthStateEvent(newStatus.getHealth(), node);
10111000
}
10121001
} catch (InvalidStateTransitionException e) {
@@ -1086,7 +1075,7 @@ ScheduledFuture unpause() {
10861075
return healthCheckFuture;
10871076
}
10881077

1089-
protected void removeNode(DatanodeDetails datanodeDetails) {
1090-
nodeStateMap.removeNode(datanodeDetails);
1078+
protected void removeNode(DatanodeID datanodeID) {
1079+
nodeStateMap.removeNode(datanodeID);
10911080
}
10921081
}

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,14 +1587,14 @@ public void removePipeline(Pipeline pipeline) {
15871587
public void addContainer(final DatanodeDetails datanodeDetails,
15881588
final ContainerID containerId)
15891589
throws NodeNotFoundException {
1590-
nodeStateManager.addContainer(datanodeDetails.getUuid(), containerId);
1590+
nodeStateManager.addContainer(datanodeDetails.getID(), containerId);
15911591
}
15921592

15931593
@Override
15941594
public void removeContainer(final DatanodeDetails datanodeDetails,
15951595
final ContainerID containerId)
15961596
throws NodeNotFoundException {
1597-
nodeStateManager.removeContainer(datanodeDetails.getUuid(), containerId);
1597+
nodeStateManager.removeContainer(datanodeDetails.getID(), containerId);
15981598
}
15991599

16001600
/**
@@ -1608,8 +1608,7 @@ public void removeContainer(final DatanodeDetails datanodeDetails,
16081608
@Override
16091609
public void setContainers(DatanodeDetails datanodeDetails,
16101610
Set<ContainerID> containerIds) throws NodeNotFoundException {
1611-
nodeStateManager.setContainers(datanodeDetails.getUuid(),
1612-
containerIds);
1611+
nodeStateManager.setContainers(datanodeDetails.getID(), containerIds);
16131612
}
16141613

16151614
/**
@@ -1623,12 +1622,12 @@ public void setContainers(DatanodeDetails datanodeDetails,
16231622
@Override
16241623
public Set<ContainerID> getContainers(DatanodeDetails datanodeDetails)
16251624
throws NodeNotFoundException {
1626-
return nodeStateManager.getContainers(datanodeDetails.getUuid());
1625+
return nodeStateManager.getContainers(datanodeDetails.getID());
16271626
}
16281627

16291628
public int getContainerCount(DatanodeDetails datanodeDetails)
16301629
throws NodeNotFoundException {
1631-
return nodeStateManager.getContainerCount(datanodeDetails.getUuid());
1630+
return nodeStateManager.getContainerCount(datanodeDetails.getID());
16321631
}
16331632

16341633
public int getPipeLineCount(DatanodeDetails datanodeDetails)
@@ -1711,7 +1710,7 @@ public DatanodeDetails getNodeByUuid(UUID uuid) {
17111710
}
17121711

17131712
try {
1714-
return nodeStateManager.getNode(uuid);
1713+
return nodeStateManager.getNode(DatanodeID.of(uuid));
17151714
} catch (NodeNotFoundException e) {
17161715
LOG.warn("Cannot find node for uuid {}", uuid);
17171716
return null;
@@ -1850,7 +1849,7 @@ public void removeNode(DatanodeDetails datanodeDetails) throws NodeNotFoundExcep
18501849
if (clusterMap.contains(datanodeDetails)) {
18511850
clusterMap.remove(datanodeDetails);
18521851
}
1853-
nodeStateManager.removeNode(datanodeDetails);
1852+
nodeStateManager.removeNode(datanodeDetails.getID());
18541853
removeFromDnsToDnIdMap(datanodeDetails.getID(), datanodeDetails.getIpAddress());
18551854
final List<SCMCommand<?>> cmdList = getCommandQueue(datanodeDetails.getUuid());
18561855
LOG.info("Clearing command queue of size {} for DN {}", cmdList.size(), datanodeDetails);

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/states/NodeNotFoundException.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
package org.apache.hadoop.hdds.scm.node.states;
1919

20+
import org.apache.hadoop.hdds.protocol.DatanodeID;
21+
2022
/**
2123
* This exception represents that the node that is being accessed does not
2224
* exist in NodeStateMap.
@@ -33,15 +35,10 @@ public NodeNotFoundException() {
3335
}
3436

3537
/**
36-
* Constructs an {@code NodeNotFoundException} with the specified
37-
* detail message.
38-
*
39-
* @param message
40-
* The detail message (which is saved for later retrieval
41-
* by the {@link #getMessage()} method)
38+
* Constructs an {@code NodeNotFoundException} with the given {@link DatanodeID}.
4239
*/
43-
public NodeNotFoundException(String message) {
44-
super(message);
40+
public NodeNotFoundException(DatanodeID datanodeID) {
41+
super("Datanode " + datanodeID + " not found");
4542
}
4643

4744
}

0 commit comments

Comments
 (0)