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

jt2594838 pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/dev/1.3 by this push:
     new e2014ff5329 Reduce repeated failure logs (#18175) (#18193)
e2014ff5329 is described below

commit e2014ff53294d719da3202cc2830b5ab9e6fbe8a
Author: Caideyipi <[email protected]>
AuthorDate: Tue Jul 14 09:32:58 2026 +0800

    Reduce repeated failure logs (#18175) (#18193)
    
    * Reduce repeated failure logs
    
    * Fix Chinese log message encoding
---
 .../handlers/rpc/DataNodeTSStatusRPCHandler.java   | 12 ++++-
 .../manager/partition/PartitionManager.java        |  8 ++-
 .../agent/runtime/PipeConfigNodeRuntimeAgent.java  | 10 ++--
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  |  4 +-
 .../agent/runtime/PipeDataNodeRuntimeAgent.java    | 10 ++--
 .../protocol/thrift/IoTDBDataNodeReceiver.java     |  4 +-
 .../thrift/impl/DataNodeRegionManager.java         |  7 ++-
 .../schemaregion/SchemaRegionLoader.java           |  8 ++-
 .../storageengine/rescon/disk/FolderManager.java   | 11 +++-
 .../apache/iotdb/commons/conf/CommonConfig.java    | 43 ++++++++++-----
 .../LoggerPeriodicalLogReducer.java}               | 63 ++++++++++++++--------
 .../iotdb/commons/pipe/config/PipeConfig.java      |  4 +-
 .../iotdb/commons/pipe/config/PipeDescriptor.java  | 16 +++---
 .../commons/pipe/receiver/IoTDBFileReceiver.java   | 24 ++++++---
 .../commons/pipe/resource/log/PipeLogger.java      | 12 +++--
 .../LoggerPeriodicalLogReducerTest.java}           | 21 ++++----
 16 files changed, 173 insertions(+), 84 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/rpc/DataNodeTSStatusRPCHandler.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/rpc/DataNodeTSStatusRPCHandler.java
index 7c93f363dd4..a44e3781c25 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/rpc/DataNodeTSStatusRPCHandler.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/rpc/DataNodeTSStatusRPCHandler.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.confignode.client.async.handlers.rpc;
 
 import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.log.LoggerPeriodicalLogReducer;
 import org.apache.iotdb.confignode.client.async.CnToDnAsyncRequestType;
 import org.apache.iotdb.rpc.RpcUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
@@ -56,7 +57,7 @@ public class DataNodeTSStatusRPCHandler extends 
DataNodeAsyncRequestRPCHandler<T
       nodeLocationMap.remove(requestId);
       LOGGER.info("Successfully {} on DataNode: {}", requestType, 
formattedTargetLocation);
     } else {
-      LOGGER.error(
+      logFailure(
           "Failed to {} on DataNode: {}, response: {}",
           requestType,
           formattedTargetLocation,
@@ -76,7 +77,7 @@ public class DataNodeTSStatusRPCHandler extends 
DataNodeAsyncRequestRPCHandler<T
             + formattedTargetLocation
             + ", exception: "
             + e.getMessage();
-    LOGGER.error(errorMsg);
+    logFailure(errorMsg);
 
     responseMap.put(
         requestId,
@@ -86,4 +87,11 @@ public class DataNodeTSStatusRPCHandler extends 
DataNodeAsyncRequestRPCHandler<T
     // Always CountDown
     countDownLatch.countDown();
   }
+
+  private void logFailure(final String format, final Object... args) {
+    if (!LoggerPeriodicalLogReducer.shouldLog(format, args)) {
+      return;
+    }
+    LOGGER.error(format, args);
+  }
 }
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java
index e186be44354..056b819d5bc 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java
@@ -32,6 +32,7 @@ import org.apache.iotdb.commons.concurrent.ThreadName;
 import org.apache.iotdb.commons.concurrent.threadpool.ScheduledExecutorUtil;
 import org.apache.iotdb.commons.conf.CommonConfig;
 import org.apache.iotdb.commons.conf.CommonDescriptor;
+import org.apache.iotdb.commons.log.LoggerPeriodicalLogReducer;
 import org.apache.iotdb.commons.partition.DataPartitionTable;
 import org.apache.iotdb.commons.partition.SchemaPartitionTable;
 import org.apache.iotdb.commons.partition.executor.SeriesPartitionExecutor;
@@ -280,7 +281,12 @@ public class PartitionManager {
           return resp;
         }
 
-        LOGGER.error("Create SchemaPartition failed because: ", e);
+        if (LoggerPeriodicalLogReducer.shouldLog(
+            "Create SchemaPartition failed because: "
+                + e.getClass().getName()
+                + String.valueOf(e.getMessage()))) {
+          LOGGER.error("Create SchemaPartition failed because: ", e);
+        }
         resp.setStatus(
             new 
TSStatus(TSStatusCode.NO_AVAILABLE_REGION_GROUP.getStatusCode())
                 .setMessage(e.getMessage()));
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/agent/runtime/PipeConfigNodeRuntimeAgent.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/agent/runtime/PipeConfigNodeRuntimeAgent.java
index 900ccc8c10b..f5a864cd974 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/agent/runtime/PipeConfigNodeRuntimeAgent.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/agent/runtime/PipeConfigNodeRuntimeAgent.java
@@ -21,13 +21,13 @@ package 
org.apache.iotdb.confignode.manager.pipe.agent.runtime;
 
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.exception.pipe.PipeRuntimeException;
+import org.apache.iotdb.commons.log.LoggerPeriodicalLogReducer;
 import org.apache.iotdb.commons.pipe.agent.runtime.PipePeriodicalJobExecutor;
 import 
org.apache.iotdb.commons.pipe.agent.runtime.PipePeriodicalPhantomReferenceCleaner;
 import org.apache.iotdb.commons.pipe.agent.task.meta.PipeTaskMeta;
 import org.apache.iotdb.commons.pipe.config.PipeConfig;
 import org.apache.iotdb.commons.pipe.event.EnrichedEvent;
 import org.apache.iotdb.commons.pipe.resource.log.PipeLogger;
-import org.apache.iotdb.commons.pipe.resource.log.PipePeriodicalLogReducer;
 import org.apache.iotdb.commons.service.IService;
 import org.apache.iotdb.commons.service.ServiceType;
 import org.apache.iotdb.confignode.manager.pipe.agent.PipeConfigNodeAgent;
@@ -58,7 +58,7 @@ public class PipeConfigNodeRuntimeAgent implements IService {
   @Override
   public synchronized void start() {
     PipeConfig.getInstance().printAllConfigs();
-    initPipePeriodicalLogReducer();
+    initLoggerPeriodicalLogReducer();
 
     // PipeTasks will not be started here and will be started by 
"HandleLeaderChange"
     // procedure when the consensus layer notify leader ready
@@ -95,10 +95,10 @@ public class PipeConfigNodeRuntimeAgent implements IService 
{
     LOGGER.info("PipeRuntimeConfigNodeAgent stopped");
   }
 
-  private void initPipePeriodicalLogReducer() {
-    PipePeriodicalLogReducer.setMemoryResizeFunction(
+  private void initLoggerPeriodicalLogReducer() {
+    LoggerPeriodicalLogReducer.setMemoryResizeFunction(
         PipeConfigNodeResourceManager.memory()::resizeLogReducerMemory);
-    PipeLogger.setLogger(PipePeriodicalLogReducer::log);
+    PipeLogger.setLogger(LoggerPeriodicalLogReducer::log);
   }
 
   public boolean isShutdown() {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
index 792433829c6..b38a7c186ec 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
@@ -25,8 +25,8 @@ import org.apache.iotdb.commons.conf.ConfigurationFileUtils;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.conf.TrimProperties;
 import org.apache.iotdb.commons.exception.BadNodeUrlException;
+import org.apache.iotdb.commons.log.LoggerPeriodicalLogReducer;
 import org.apache.iotdb.commons.pipe.config.PipeDescriptor;
-import org.apache.iotdb.commons.pipe.resource.log.PipePeriodicalLogReducer;
 import org.apache.iotdb.commons.schema.SchemaConstant;
 import org.apache.iotdb.commons.service.metric.MetricService;
 import org.apache.iotdb.commons.utils.NodeUrlUtils;
@@ -2647,7 +2647,7 @@ public class IoTDBDescriptor {
 
   private void loadPipeHotModifiedProp(TrimProperties properties) throws 
IOException {
     PipeDescriptor.loadPipeProps(commonDescriptor.getConfig(), properties, 
true);
-    PipePeriodicalLogReducer.update();
+    LoggerPeriodicalLogReducer.update();
   }
 
   @SuppressWarnings("squid:S3518") // "proportionSum" can't be zero
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/runtime/PipeDataNodeRuntimeAgent.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/runtime/PipeDataNodeRuntimeAgent.java
index f88e98d7165..235e7c1b0c9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/runtime/PipeDataNodeRuntimeAgent.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/runtime/PipeDataNodeRuntimeAgent.java
@@ -25,6 +25,7 @@ import 
org.apache.iotdb.commons.consensus.index.impl.RecoverProgressIndex;
 import org.apache.iotdb.commons.exception.StartupException;
 import org.apache.iotdb.commons.exception.pipe.PipeRuntimeCriticalException;
 import org.apache.iotdb.commons.exception.pipe.PipeRuntimeException;
+import org.apache.iotdb.commons.log.LoggerPeriodicalLogReducer;
 import org.apache.iotdb.commons.pipe.agent.runtime.PipePeriodicalJobExecutor;
 import 
org.apache.iotdb.commons.pipe.agent.runtime.PipePeriodicalPhantomReferenceCleaner;
 import org.apache.iotdb.commons.pipe.agent.task.meta.PipeTaskMeta;
@@ -32,7 +33,6 @@ import org.apache.iotdb.commons.pipe.config.PipeConfig;
 import org.apache.iotdb.commons.pipe.datastructure.pattern.IoTDBPipePattern;
 import org.apache.iotdb.commons.pipe.event.EnrichedEvent;
 import org.apache.iotdb.commons.pipe.resource.log.PipeLogger;
-import org.apache.iotdb.commons.pipe.resource.log.PipePeriodicalLogReducer;
 import org.apache.iotdb.commons.service.IService;
 import org.apache.iotdb.commons.service.ServiceType;
 import org.apache.iotdb.commons.utils.TestOnly;
@@ -89,23 +89,23 @@ public class PipeDataNodeRuntimeAgent implements IService {
 
     IoTDBPipePattern.setDevicePathGetter(CompactionPathUtils::getPath);
     IoTDBPipePattern.setMeasurementPathGetter(CompactionPathUtils::getPath);
-    initPipePeriodicalLogReducer();
+    initLoggerPeriodicalLogReducer();
   }
 
-  private void initPipePeriodicalLogReducer() {
+  private void initLoggerPeriodicalLogReducer() {
     if (pipeLogReducerMemoryBlock == null) {
       pipeLogReducerMemoryBlock =
           PipeDataNodeResourceManager.memory()
               
.tryAllocate(PipeConfig.getInstance().getPipeLoggerCacheMaxSizeInBytes());
     }
 
-    PipePeriodicalLogReducer.setMemoryResizeFunction(
+    LoggerPeriodicalLogReducer.setMemoryResizeFunction(
         targetSizeInBytes -> {
           PipeDataNodeResourceManager.memory()
               .resize(pipeLogReducerMemoryBlock, Math.max(0, 
targetSizeInBytes), false);
           return pipeLogReducerMemoryBlock.getMemoryUsageInBytes();
         });
-    PipeLogger.setLogger(PipePeriodicalLogReducer::log);
+    PipeLogger.setLogger(LoggerPeriodicalLogReducer::log);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java
index 945b4a55209..a1975f8bbe2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import 
org.apache.iotdb.commons.exception.pipe.PipeRuntimeOutOfMemoryCriticalException;
+import org.apache.iotdb.commons.log.LoggerPeriodicalLogReducer;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.pipe.config.PipeConfig;
 import org.apache.iotdb.commons.pipe.datastructure.pattern.IoTDBPipePattern;
@@ -31,7 +32,6 @@ import 
org.apache.iotdb.commons.pipe.datastructure.pattern.PipePattern;
 import org.apache.iotdb.commons.pipe.receiver.IoTDBFileReceiver;
 import org.apache.iotdb.commons.pipe.receiver.PipeReceiverStatusHandler;
 import org.apache.iotdb.commons.pipe.resource.log.PipeLogger;
-import org.apache.iotdb.commons.pipe.resource.log.PipePeriodicalLogReducer;
 import 
org.apache.iotdb.commons.pipe.sink.payload.airgap.AirGapPseudoTPipeTransferRequest;
 import 
org.apache.iotdb.commons.pipe.sink.payload.thrift.common.PipeTransferSliceReqHandler;
 import 
org.apache.iotdb.commons.pipe.sink.payload.thrift.request.PipeRequestType;
@@ -929,7 +929,7 @@ public class IoTDBDataNodeReceiver extends 
IoTDBFileReceiver {
   static boolean shouldLogStatementException(
       final long receiverId, final Statement statement, final Exception e) {
     // Use the reducer cache as a gate. The actual stack trace is logged only 
when it passes.
-    return PipePeriodicalLogReducer.log(
+    return LoggerPeriodicalLogReducer.log(
         message -> {},
         "Receiver id = %s, statement = %s, exception = %s, message = %s",
         receiverId,
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeRegionManager.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeRegionManager.java
index 1b474ac7257..7d4631a0742 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeRegionManager.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeRegionManager.java
@@ -29,6 +29,7 @@ import org.apache.iotdb.commons.consensus.DataRegionId;
 import org.apache.iotdb.commons.consensus.SchemaRegionId;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.exception.MetadataException;
+import org.apache.iotdb.commons.log.LoggerPeriodicalLogReducer;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.consensus.common.Peer;
 import org.apache.iotdb.consensus.exception.ConsensusException;
@@ -126,7 +127,11 @@ public class DataNodeRegionManager {
       tsStatus = new TSStatus(TSStatusCode.ILLEGAL_PATH.getStatusCode());
       tsStatus.setMessage("Create Schema Region failed because storageGroup 
path is illegal.");
     } catch (MetadataException e2) {
-      LOGGER.error("Create Schema Region {} failed because {}", storageGroup, 
e2.getMessage());
+      if (LoggerPeriodicalLogReducer.shouldLog(
+          "Create Schema Region failed because of %s",
+          e2.getClass().getName() + String.valueOf(e2.getMessage()))) {
+        LOGGER.error("Create Schema Region {} failed because {}", 
storageGroup, e2.getMessage());
+      }
       tsStatus = new 
TSStatus(TSStatusCode.CREATE_REGION_ERROR.getStatusCode());
       tsStatus.setMessage(
           String.format("Create Schema Region failed because of %s", 
e2.getMessage()));
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionLoader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionLoader.java
index 5d47acfda5c..161f428d529 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionLoader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionLoader.java
@@ -125,7 +125,13 @@ public class SchemaRegionLoader {
       throws MetadataException {
     try {
       return currentConstructor.newInstance(schemaRegionParams);
-    } catch (InstantiationException | IllegalAccessException | 
InvocationTargetException e) {
+    } catch (InvocationTargetException e) {
+      if (e.getTargetException() instanceof MetadataException) {
+        throw (MetadataException) e.getTargetException();
+      }
+      logger.warn(e.getMessage(), e);
+      throw new MetadataException(e);
+    } catch (InstantiationException | IllegalAccessException e) {
       logger.warn(e.getMessage(), e);
       throw new MetadataException(e);
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/FolderManager.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/FolderManager.java
index 0851a698aba..9315c63cd55 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/FolderManager.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/FolderManager.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.storageengine.rescon.disk;
 
 import org.apache.iotdb.commons.cluster.NodeStatus;
 import org.apache.iotdb.commons.conf.CommonDescriptor;
+import org.apache.iotdb.commons.log.LoggerPeriodicalLogReducer;
 import org.apache.iotdb.db.exception.DiskSpaceInsufficientException;
 import 
org.apache.iotdb.db.storageengine.rescon.disk.strategy.DirectoryStrategy;
 import 
org.apache.iotdb.db.storageengine.rescon.disk.strategy.DirectoryStrategyType;
@@ -62,7 +63,10 @@ public class FolderManager {
     try {
       this.selectStrategy.setFolders(folders);
     } catch (DiskSpaceInsufficientException e) {
-      logger.error("All folders are full, change system mode to read-only.", 
e);
+      if (LoggerPeriodicalLogReducer.shouldLog(
+          "All folders are full, change system mode to read-only.")) {
+        logger.error("All folders are full, change system mode to read-only.", 
e);
+      }
       
CommonDescriptor.getInstance().getConfig().setNodeStatus(NodeStatus.ReadOnly);
       
CommonDescriptor.getInstance().getConfig().setStatusReason(NodeStatus.DISK_FULL);
       throw e;
@@ -73,7 +77,10 @@ public class FolderManager {
     try {
       return folders.get(selectStrategy.nextFolderIndex());
     } catch (DiskSpaceInsufficientException e) {
-      logger.error("All folders are full, change system mode to read-only.", 
e);
+      if (LoggerPeriodicalLogReducer.shouldLog(
+          "All folders are full, change system mode to read-only.")) {
+        logger.error("All folders are full, change system mode to read-only.", 
e);
+      }
       
CommonDescriptor.getInstance().getConfig().setNodeStatus(NodeStatus.ReadOnly);
       
CommonDescriptor.getInstance().getConfig().setStatusReason(NodeStatus.DISK_FULL);
       throw e;
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
index 37929ed1860..91fa09daac1 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
@@ -319,8 +319,8 @@ public class CommonConfig {
           64 * 1024 * 1024,
           (int) Math.min(Runtime.getRuntime().maxMemory() / 64, 
Integer.MAX_VALUE));
   private boolean pipeReceiverLoadConversionEnabled = false;
-  private volatile long pipePeriodicalLogMinIntervalSeconds = 60;
-  private volatile long pipeLoggerCacheMaxSizeInBytes = 16 * MB;
+  private volatile long loggerPeriodicalLogMinIntervalSeconds = 60;
+  private volatile long loggerCacheMaxSizeInBytes = 64 * MB;
 
   private volatile double pipeMetaReportMaxLogNumPerRound = 0.1;
   private volatile int pipeMetaReportMaxLogIntervalRounds = 360;
@@ -1690,29 +1690,46 @@ public class CommonConfig {
     logger.info("pipeReceiverConversionEnabled is set to {}.", 
pipeReceiverLoadConversionEnabled);
   }
 
+  public long getLoggerPeriodicalLogMinIntervalSeconds() {
+    return loggerPeriodicalLogMinIntervalSeconds;
+  }
+
+  public void setLoggerPeriodicalLogMinIntervalSeconds(long 
loggerPeriodicalLogMinIntervalSeconds) {
+    if (this.loggerPeriodicalLogMinIntervalSeconds == 
loggerPeriodicalLogMinIntervalSeconds) {
+      return;
+    }
+    this.loggerPeriodicalLogMinIntervalSeconds = 
loggerPeriodicalLogMinIntervalSeconds;
+    logger.info(
+        "loggerPeriodicalLogMinIntervalSeconds is set to {}.",
+        loggerPeriodicalLogMinIntervalSeconds);
+  }
+
   public long getPipePeriodicalLogMinIntervalSeconds() {
-    return pipePeriodicalLogMinIntervalSeconds;
+    return getLoggerPeriodicalLogMinIntervalSeconds();
   }
 
   public void setPipePeriodicalLogMinIntervalSeconds(long 
pipePeriodicalLogMinIntervalSeconds) {
-    if (this.pipePeriodicalLogMinIntervalSeconds == 
pipePeriodicalLogMinIntervalSeconds) {
+    
setLoggerPeriodicalLogMinIntervalSeconds(pipePeriodicalLogMinIntervalSeconds);
+  }
+
+  public long getLoggerCacheMaxSizeInBytes() {
+    return loggerCacheMaxSizeInBytes;
+  }
+
+  public void setLoggerCacheMaxSizeInBytes(long loggerCacheMaxSizeInBytes) {
+    if (this.loggerCacheMaxSizeInBytes == loggerCacheMaxSizeInBytes) {
       return;
     }
-    this.pipePeriodicalLogMinIntervalSeconds = 
pipePeriodicalLogMinIntervalSeconds;
-    logger.info(
-        "pipePeriodicalLogMinIntervalSeconds is set to {}.", 
pipePeriodicalLogMinIntervalSeconds);
+    this.loggerCacheMaxSizeInBytes = loggerCacheMaxSizeInBytes;
+    logger.info("loggerCacheMaxSizeInBytes is set to {}.", 
loggerCacheMaxSizeInBytes);
   }
 
   public long getPipeLoggerCacheMaxSizeInBytes() {
-    return pipeLoggerCacheMaxSizeInBytes;
+    return getLoggerCacheMaxSizeInBytes();
   }
 
   public void setPipeLoggerCacheMaxSizeInBytes(long 
pipeLoggerCacheMaxSizeInBytes) {
-    if (this.pipeLoggerCacheMaxSizeInBytes == pipeLoggerCacheMaxSizeInBytes) {
-      return;
-    }
-    this.pipeLoggerCacheMaxSizeInBytes = pipeLoggerCacheMaxSizeInBytes;
-    logger.info("pipeLoggerCacheMaxSizeInBytes is set to {}.", 
pipeLoggerCacheMaxSizeInBytes);
+    setLoggerCacheMaxSizeInBytes(pipeLoggerCacheMaxSizeInBytes);
   }
 
   public int getPipeReceiverReqDecompressedMaxLengthInBytes() {
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/resource/log/PipePeriodicalLogReducer.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/log/LoggerPeriodicalLogReducer.java
similarity index 56%
rename from 
iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/resource/log/PipePeriodicalLogReducer.java
rename to 
iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/log/LoggerPeriodicalLogReducer.java
index fa3f29ccbe3..524e76841b7 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/resource/log/PipePeriodicalLogReducer.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/log/LoggerPeriodicalLogReducer.java
@@ -17,22 +17,23 @@
  * under the License.
  */
 
-package org.apache.iotdb.commons.pipe.resource.log;
+package org.apache.iotdb.commons.log;
 
-import org.apache.iotdb.commons.pipe.config.PipeConfig;
+import org.apache.iotdb.commons.conf.CommonDescriptor;
 
 import com.github.benmanes.caffeine.cache.Cache;
 import com.github.benmanes.caffeine.cache.Caffeine;
 import org.apache.tsfile.utils.RamUsageEstimator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.slf4j.helpers.MessageFormatter;
 
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 import java.util.function.LongUnaryOperator;
 
-public class PipePeriodicalLogReducer {
-  private static final Logger LOGGER = 
LoggerFactory.getLogger(PipePeriodicalLogReducer.class);
+public class LoggerPeriodicalLogReducer {
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(LoggerPeriodicalLogReducer.class);
 
   private static final LongUnaryOperator DEFAULT_MEMORY_RESIZE_FUNCTION =
       sizeInBytes -> sizeInBytes;
@@ -41,10 +42,9 @@ public class PipePeriodicalLogReducer {
 
   protected static final Cache<String, String> LOGGER_CACHE =
       Caffeine.newBuilder()
-          .expireAfterWrite(
-              
PipeConfig.getInstance().getPipePeriodicalLogMinIntervalSeconds(), 
TimeUnit.SECONDS)
-          .weigher(PipePeriodicalLogReducer::estimateSize)
-          
.maximumWeight(PipeConfig.getInstance().getPipeLoggerCacheMaxSizeInBytes())
+          .expireAfterWrite(getLogMinIntervalSeconds(), TimeUnit.SECONDS)
+          .weigher(LoggerPeriodicalLogReducer::estimateSize)
+          .maximumWeight(getLoggerCacheMaxSizeInBytes())
           .build();
 
   private static int estimateSize(final String key, final String value) {
@@ -54,27 +54,32 @@ public class PipePeriodicalLogReducer {
 
   public static boolean log(
       final Consumer<String> loggerFunction, final String rawMessage, final 
Object... formatter) {
-    final String loggerMessage = String.format(rawMessage, formatter);
-    if (!LOGGER_CACHE.asMap().containsKey(loggerMessage)) {
-      LOGGER_CACHE.put(loggerMessage, loggerMessage);
+    final String loggerMessage = formatMessage(rawMessage, formatter);
+    if (shouldLog(loggerMessage)) {
       loggerFunction.accept(loggerMessage);
       return true;
     }
     return false;
   }
 
+  public static boolean shouldLog(final String loggerMessage) {
+    return LOGGER_CACHE.asMap().putIfAbsent(loggerMessage, loggerMessage) == 
null;
+  }
+
+  public static boolean shouldLog(final String rawMessage, final Object... 
formatter) {
+    return shouldLog(formatMessage(rawMessage, formatter));
+  }
+
   public static synchronized void setMemoryResizeFunction(
       final LongUnaryOperator memoryResizeFunction) {
-    PipePeriodicalLogReducer.memoryResizeFunction =
+    LoggerPeriodicalLogReducer.memoryResizeFunction =
         memoryResizeFunction == null ? DEFAULT_MEMORY_RESIZE_FUNCTION : 
memoryResizeFunction;
     update();
   }
 
   public static synchronized void update() {
-    final long maxWeight =
-        memoryResizeFunction.applyAsLong(
-            PipeConfig.getInstance().getPipeLoggerCacheMaxSizeInBytes());
-    LOGGER.info("PipePeriodicalLogReducer is allocated to {} bytes.", 
maxWeight);
+    final long maxWeight = 
memoryResizeFunction.applyAsLong(getLoggerCacheMaxSizeInBytes());
+    LOGGER.info("LoggerPeriodicalLogReducer is allocated to {} bytes.", 
maxWeight);
     update(maxWeight);
   }
 
@@ -82,15 +87,29 @@ public class PipePeriodicalLogReducer {
     LOGGER_CACHE
         .policy()
         .expireAfterWrite()
-        .ifPresent(
-            time ->
-                time.setExpiresAfter(
-                    
PipeConfig.getInstance().getPipePeriodicalLogMinIntervalSeconds(),
-                    TimeUnit.SECONDS));
+        .ifPresent(time -> time.setExpiresAfter(getLogMinIntervalSeconds(), 
TimeUnit.SECONDS));
     LOGGER_CACHE.policy().eviction().ifPresent(eviction -> 
eviction.setMaximum(maxWeight));
   }
 
-  private PipePeriodicalLogReducer() {
+  public static String formatMessage(final String rawMessage, final Object... 
formatter) {
+    if (formatter == null || formatter.length == 0) {
+      return rawMessage;
+    }
+    if (rawMessage.contains("{}")) {
+      return MessageFormatter.arrayFormat(rawMessage, formatter).getMessage();
+    }
+    return String.format(rawMessage, formatter);
+  }
+
+  private static long getLogMinIntervalSeconds() {
+    return 
CommonDescriptor.getInstance().getConfig().getLoggerPeriodicalLogMinIntervalSeconds();
+  }
+
+  private static long getLoggerCacheMaxSizeInBytes() {
+    return 
CommonDescriptor.getInstance().getConfig().getLoggerCacheMaxSizeInBytes();
+  }
+
+  private LoggerPeriodicalLogReducer() {
     // static
   }
 }
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeConfig.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeConfig.java
index 0840bb48e59..16250dc1e8a 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeConfig.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeConfig.java
@@ -636,7 +636,7 @@ public class PipeConfig {
         getPipeAirGapReceiverMaxPayloadSizeInBytes());
     LOGGER.info("PipeReceiverLoadConversionEnabled: {}", 
isPipeReceiverLoadConversionEnabled());
     LOGGER.info(
-        "PipePeriodicalLogMinIntervalSeconds: {}", 
getPipePeriodicalLogMinIntervalSeconds());
+        "LoggerPeriodicalLogMinIntervalSeconds: {}", 
getPipePeriodicalLogMinIntervalSeconds());
     LOGGER.info(
         "PipeRetryLocallyForParallelOrUserConflict: {}",
         isPipeRetryLocallyForParallelOrUserConflict());
@@ -645,7 +645,7 @@ public class PipeConfig {
     LOGGER.info("PipeMetaReportMaxLogIntervalRounds: {}", 
getPipeMetaReportMaxLogIntervalRounds());
     LOGGER.info("PipeTsFilePinMaxLogNumPerRound: {}", 
getPipeTsFilePinMaxLogNumPerRound());
     LOGGER.info("PipeTsFilePinMaxLogIntervalRounds: {}", 
getPipeTsFilePinMaxLogIntervalRounds());
-    LOGGER.info("PipeLoggerCacheMaxSizeInBytes: {}", 
getPipeLoggerCacheMaxSizeInBytes());
+    LOGGER.info("LoggerCacheMaxSizeInBytes: {}", 
getPipeLoggerCacheMaxSizeInBytes());
 
     LOGGER.info("PipeMemoryManagementEnabled: {}", 
getPipeMemoryManagementEnabled());
     LOGGER.info("PipeMemoryAllocateMaxRetries: {}", 
getPipeMemoryAllocateMaxRetries());
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeDescriptor.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeDescriptor.java
index ee035ba3eb1..2cf877db505 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeDescriptor.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeDescriptor.java
@@ -476,16 +476,20 @@ public class PipeDescriptor {
             properties.getProperty(
                 "pipe_receiver_load_conversion_enabled",
                 
String.valueOf(config.isPipeReceiverLoadConversionEnabled()))));
-    config.setPipePeriodicalLogMinIntervalSeconds(
+    config.setLoggerPeriodicalLogMinIntervalSeconds(
         Long.parseLong(
             properties.getProperty(
-                "pipe_periodical_log_min_interval_seconds",
-                
String.valueOf(config.getPipePeriodicalLogMinIntervalSeconds()))));
-    config.setPipeLoggerCacheMaxSizeInBytes(
+                "logger_periodical_log_min_interval_seconds",
+                properties.getProperty(
+                    "pipe_periodical_log_min_interval_seconds",
+                    
String.valueOf(config.getLoggerPeriodicalLogMinIntervalSeconds())))));
+    config.setLoggerCacheMaxSizeInBytes(
         Long.parseLong(
             properties.getProperty(
-                "pipe_logger_cache_max_size_in_bytes",
-                String.valueOf(config.getPipeLoggerCacheMaxSizeInBytes()))));
+                "logger_cache_max_size_in_bytes",
+                properties.getProperty(
+                    "pipe_logger_cache_max_size_in_bytes",
+                    String.valueOf(config.getLoggerCacheMaxSizeInBytes())))));
 
     config.setPipeMemoryAllocateMaxRetries(
         Integer.parseInt(
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/receiver/IoTDBFileReceiver.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/receiver/IoTDBFileReceiver.java
index b1e29c8563d..cb293de1444 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/receiver/IoTDBFileReceiver.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/receiver/IoTDBFileReceiver.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.commons.audit.UserEntity;
 import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import 
org.apache.iotdb.commons.exception.pipe.PipeRuntimeOutOfMemoryCriticalException;
+import org.apache.iotdb.commons.log.LoggerPeriodicalLogReducer;
 import org.apache.iotdb.commons.pipe.config.PipeConfig;
 import org.apache.iotdb.commons.pipe.config.constant.PipeSinkConstant;
 import org.apache.iotdb.commons.pipe.resource.log.PipeLogger;
@@ -179,17 +180,26 @@ public abstract class IoTDBFileReceiver implements 
IoTDBReceiver {
     try {
       receiverFileBaseDir = getReceiverFileBaseDir();
       if (Objects.isNull(receiverFileBaseDir)) {
+        if (LoggerPeriodicalLogReducer.shouldLog(
+            "Receiver id = %s: Failed to init pipe receiver file folder 
manager because all disks of folders are full.")) {
+          PipeLogger.log(
+              LOGGER::warn,
+              "Receiver id = %s: Failed to init pipe receiver file folder 
manager because all disks of folders are full.",
+              receiverId.get());
+        }
+        return new 
TPipeTransferResp(StatusUtils.getStatus(TSStatusCode.DISK_SPACE_INSUFFICIENT));
+      }
+    } catch (Exception e) {
+      if (LoggerPeriodicalLogReducer.shouldLog(
+          "Receiver id = %s: Failed to create pipe receiver file folder 
because all disks of folders are full."
+              + e.getClass().getName()
+              + e.getMessage())) {
         PipeLogger.log(
             LOGGER::warn,
-            "Receiver id = %s: Failed to init pipe receiver file folder 
manager because all disks of folders are full.",
+            e,
+            "Receiver id = %s: Failed to create pipe receiver file folder 
because all disks of folders are full.",
             receiverId.get());
-        return new 
TPipeTransferResp(StatusUtils.getStatus(TSStatusCode.DISK_SPACE_INSUFFICIENT));
       }
-    } catch (Exception e) {
-      LOGGER.warn(
-          "Receiver id = {}: Failed to create pipe receiver file folder 
because all disks of folders are full.",
-          receiverId.get(),
-          e);
       return new 
TPipeTransferResp(StatusUtils.getStatus(TSStatusCode.DISK_SPACE_INSUFFICIENT));
     }
 
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/resource/log/PipeLogger.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/resource/log/PipeLogger.java
index 70b494da032..720999aae97 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/resource/log/PipeLogger.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/resource/log/PipeLogger.java
@@ -19,6 +19,8 @@
 
 package org.apache.iotdb.commons.pipe.resource.log;
 
+import org.apache.iotdb.commons.log.LoggerPeriodicalLogReducer;
+
 import java.io.ByteArrayOutputStream;
 import java.io.PrintStream;
 import java.util.function.Consumer;
@@ -26,11 +28,12 @@ import java.util.function.Consumer;
 public class PipeLogger {
   private static PipePeriodicalLogger logger =
       (loggerFunction, rawMessage, formatter) ->
-          loggerFunction.accept(String.format(rawMessage, formatter));
+          
loggerFunction.accept(LoggerPeriodicalLogReducer.formatMessage(rawMessage, 
formatter));
 
   public static void log(
       final Consumer<String> loggerFunction, final String rawMessage, final 
Object... formatter) {
-    logger.log(loggerFunction, rawMessage, formatter);
+    logger.log(
+        loggerFunction, "%s", 
LoggerPeriodicalLogReducer.formatMessage(rawMessage, formatter));
   }
 
   public static void log(
@@ -40,7 +43,10 @@ public class PipeLogger {
       final Object... formatter) {
     final ByteArrayOutputStream out = new ByteArrayOutputStream();
     throwable.printStackTrace(new PrintStream(out));
-    logger.log(loggerFunction, rawMessage + "\n" + out, formatter);
+    logger.log(
+        loggerFunction,
+        "%s",
+        LoggerPeriodicalLogReducer.formatMessage(rawMessage, formatter) + "\n" 
+ out);
   }
 
   public static void setLogger(final PipePeriodicalLogger logger) {
diff --git 
a/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/pipe/resource/log/PipePeriodicalLogReducerTest.java
 
b/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/log/LoggerPeriodicalLogReducerTest.java
similarity index 67%
rename from 
iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/pipe/resource/log/PipePeriodicalLogReducerTest.java
rename to 
iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/log/LoggerPeriodicalLogReducerTest.java
index d390cbb9fdd..a0a6df14e9c 100644
--- 
a/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/pipe/resource/log/PipePeriodicalLogReducerTest.java
+++ 
b/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/log/LoggerPeriodicalLogReducerTest.java
@@ -17,9 +17,9 @@
  * under the License.
  */
 
-package org.apache.iotdb.commons.pipe.resource.log;
+package org.apache.iotdb.commons.log;
 
-import org.apache.iotdb.commons.pipe.config.PipeConfig;
+import org.apache.iotdb.commons.conf.CommonDescriptor;
 
 import org.junit.After;
 import org.junit.Assert;
@@ -28,20 +28,20 @@ import org.junit.Test;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
-public class PipePeriodicalLogReducerTest {
+public class LoggerPeriodicalLogReducerTest {
 
   @After
   public void tearDown() {
-    PipePeriodicalLogReducer.setMemoryResizeFunction(null);
+    LoggerPeriodicalLogReducer.setMemoryResizeFunction(null);
   }
 
   @Test
   public void testLogReducesDuplicateMessages() {
     final AtomicInteger logCount = new AtomicInteger(0);
-    final String message = "PipePeriodicalLogReducerTest-" + System.nanoTime();
+    final String message = "LoggerPeriodicalLogReducerTest-" + 
System.nanoTime();
 
-    Assert.assertTrue(PipePeriodicalLogReducer.log(log -> 
logCount.incrementAndGet(), message));
-    Assert.assertFalse(PipePeriodicalLogReducer.log(log -> 
logCount.incrementAndGet(), message));
+    Assert.assertTrue(LoggerPeriodicalLogReducer.log(log -> 
logCount.incrementAndGet(), message));
+    Assert.assertFalse(LoggerPeriodicalLogReducer.log(log -> 
logCount.incrementAndGet(), message));
     Assert.assertEquals(1, logCount.get());
   }
 
@@ -50,16 +50,17 @@ public class PipePeriodicalLogReducerTest {
     final AtomicLong requestedSizeInBytes = new AtomicLong(-1);
     final long allocatedSizeInBytes = 1024;
 
-    PipePeriodicalLogReducer.setMemoryResizeFunction(
+    LoggerPeriodicalLogReducer.setMemoryResizeFunction(
         sizeInBytes -> {
           requestedSizeInBytes.set(sizeInBytes);
           return allocatedSizeInBytes;
         });
 
     Assert.assertEquals(
-        PipeConfig.getInstance().getPipeLoggerCacheMaxSizeInBytes(), 
requestedSizeInBytes.get());
+        
CommonDescriptor.getInstance().getConfig().getLoggerCacheMaxSizeInBytes(),
+        requestedSizeInBytes.get());
     Assert.assertEquals(
         allocatedSizeInBytes,
-        
PipePeriodicalLogReducer.LOGGER_CACHE.policy().eviction().get().getMaximum());
+        
LoggerPeriodicalLogReducer.LOGGER_CACHE.policy().eviction().get().getMaximum());
   }
 }


Reply via email to