Skip to content

Commit 397a563

Browse files
committed
HDDS-1888. Add containers to node2container map in SCM as part of ICR processing.
Signed-off-by: Nanda kumar <nanda@apache.org>
1 parent 00b5a27 commit 397a563

File tree

9 files changed

+132
-21
lines changed

9 files changed

+132
-21
lines changed

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/IncrementalContainerReportHandler.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@
2020

2121
import java.io.IOException;
2222

23+
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
2324
import org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos
2425
.ContainerReplicaProto;
26+
import org.apache.hadoop.hdds.scm.node.NodeManager;
27+
import org.apache.hadoop.hdds.scm.node.states.NodeNotFoundException;
2528
import org.apache.hadoop.hdds.scm.server.SCMDatanodeHeartbeatDispatcher
2629
.IncrementalContainerReportFromDatanode;
2730
import org.apache.hadoop.hdds.server.events.EventHandler;
@@ -39,9 +42,13 @@ public class IncrementalContainerReportHandler extends
3942
private static final Logger LOG = LoggerFactory.getLogger(
4043
IncrementalContainerReportHandler.class);
4144

45+
private final NodeManager nodeManager;
46+
4247
public IncrementalContainerReportHandler(
48+
final NodeManager nodeManager,
4349
final ContainerManager containerManager) {
4450
super(containerManager, LOG);
51+
this.nodeManager = nodeManager;
4552
}
4653

4754
@Override
@@ -53,9 +60,16 @@ public void onMessage(final IncrementalContainerReportFromDatanode report,
5360
for (ContainerReplicaProto replicaProto :
5461
report.getReport().getReportList()) {
5562
try {
56-
processContainerReplica(report.getDatanodeDetails(), replicaProto);
63+
final DatanodeDetails dd = report.getDatanodeDetails();
64+
final ContainerID id = ContainerID.valueof(
65+
replicaProto.getContainerID());
66+
nodeManager.addContainer(dd, id);
67+
processContainerReplica(dd, replicaProto);
5768
} catch (ContainerNotFoundException e) {
5869
LOG.warn("Container {} not found!", replicaProto.getContainerID());
70+
} catch (NodeNotFoundException ex) {
71+
LOG.error("Received ICR from unknown datanode {} {}",
72+
report.getDatanodeDetails(), ex);
5973
} catch (IOException e) {
6074
LOG.error("Exception while processing ICR for container {}",
6175
replicaProto.getContainerID());

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,17 @@ public interface NodeManager extends StorageContainerNodeProtocol,
129129
*/
130130
void removePipeline(Pipeline pipeline);
131131

132+
/**
133+
* Adds the given container to the specified datanode.
134+
*
135+
* @param datanodeDetails - DatanodeDetails
136+
* @param containerId - containerID
137+
* @throws NodeNotFoundException - if datanode is not known. For new datanode
138+
* use addDatanodeInContainerMap call.
139+
*/
140+
void addContainer(DatanodeDetails datanodeDetails,
141+
ContainerID containerId) throws NodeNotFoundException;
142+
132143
/**
133144
* Remaps datanode to containers mapping to the new set of containers.
134145
* @param datanodeDetails - DatanodeDetails

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,21 @@ public int getTotalNodeCount() {
456456
public void removePipeline(Pipeline pipeline) {
457457
node2PipelineMap.removePipeline(pipeline);
458458
}
459+
460+
/**
461+
* Adds the given container to the specified datanode.
462+
*
463+
* @param uuid - datanode uuid
464+
* @param containerId - containerID
465+
* @throws NodeNotFoundException - if datanode is not known. For new datanode
466+
* use addDatanodeInContainerMap call.
467+
*/
468+
public void addContainer(final UUID uuid,
469+
final ContainerID containerId)
470+
throws NodeNotFoundException {
471+
nodeStateMap.addContainer(uuid, containerId);
472+
}
473+
459474
/**
460475
* Update set of containers available on a datanode.
461476
* @param uuid - DatanodeID

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,13 @@ public void removePipeline(Pipeline pipeline) {
500500
nodeStateManager.removePipeline(pipeline);
501501
}
502502

503+
@Override
504+
public void addContainer(final DatanodeDetails datanodeDetails,
505+
final ContainerID containerId)
506+
throws NodeNotFoundException {
507+
nodeStateManager.addContainer(datanodeDetails.getUuid(), containerId);
508+
}
509+
503510
/**
504511
* Update set of containers available on a datanode.
505512
* @param datanodeDetails - DatanodeID

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

Lines changed: 56 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ public void updateNodeState(UUID nodeId, NodeState currentState,
108108
NodeState newState)throws NodeNotFoundException {
109109
lock.writeLock().lock();
110110
try {
111+
checkIfNodeExist(nodeId);
111112
if (stateMap.get(currentState).remove(nodeId)) {
112113
stateMap.get(newState).add(nodeId);
113114
} else {
@@ -131,10 +132,8 @@ public void updateNodeState(UUID nodeId, NodeState currentState,
131132
public DatanodeInfo getNodeInfo(UUID uuid) throws NodeNotFoundException {
132133
lock.readLock().lock();
133134
try {
134-
if (nodeMap.containsKey(uuid)) {
135-
return nodeMap.get(uuid);
136-
}
137-
throw new NodeNotFoundException("Node UUID: " + uuid);
135+
checkIfNodeExist(uuid);
136+
return nodeMap.get(uuid);
138137
} finally {
139138
lock.readLock().unlock();
140139
}
@@ -213,41 +212,70 @@ public int getTotalNodeCount() {
213212
public NodeState getNodeState(UUID uuid) throws NodeNotFoundException {
214213
lock.readLock().lock();
215214
try {
215+
checkIfNodeExist(uuid);
216216
for (Map.Entry<NodeState, Set<UUID>> entry : stateMap.entrySet()) {
217217
if (entry.getValue().contains(uuid)) {
218218
return entry.getKey();
219219
}
220220
}
221-
throw new NodeNotFoundException("Node UUID: " + uuid);
221+
throw new NodeNotFoundException("Node not found in node state map." +
222+
" UUID: " + uuid);
222223
} finally {
223224
lock.readLock().unlock();
224225
}
225226
}
226227

228+
/**
229+
* Adds the given container to the specified datanode.
230+
*
231+
* @param uuid - datanode uuid
232+
* @param containerId - containerID
233+
* @throws NodeNotFoundException - if datanode is not known. For new datanode
234+
* use addDatanodeInContainerMap call.
235+
*/
236+
public void addContainer(final UUID uuid,
237+
final ContainerID containerId)
238+
throws NodeNotFoundException {
239+
lock.writeLock().lock();
240+
try {
241+
checkIfNodeExist(uuid);
242+
nodeToContainer.get(uuid).add(containerId);
243+
} finally {
244+
lock.writeLock().unlock();
245+
}
246+
}
247+
227248
public void setContainers(UUID uuid, Set<ContainerID> containers)
228249
throws NodeNotFoundException{
229-
if (!nodeToContainer.containsKey(uuid)) {
230-
throw new NodeNotFoundException("Node UUID: " + uuid);
250+
lock.writeLock().lock();
251+
try {
252+
checkIfNodeExist(uuid);
253+
nodeToContainer.put(uuid, containers);
254+
} finally {
255+
lock.writeLock().unlock();
231256
}
232-
nodeToContainer.put(uuid, containers);
233257
}
234258

235259
public Set<ContainerID> getContainers(UUID uuid)
236260
throws NodeNotFoundException {
237-
Set<ContainerID> containers = nodeToContainer.get(uuid);
238-
if (containers == null) {
239-
throw new NodeNotFoundException("Node UUID: " + uuid);
261+
lock.readLock().lock();
262+
try {
263+
checkIfNodeExist(uuid);
264+
return Collections.unmodifiableSet(nodeToContainer.get(uuid));
265+
} finally {
266+
lock.readLock().unlock();
240267
}
241-
return Collections.unmodifiableSet(containers);
242268
}
243269

244270
public void removeContainer(UUID uuid, ContainerID containerID) throws
245271
NodeNotFoundException {
246-
Set<ContainerID> containers = nodeToContainer.get(uuid);
247-
if (containers == null) {
248-
throw new NodeNotFoundException("Node UUID: " + uuid);
272+
lock.writeLock().lock();
273+
try {
274+
checkIfNodeExist(uuid);
275+
nodeToContainer.get(uuid).remove(containerID);
276+
} finally {
277+
lock.writeLock().unlock();
249278
}
250-
containers.remove(containerID);
251279
}
252280

253281
/**
@@ -269,4 +297,16 @@ public String toString() {
269297
}
270298
return builder.toString();
271299
}
300+
301+
/**
302+
* Throws NodeNotFoundException if the Node for given id doesn't exist.
303+
*
304+
* @param uuid Node UUID
305+
* @throws NodeNotFoundException If the node is missing.
306+
*/
307+
private void checkIfNodeExist(UUID uuid) throws NodeNotFoundException {
308+
if (!nodeToContainer.containsKey(uuid)) {
309+
throw new NodeNotFoundException("Node UUID: " + uuid);
310+
}
311+
}
272312
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,8 @@ public StorageContainerManager(OzoneConfiguration conf,
299299
new ContainerReportHandler(scmNodeManager, containerManager);
300300

301301
IncrementalContainerReportHandler incrementalContainerReportHandler =
302-
new IncrementalContainerReportHandler(containerManager);
302+
new IncrementalContainerReportHandler(
303+
scmNodeManager, containerManager);
303304

304305
PipelineActionHandler pipelineActionHandler =
305306
new PipelineActionHandler(pipelineManager, conf);

hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/MockNodeManager.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,19 @@ public void removePipeline(Pipeline pipeline) {
267267
node2PipelineMap.removePipeline(pipeline);
268268
}
269269

270+
@Override
271+
public void addContainer(DatanodeDetails dd,
272+
ContainerID containerId)
273+
throws NodeNotFoundException {
274+
try {
275+
Set<ContainerID> set = node2ContainerMap.getContainers(dd.getUuid());
276+
set.add(containerId);
277+
node2ContainerMap.setContainersForDatanode(dd.getUuid(), set);
278+
} catch (SCMException e) {
279+
e.printStackTrace();
280+
}
281+
}
282+
270283
@Override
271284
public void addDatanodeCommand(UUID dnId, SCMCommand command) {
272285
if(commandMap.containsKey(dnId)) {

hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestIncrementalContainerReportHandler.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.apache.hadoop.hdds.protocol.proto
2828
.StorageContainerDatanodeProtocolProtos.IncrementalContainerReportProto;
2929
import org.apache.hadoop.hdds.scm.TestUtils;
30+
import org.apache.hadoop.hdds.scm.node.NodeManager;
3031
import org.apache.hadoop.hdds.scm.server.SCMDatanodeHeartbeatDispatcher
3132
.IncrementalContainerReportFromDatanode;
3233
import org.apache.hadoop.hdds.server.events.EventPublisher;
@@ -47,6 +48,7 @@
4748
*/
4849
public class TestIncrementalContainerReportHandler {
4950

51+
private NodeManager nodeManager;
5052
private ContainerManager containerManager;
5153
private ContainerStateManager containerStateManager;
5254
private EventPublisher publisher;
@@ -55,6 +57,7 @@ public class TestIncrementalContainerReportHandler {
5557
public void setup() throws IOException {
5658
final Configuration conf = new OzoneConfiguration();
5759
this.containerManager = Mockito.mock(ContainerManager.class);
60+
this.nodeManager = Mockito.mock(NodeManager.class);
5861
this.containerStateManager = new ContainerStateManager(conf);
5962
this.publisher = Mockito.mock(EventPublisher.class);
6063

@@ -88,7 +91,7 @@ public void tearDown() throws IOException {
8891
@Test
8992
public void testClosingToClosed() throws IOException {
9093
final IncrementalContainerReportHandler reportHandler =
91-
new IncrementalContainerReportHandler(containerManager);
94+
new IncrementalContainerReportHandler(nodeManager, containerManager);
9295
final ContainerInfo container = getContainer(LifeCycleState.CLOSING);
9396
final DatanodeDetails datanodeOne = TestUtils.randomDatanodeDetails();
9497
final DatanodeDetails datanodeTwo = TestUtils.randomDatanodeDetails();
@@ -122,7 +125,7 @@ public void testClosingToClosed() throws IOException {
122125
@Test
123126
public void testClosingToQuasiClosed() throws IOException {
124127
final IncrementalContainerReportHandler reportHandler =
125-
new IncrementalContainerReportHandler(containerManager);
128+
new IncrementalContainerReportHandler(nodeManager, containerManager);
126129
final ContainerInfo container = getContainer(LifeCycleState.CLOSING);
127130
final DatanodeDetails datanodeOne = TestUtils.randomDatanodeDetails();
128131
final DatanodeDetails datanodeTwo = TestUtils.randomDatanodeDetails();
@@ -157,7 +160,7 @@ public void testClosingToQuasiClosed() throws IOException {
157160
@Test
158161
public void testQuasiClosedToClosed() throws IOException {
159162
final IncrementalContainerReportHandler reportHandler =
160-
new IncrementalContainerReportHandler(containerManager);
163+
new IncrementalContainerReportHandler(nodeManager, containerManager);
161164
final ContainerInfo container = getContainer(LifeCycleState.QUASI_CLOSED);
162165
final DatanodeDetails datanodeOne = TestUtils.randomDatanodeDetails();
163166
final DatanodeDetails datanodeTwo = TestUtils.randomDatanodeDetails();

hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/ozone/container/testutils/ReplicationNodeManagerMock.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,13 @@ public void removePipeline(Pipeline pipeline) {
182182
throw new UnsupportedOperationException("Not yet implemented");
183183
}
184184

185+
@Override
186+
public void addContainer(DatanodeDetails datanodeDetails,
187+
ContainerID containerId)
188+
throws NodeNotFoundException {
189+
throw new UnsupportedOperationException("Not yet implemented");
190+
}
191+
185192
/**
186193
* Update set of containers available on a datanode.
187194
* @param uuid - DatanodeID

0 commit comments

Comments
 (0)