use of org.apache.hadoop.ozone.recon.api.types.DatanodeMetadata in project ozone by apache.
the class TestOpenContainerCount method testOpenContainerCount.
@Test
public void testOpenContainerCount() throws Exception {
// In case of pipeline doesn't exist
waitAndCheckConditionAfterHeartbeat(() -> {
DatanodeMetadata datanodeMetadata1 = getDatanodeMetadata();
return datanodeMetadata1.getContainers() == 10 && datanodeMetadata1.getPipelines().size() == 2;
});
DatanodeMetadata datanodeMetadata = getDatanodeMetadata();
int expectedCnt = datanodeMetadata.getOpenContainers();
// check if open container's count decrement according
for (long id = 1L; id <= 10L; ++id) {
--expectedCnt;
closeContainer(id);
DatanodeMetadata metadata = getDatanodeMetadata();
Assert.assertEquals(expectedCnt, metadata.getOpenContainers());
}
}
use of org.apache.hadoop.ozone.recon.api.types.DatanodeMetadata in project ozone by apache.
the class TestOpenContainerCount method getDatanodeMetadata.
private DatanodeMetadata getDatanodeMetadata() {
Response response = nodeEndpoint.getDatanodes();
DatanodesResponse datanodesResponse = (DatanodesResponse) response.getEntity();
DatanodeMetadata datanodeMetadata = datanodesResponse.getDatanodes().stream().filter(metadata -> metadata.getHostname().equals("host1.datanode")).findFirst().orElse(null);
return datanodeMetadata;
}
use of org.apache.hadoop.ozone.recon.api.types.DatanodeMetadata in project ozone by apache.
the class NodeEndpoint method getDatanodes.
/**
* Return the list of datanodes with detailed information about each datanode.
* @return {@link Response}
*/
@GET
public Response getDatanodes() {
List<DatanodeMetadata> datanodes = new ArrayList<>();
List<DatanodeDetails> datanodeDetails = nodeManager.getAllNodes();
datanodeDetails.forEach(datanode -> {
DatanodeStorageReport storageReport = getStorageReport(datanode);
NodeState nodeState = null;
try {
nodeState = nodeManager.getNodeStatus(datanode).getHealth();
} catch (NodeNotFoundException e) {
LOG.warn("Cannot get nodeState for datanode {}", datanode, e);
}
final NodeOperationalState nodeOpState = datanode.getPersistedOpState();
String hostname = datanode.getHostName();
Set<PipelineID> pipelineIDs = nodeManager.getPipelines(datanode);
List<DatanodePipeline> pipelines = new ArrayList<>();
AtomicInteger leaderCount = new AtomicInteger();
AtomicInteger openContainers = new AtomicInteger();
DatanodeMetadata.Builder builder = DatanodeMetadata.newBuilder();
pipelineIDs.forEach(pipelineID -> {
try {
Pipeline pipeline = pipelineManager.getPipeline(pipelineID);
String leaderNode = pipeline.getLeaderNode().getHostName();
DatanodePipeline datanodePipeline = new DatanodePipeline(pipelineID.getId(), pipeline.getReplicationConfig().getReplicationType().toString(), ReplicationConfig.getLegacyFactor(pipeline.getReplicationConfig()).getNumber(), leaderNode);
pipelines.add(datanodePipeline);
if (datanode.getUuid().equals(pipeline.getLeaderId())) {
leaderCount.getAndIncrement();
}
int openContainerPerPipeline = reconContainerManager.getPipelineToOpenContainer().getOrDefault(pipelineID, 0);
openContainers.getAndAdd(openContainerPerPipeline);
} catch (PipelineNotFoundException ex) {
LOG.warn("Cannot get pipeline {} for datanode {}, pipeline not found", pipelineID.getId(), hostname, ex);
} catch (IOException ioEx) {
LOG.warn("Cannot get leader node of pipeline with id {}.", pipelineID.getId(), ioEx);
}
});
try {
Set<ContainerID> allContainers = nodeManager.getContainers(datanode);
builder.withContainers(allContainers.size());
builder.withOpenContainers(openContainers.get());
} catch (NodeNotFoundException ex) {
LOG.warn("Cannot get containers, datanode {} not found.", datanode.getUuid(), ex);
}
DatanodeInfo dnInfo = (DatanodeInfo) datanode;
datanodes.add(builder.withHostname(nodeManager.getHostName(datanode)).withDatanodeStorageReport(storageReport).withLastHeartbeat(nodeManager.getLastHeartbeat(datanode)).withState(nodeState).withOperationalState(nodeOpState).withPipelines(pipelines).withLeaderCount(leaderCount.get()).withUUid(datanode.getUuidString()).withVersion(nodeManager.getVersion(datanode)).withSetupTime(nodeManager.getSetupTime(datanode)).withRevision(nodeManager.getRevision(datanode)).withBuildDate(nodeManager.getBuildDate(datanode)).withLayoutVersion(dnInfo.getLastKnownLayoutVersion().getMetadataLayoutVersion()).build());
});
DatanodesResponse datanodesResponse = new DatanodesResponse(datanodes.size(), datanodes);
return Response.ok(datanodesResponse).build();
}
use of org.apache.hadoop.ozone.recon.api.types.DatanodeMetadata in project ozone by apache.
the class TestEndpoints method testGetDatanodes.
@Test
public void testGetDatanodes() throws Exception {
Response response = nodeEndpoint.getDatanodes();
DatanodesResponse datanodesResponse = (DatanodesResponse) response.getEntity();
Assert.assertEquals(2, datanodesResponse.getTotalCount());
Assert.assertEquals(2, datanodesResponse.getDatanodes().size());
datanodesResponse.getDatanodes().forEach(datanodeMetadata -> {
try {
testDatanodeResponse(datanodeMetadata);
} catch (IOException e) {
Assert.fail(e.getMessage());
}
});
waitAndCheckConditionAfterHeartbeat(() -> {
Response response1 = nodeEndpoint.getDatanodes();
DatanodesResponse datanodesResponse1 = (DatanodesResponse) response1.getEntity();
DatanodeMetadata datanodeMetadata1 = datanodesResponse1.getDatanodes().stream().filter(datanodeMetadata -> datanodeMetadata.getHostname().equals("host1.datanode")).findFirst().orElse(null);
return (datanodeMetadata1 != null && datanodeMetadata1.getContainers() == 1 && datanodeMetadata1.getOpenContainers() == 1 && reconScm.getPipelineManager().getContainersInPipeline(pipeline.getId()).size() == 1);
});
// Change Node OperationalState with NodeManager
final NodeManager nodeManager = reconScm.getScmNodeManager();
final DatanodeDetails dnDetailsInternal = nodeManager.getNodeByUuid(datanodeDetails.getUuidString());
// Backup existing state and sanity check
final NodeStatus nStatus = nodeManager.getNodeStatus(dnDetailsInternal);
final NodeOperationalState backupOpState = dnDetailsInternal.getPersistedOpState();
final long backupOpStateExpiry = dnDetailsInternal.getPersistedOpStateExpiryEpochSec();
assertEquals(backupOpState, nStatus.getOperationalState());
assertEquals(backupOpStateExpiry, nStatus.getOpStateExpiryEpochSeconds());
dnDetailsInternal.setPersistedOpState(NodeOperationalState.DECOMMISSIONING);
dnDetailsInternal.setPersistedOpStateExpiryEpochSec(666L);
nodeManager.setNodeOperationalState(dnDetailsInternal, NodeOperationalState.DECOMMISSIONING, 666L);
// Check if the endpoint response reflects the change
response = nodeEndpoint.getDatanodes();
datanodesResponse = (DatanodesResponse) response.getEntity();
// Order of datanodes in the response is random
AtomicInteger count = new AtomicInteger();
datanodesResponse.getDatanodes().forEach(metadata -> {
if (metadata.getUuid().equals(dnDetailsInternal.getUuidString())) {
count.incrementAndGet();
assertEquals(NodeOperationalState.DECOMMISSIONING, metadata.getOperationalState());
}
});
assertEquals(1, count.get());
// Restore state
dnDetailsInternal.setPersistedOpState(backupOpState);
dnDetailsInternal.setPersistedOpStateExpiryEpochSec(backupOpStateExpiry);
nodeManager.setNodeOperationalState(dnDetailsInternal, backupOpState, backupOpStateExpiry);
}
Aggregations