You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2022/10/27 08:38:39 UTC

[iotdb] branch rel/0.13 updated: Fix the statistic of the size of disk in linux system (#7697)

This is an automated email from the ASF dual-hosted git repository.

xingtanzjr pushed a commit to branch rel/0.13
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/0.13 by this push:
     new 51c37c254f Fix the statistic of the size of disk in linux system (#7697)
51c37c254f is described below

commit 51c37c254f151a0f6399eb07e6af8ad8ab81e07d
Author: ZhangHongYin <46...@users.noreply.github.com>
AuthorDate: Thu Oct 27 16:38:32 2022 +0800

    Fix the statistic of the size of disk in linux system (#7697)
---
 .../service/metrics/predefined/SystemMetrics.java  | 44 +++++++++++++++++++---
 1 file changed, 39 insertions(+), 5 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/service/metrics/predefined/SystemMetrics.java b/server/src/main/java/org/apache/iotdb/db/service/metrics/predefined/SystemMetrics.java
index ee81b29161..200f624231 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/metrics/predefined/SystemMetrics.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/metrics/predefined/SystemMetrics.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.service.metrics.predefined;
 
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.service.metrics.enums.Metric;
 import org.apache.iotdb.db.service.metrics.enums.Tag;
 import org.apache.iotdb.metrics.AbstractMetricService;
@@ -27,18 +28,28 @@ import org.apache.iotdb.metrics.utils.MetricLevel;
 import org.apache.iotdb.metrics.utils.MetricType;
 
 import com.sun.management.OperatingSystemMXBean;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-import java.io.File;
+import java.io.IOException;
 import java.lang.management.ManagementFactory;
+import java.nio.file.FileStore;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashSet;
+import java.util.Set;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 public class SystemMetrics implements IMetricSet {
+  private static final Logger logger = LoggerFactory.getLogger(SystemMetrics.class);
   private com.sun.management.OperatingSystemMXBean osMXBean;
   private Future<?> currentServiceFuture;
   private final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
+  private final Set<FileStore> fileStores = new HashSet<>();
   private long systemDiskTotalSpace = 0L;
   private long systemDiskFreeSpace = 0L;
 
@@ -165,6 +176,25 @@ public class SystemMetrics implements IMetricSet {
   }
 
   private void collectSystemDiskInfo(AbstractMetricService metricService) {
+    String[] dataDirs = IoTDBDescriptor.getInstance().getConfig().getDataDirs();
+    for (String dataDir : dataDirs) {
+      Path path = Paths.get(dataDir);
+      FileStore fileStore = null;
+      try {
+        fileStore = Files.getFileStore(path);
+      } catch (IOException e) {
+        // check parent if path is not exists
+        path = path.getParent();
+        try {
+          fileStore = Files.getFileStore(path);
+        } catch (IOException innerException) {
+          logger.error("Failed to get storage path of {}, because", dataDir, innerException);
+        }
+      }
+      if (null != fileStore) {
+        fileStores.add(fileStore);
+      }
+    }
     metricService.getOrCreateAutoGauge(
         Metric.SYS_DISK_TOTAL_SPACE.toString(),
         MetricLevel.CORE,
@@ -182,6 +212,7 @@ public class SystemMetrics implements IMetricSet {
   }
 
   private void removeSystemDiskInfo(AbstractMetricService metricService) {
+    fileStores.clear();
     metricService.remove(
         MetricType.GAUGE, Metric.SYS_DISK_TOTAL_SPACE.toString(), Tag.NAME.toString(), "system");
     metricService.remove(
@@ -189,12 +220,15 @@ public class SystemMetrics implements IMetricSet {
   }
 
   private void collect() {
-    File[] files = File.listRoots();
     long sysTotalSpace = 0L;
     long sysFreeSpace = 0L;
-    for (File file : files) {
-      sysTotalSpace += file.getTotalSpace();
-      sysFreeSpace += file.getFreeSpace();
+    for (FileStore fileStore : fileStores) {
+      try {
+        sysTotalSpace += fileStore.getTotalSpace();
+        sysFreeSpace += fileStore.getUsableSpace();
+      } catch (Exception e) {
+        logger.error("Failed to statistic the size of {}, because ", fileStore, e);
+      }
     }
     systemDiskTotalSpace = sysTotalSpace;
     systemDiskFreeSpace = sysFreeSpace;