|
48 | 48 | import java.util.concurrent.locks.ReentrantReadWriteLock; |
49 | 49 | import java.util.function.BiConsumer; |
50 | 50 | import java.util.function.Function; |
| 51 | +import java.util.function.Predicate; |
51 | 52 | import java.util.stream.Collectors; |
52 | 53 | import javax.management.ObjectName; |
53 | 54 | import org.apache.hadoop.hdds.HddsConfigKeys; |
| 55 | +import org.apache.hadoop.hdds.conf.ConfigurationSource; |
54 | 56 | import org.apache.hadoop.hdds.conf.OzoneConfiguration; |
55 | 57 | import org.apache.hadoop.hdds.conf.StorageUnit; |
56 | 58 | import org.apache.hadoop.hdds.protocol.DatanodeDetails; |
@@ -1279,8 +1281,8 @@ public Map<String, String> getNodeStatistics() { |
1279 | 1281 | nodeStateStatistics(nodeStatistics); |
1280 | 1282 | // Statistics node space |
1281 | 1283 | nodeSpaceStatistics(nodeStatistics); |
1282 | | - // Statistics node readOnly |
1283 | | - nodeOutOfSpaceStatistics(nodeStatistics); |
| 1284 | + // Statistics node non-writable |
| 1285 | + nodeNonWritableStatistics(nodeStatistics); |
1284 | 1286 | // todo: Statistics of other instances |
1285 | 1287 | return nodeStatistics; |
1286 | 1288 | } |
@@ -1368,43 +1370,59 @@ private void nodeSpaceStatistics(Map<String, String> nodeStatics) { |
1368 | 1370 | nodeStatics.put(SpaceStatistics.NON_SCM_USED.getLabel(), nonScmUsed); |
1369 | 1371 | } |
1370 | 1372 |
|
1371 | | - private void nodeOutOfSpaceStatistics(Map<String, String> nodeStatics) { |
1372 | | - List<DatanodeInfo> allNodes = getAllNodes(); |
1373 | | - long blockSize = (long) conf.getStorageSize( |
1374 | | - OzoneConfigKeys.OZONE_SCM_BLOCK_SIZE, |
1375 | | - OzoneConfigKeys.OZONE_SCM_BLOCK_SIZE_DEFAULT, |
1376 | | - StorageUnit.BYTES); |
1377 | | - long minRatisVolumeSizeBytes = (long) conf.getStorageSize( |
1378 | | - ScmConfigKeys.OZONE_DATANODE_RATIS_VOLUME_FREE_SPACE_MIN, |
1379 | | - ScmConfigKeys.OZONE_DATANODE_RATIS_VOLUME_FREE_SPACE_MIN_DEFAULT, |
1380 | | - StorageUnit.BYTES); |
1381 | | - long containerSize = (long) conf.getStorageSize( |
1382 | | - ScmConfigKeys.OZONE_SCM_CONTAINER_SIZE, |
1383 | | - ScmConfigKeys.OZONE_SCM_CONTAINER_SIZE_DEFAULT, |
1384 | | - StorageUnit.BYTES); |
1385 | | - |
1386 | | - int nodeOutOfSpaceCount = (int) allNodes.parallelStream() |
1387 | | - .filter(dn -> !hasEnoughSpace(dn, minRatisVolumeSizeBytes, containerSize, conf) |
1388 | | - && !hasEnoughCommittedVolumeSpace(dn, blockSize)) |
| 1373 | + private void nodeNonWritableStatistics(Map<String, String> nodeStatics) { |
| 1374 | + int nonWritableNodesCount = (int) getAllNodes().parallelStream() |
| 1375 | + .filter(new NonWritableNodeFilter(conf)) |
1389 | 1376 | .count(); |
1390 | 1377 |
|
1391 | | - nodeStatics.put("NodesOutOfSpace", String.valueOf(nodeOutOfSpaceCount)); |
1392 | | - } |
1393 | | - |
1394 | | - /** |
1395 | | - * Check if any volume in the datanode has committed space >= blockSize. |
1396 | | - * |
1397 | | - * @return true if any volume has committed space >= blockSize, false otherwise |
1398 | | - */ |
1399 | | - private boolean hasEnoughCommittedVolumeSpace(DatanodeInfo dnInfo, long blockSize) { |
1400 | | - for (StorageReportProto reportProto : dnInfo.getStorageReports()) { |
1401 | | - if (reportProto.getCommitted() >= blockSize) { |
1402 | | - return true; |
| 1378 | + nodeStatics.put("NonWritableNodes", String.valueOf(nonWritableNodesCount)); |
| 1379 | + } |
| 1380 | + |
| 1381 | + static class NonWritableNodeFilter implements Predicate<DatanodeInfo> { |
| 1382 | + |
| 1383 | + private final long blockSize; |
| 1384 | + private final long minRatisVolumeSizeBytes; |
| 1385 | + private final long containerSize; |
| 1386 | + private final ConfigurationSource conf; |
| 1387 | + |
| 1388 | + NonWritableNodeFilter(ConfigurationSource conf) { |
| 1389 | + blockSize = (long) conf.getStorageSize( |
| 1390 | + OzoneConfigKeys.OZONE_SCM_BLOCK_SIZE, |
| 1391 | + OzoneConfigKeys.OZONE_SCM_BLOCK_SIZE_DEFAULT, |
| 1392 | + StorageUnit.BYTES); |
| 1393 | + minRatisVolumeSizeBytes = (long) conf.getStorageSize( |
| 1394 | + ScmConfigKeys.OZONE_DATANODE_RATIS_VOLUME_FREE_SPACE_MIN, |
| 1395 | + ScmConfigKeys.OZONE_DATANODE_RATIS_VOLUME_FREE_SPACE_MIN_DEFAULT, |
| 1396 | + StorageUnit.BYTES); |
| 1397 | + containerSize = (long) conf.getStorageSize( |
| 1398 | + ScmConfigKeys.OZONE_SCM_CONTAINER_SIZE, |
| 1399 | + ScmConfigKeys.OZONE_SCM_CONTAINER_SIZE_DEFAULT, |
| 1400 | + StorageUnit.BYTES); |
| 1401 | + this.conf = conf; |
| 1402 | + } |
| 1403 | + |
| 1404 | + @Override |
| 1405 | + public boolean test(DatanodeInfo dn) { |
| 1406 | + return !dn.getNodeStatus().isNodeWritable() |
| 1407 | + || (!hasEnoughSpace(dn, minRatisVolumeSizeBytes, containerSize, conf) |
| 1408 | + && !hasEnoughCommittedVolumeSpace(dn)); |
| 1409 | + } |
| 1410 | + |
| 1411 | + /** |
| 1412 | + * Check if any volume in the datanode has committed space >= blockSize. |
| 1413 | + * |
| 1414 | + * @return true if any volume has committed space >= blockSize, false otherwise |
| 1415 | + */ |
| 1416 | + private boolean hasEnoughCommittedVolumeSpace(DatanodeInfo dnInfo) { |
| 1417 | + for (StorageReportProto reportProto : dnInfo.getStorageReports()) { |
| 1418 | + if (reportProto.getCommitted() >= blockSize) { |
| 1419 | + return true; |
| 1420 | + } |
1403 | 1421 | } |
| 1422 | + LOG.debug("Datanode {} has no volumes with committed space >= {} bytes", |
| 1423 | + dnInfo.getID(), blockSize); |
| 1424 | + return false; |
1404 | 1425 | } |
1405 | | - LOG.debug("Datanode {} has no volumes with committed space >= {} bytes", |
1406 | | - dnInfo.getID(), blockSize); |
1407 | | - return false; |
1408 | 1426 | } |
1409 | 1427 |
|
1410 | 1428 | /** |
|
0 commit comments