You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ta...@apache.org on 2022/12/07 03:50:54 UTC

[iotdb] branch rel/1.0 updated: [To rel/1.0][IOTDB-5118] FileMetric opens too many file descriptors (#8348)

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

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


The following commit(s) were added to refs/heads/rel/1.0 by this push:
     new 67bbd2e7a9 [To rel/1.0][IOTDB-5118] FileMetric opens too many file descriptors (#8348)
67bbd2e7a9 is described below

commit 67bbd2e7a96a3d8d273348081a8bb4e366446b90
Author: Alan Choo <43...@users.noreply.github.com>
AuthorDate: Wed Dec 7 11:50:48 2022 +0800

    [To rel/1.0][IOTDB-5118] FileMetric opens too many file descriptors (#8348)
    
    * fix wal file num metric
    
    * fix usage of Files list method
---
 .../confignode/persistence/ProcedureInfo.java      |  7 ++--
 .../confignode/procedure/store/ProcedureStore.java |  6 ++--
 .../iotdb/db/service/metrics/FileMetrics.java      | 37 +---------------------
 .../java/org/apache/iotdb/db/wal/WALManager.java   | 14 ++++++++
 .../iotdb/db/wal/buffer/AbstractWALBuffer.java     |  1 +
 .../java/org/apache/iotdb/db/wal/node/WALNode.java |  5 ++-
 .../iotdb/db/wal/recover/WALNodeRecoverTask.java   |  7 ++--
 7 files changed, 30 insertions(+), 47 deletions(-)

diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ProcedureInfo.java b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ProcedureInfo.java
index 6a45ea3d8d..aebab36ddb 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ProcedureInfo.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ProcedureInfo.java
@@ -38,6 +38,7 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Stream;
 
 public class ProcedureInfo {
 
@@ -49,10 +50,8 @@ public class ProcedureInfo {
   private final ConcurrentHashMap<Long, ProcedureWAL> procWALMap = new ConcurrentHashMap<>();
 
   public void load(List<Procedure> procedureList) {
-    try {
-      Files.list(Paths.get(procedureWalDir))
-          .filter(
-              path -> path.getFileName().toString().endsWith(ProcedureStore.PROCEDURE_WAL_SUFFIX))
+    try (Stream<Path> s = Files.list(Paths.get(procedureWalDir))) {
+      s.filter(path -> path.getFileName().toString().endsWith(ProcedureStore.PROCEDURE_WAL_SUFFIX))
           .sorted(
               (p1, p2) ->
                   Long.compareUnsigned(
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureStore.java b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureStore.java
index 9700675728..123199d841 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureStore.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureStore.java
@@ -34,6 +34,7 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Stream;
 
 public class ProcedureStore implements IProcedureStore {
 
@@ -79,9 +80,8 @@ public class ProcedureStore implements IProcedureStore {
    * @param procedureList procedureList
    */
   public void load(List<Procedure> procedureList) {
-    try {
-      Files.list(Paths.get(procedureWalDir))
-          .filter(path -> path.getFileName().toString().endsWith(PROCEDURE_WAL_SUFFIX))
+    try (Stream<Path> s = Files.list(Paths.get(procedureWalDir))) {
+      s.filter(path -> path.getFileName().toString().endsWith(PROCEDURE_WAL_SUFFIX))
           .sorted(
               (p1, p2) ->
                   Long.compareUnsigned(
diff --git a/server/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java b/server/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java
index 14b0d4981c..765e00452f 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java
@@ -20,7 +20,6 @@
 package org.apache.iotdb.db.service.metrics;
 
 import org.apache.iotdb.commons.concurrent.threadpool.ScheduledExecutorUtil;
-import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.service.metric.enums.Metric;
 import org.apache.iotdb.commons.service.metric.enums.Tag;
 import org.apache.iotdb.db.engine.TsFileMetricManager;
@@ -34,13 +33,10 @@ import org.apache.iotdb.metrics.utils.MetricType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.File;
-import java.io.UncheckedIOException;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
 
 public class FileMetrics implements IMetricSet {
   private static final Logger logger = LoggerFactory.getLogger(FileMetrics.class);
@@ -135,41 +131,10 @@ public class FileMetrics implements IMetricSet {
   }
 
   private void collect() {
-    String[] walDirs = CommonDescriptor.getInstance().getConfig().getWalDirs();
     walFileTotalSize = WALManager.getInstance().getTotalDiskUsage();
     sequenceFileTotalSize = TsFileMetricManager.getInstance().getFileSize(true);
     unsequenceFileTotalSize = TsFileMetricManager.getInstance().getFileSize(false);
-    walFileTotalCount =
-        Stream.of(walDirs)
-            .mapToLong(
-                dir -> {
-                  File walFolder = new File(dir);
-                  if (walFolder.exists()) {
-                    File[] walNodeFolders = walFolder.listFiles(File::isDirectory);
-                    long result = 0L;
-                    if (null != walNodeFolders) {
-                      for (File walNodeFolder : walNodeFolders) {
-                        if (walNodeFolder.exists() && walNodeFolder.isDirectory()) {
-                          try {
-                            result +=
-                                org.apache.commons.io.FileUtils.listFiles(walFolder, null, true)
-                                    .size();
-                          } catch (UncheckedIOException exception) {
-                            // do nothing
-                            logger.debug(
-                                "Failed when count wal folder {}: ",
-                                walNodeFolder.getName(),
-                                exception);
-                          }
-                        }
-                      }
-                    }
-                    return result;
-                  } else {
-                    return 0L;
-                  }
-                })
-            .sum();
+    walFileTotalCount = WALManager.getInstance().getTotalFileNum();
     sequenceFileTotalCount = TsFileMetricManager.getInstance().getFileNum(true);
     unsequenceFileTotalCount = TsFileMetricManager.getInstance().getFileNum(false);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/wal/WALManager.java b/server/src/main/java/org/apache/iotdb/db/wal/WALManager.java
index 8a822a3ee7..8343f14021 100644
--- a/server/src/main/java/org/apache/iotdb/db/wal/WALManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/wal/WALManager.java
@@ -59,6 +59,8 @@ public class WALManager implements IService {
   private ScheduledExecutorService walDeleteThread;
   /** total disk usage of wal files */
   private final AtomicLong totalDiskUsage = new AtomicLong();
+  /** total number of wal files */
+  private final AtomicLong totalFileNum = new AtomicLong();
 
   private WALManager() {
     if (config.isClusterMode()
@@ -199,6 +201,18 @@ public class WALManager implements IService {
     totalDiskUsage.accumulateAndGet(size, (x, y) -> x - y);
   }
 
+  public long getTotalFileNum() {
+    return totalFileNum.get();
+  }
+
+  public void addTotalFileNum(long size) {
+    totalFileNum.accumulateAndGet(size, Long::sum);
+  }
+
+  public void subtractTotalFileNum(long size) {
+    totalFileNum.accumulateAndGet(size, (x, y) -> x - y);
+  }
+
   @Override
   public void stop() {
     if (config.getWalMode() == WALMode.DISABLE) {
diff --git a/server/src/main/java/org/apache/iotdb/db/wal/buffer/AbstractWALBuffer.java b/server/src/main/java/org/apache/iotdb/db/wal/buffer/AbstractWALBuffer.java
index 53b94089c3..c7609c08b3 100644
--- a/server/src/main/java/org/apache/iotdb/db/wal/buffer/AbstractWALBuffer.java
+++ b/server/src/main/java/org/apache/iotdb/db/wal/buffer/AbstractWALBuffer.java
@@ -84,6 +84,7 @@ public abstract class AbstractWALBuffer implements IWALBuffer {
     String currentName = currentFile.getName();
     currentWALFileWriter.close();
     WALManager.getInstance().addTotalDiskUsage(currentWALFileWriter.size());
+    WALManager.getInstance().addTotalFileNum(1);
     if (WALFileUtils.parseStatusCode(currentName) != fileStatus) {
       String targetName =
           WALFileUtils.getLogFileName(
diff --git a/server/src/main/java/org/apache/iotdb/db/wal/node/WALNode.java b/server/src/main/java/org/apache/iotdb/db/wal/node/WALNode.java
index 381ab2b30c..6e1448765e 100644
--- a/server/src/main/java/org/apache/iotdb/db/wal/node/WALNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/wal/node/WALNode.java
@@ -285,11 +285,12 @@ public class WALNode implements IWALNode {
       }
       // delete files
       int deletedFilesNum = 0;
+      long deletedFilesSize = 0;
       for (int i = 0; i < endFileIndex; ++i) {
         long fileSize = filesToDelete[i].length();
         if (filesToDelete[i].delete()) {
           deletedFilesNum++;
-          WALManager.getInstance().subtractTotalDiskUsage(fileSize);
+          deletedFilesSize += fileSize;
         } else {
           logger.info(
               "Fail to delete outdated wal file {} of wal node-{}.", filesToDelete[i], identifier);
@@ -301,6 +302,8 @@ public class WALNode implements IWALNode {
           totalCostOfFlushedMemTables.addAndGet(-memTableRamCostSum);
         }
       }
+      WALManager.getInstance().subtractTotalDiskUsage(deletedFilesSize);
+      WALManager.getInstance().subtractTotalFileNum(deletedFilesNum);
       logger.debug(
           "Successfully delete {} outdated wal files for wal node-{}.",
           deletedFilesNum,
diff --git a/server/src/main/java/org/apache/iotdb/db/wal/recover/WALNodeRecoverTask.java b/server/src/main/java/org/apache/iotdb/db/wal/recover/WALNodeRecoverTask.java
index 0a8240a075..03bd66e32f 100644
--- a/server/src/main/java/org/apache/iotdb/db/wal/recover/WALNodeRecoverTask.java
+++ b/server/src/main/java/org/apache/iotdb/db/wal/recover/WALNodeRecoverTask.java
@@ -111,9 +111,10 @@ public class WALNodeRecoverTask implements Runnable {
       long lastVersionId = indexInfo[0];
       long lastSearchIndex = indexInfo[1];
       // update disk usage
-      long totalSize =
-          Arrays.stream(WALFileUtils.listAllWALFiles(logDirectory)).mapToLong(File::length).sum();
-      WALManager.getInstance().addTotalDiskUsage(totalSize);
+      File[] walFiles = WALFileUtils.listAllWALFiles(logDirectory);
+      WALManager.getInstance()
+          .addTotalDiskUsage(Arrays.stream(walFiles).mapToLong(File::length).sum());
+      WALManager.getInstance().addTotalFileNum(walFiles.length);
       // register wal node
       WALManager.getInstance()
           .registerWALNode(