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(