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

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


The following commit(s) were added to refs/heads/master by this push:
     new c1fbd9bec7 [IOTDB-5118] FileMetric opens too many file descriptors 
(#8347)
c1fbd9bec7 is described below

commit c1fbd9bec7a6adb095f35ab977bf80305a897c51
Author: Alan Choo <[email protected]>
AuthorDate: Wed Dec 7 11:49:56 2022 +0800

    [IOTDB-5118] FileMetric opens too many file descriptors (#8347)
    
    * 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 c91e59f4d2..15b71830ca 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(

Reply via email to