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

rong pushed a commit to branch 133-active-load-read-only
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit fedaa30a08003517f5a62fd1ec7fa1d6b96cc1c3
Author: YC27 <[email protected]>
AuthorDate: Tue Oct 8 12:08:48 2024 +0800

    Active Load: Fix load tsfile failed when system is read only (#13646)
    
    Co-authored-by: Steve Yurong Su <[email protected]>
    (cherry picked from commit 2ec48d28a6c057a209febad829941c3f324e97c2)
---
 .../storageengine/load/active/ActiveLoadDirScanner.java   | 13 +++++++++++++
 .../storageengine/load/active/ActiveLoadTsFileLoader.java | 15 +++++++++++++++
 2 files changed, 28 insertions(+)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadDirScanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadDirScanner.java
index a9d30b8a7f7..f6c079cb060 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadDirScanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadDirScanner.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.db.storageengine.load.active;
 
 import org.apache.iotdb.commons.concurrent.ThreadName;
+import org.apache.iotdb.commons.conf.CommonDescriptor;
 import 
org.apache.iotdb.db.storageengine.load.metrics.ActiveLoadingFilesNumberMetricsSet;
 import 
org.apache.iotdb.db.storageengine.load.metrics.ActiveLoadingFilesSizeMetricsSet;
 
@@ -39,6 +40,7 @@ import java.nio.file.attribute.BasicFileAttributes;
 import java.util.Arrays;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 
 public class ActiveLoadDirScanner extends ActiveLoadScheduledExecutorService {
@@ -53,6 +55,8 @@ public class ActiveLoadDirScanner extends 
ActiveLoadScheduledExecutorService {
 
   private final Set<String> noPermissionDirs = new CopyOnWriteArraySet<>();
 
+  private final AtomicBoolean isReadOnlyLogPrinted = new AtomicBoolean(false);
+
   private final ActiveLoadTsFileLoader activeLoadTsFileLoader;
 
   public ActiveLoadDirScanner(final ActiveLoadTsFileLoader 
activeLoadTsFileLoader) {
@@ -72,6 +76,15 @@ public class ActiveLoadDirScanner extends 
ActiveLoadScheduledExecutorService {
   }
 
   private void scan() throws IOException {
+    if (CommonDescriptor.getInstance().getConfig().isReadOnly()) {
+      if (!isReadOnlyLogPrinted.get()) {
+        LOGGER.warn("Current system is read-only mode. Skip active load dir 
scanning.");
+        isReadOnlyLogPrinted.set(true);
+      }
+      return;
+    }
+    isReadOnlyLogPrinted.set(false);
+
     hotReloadActiveLoadDirs();
 
     for (final String listeningDir : listeningDirs) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadTsFileLoader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadTsFileLoader.java
index e64075ade2a..2f30da15e55 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadTsFileLoader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadTsFileLoader.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.commons.concurrent.IoTThreadFactory;
 import org.apache.iotdb.commons.concurrent.ThreadName;
 import 
org.apache.iotdb.commons.concurrent.threadpool.WrappedThreadPoolExecutor;
+import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.db.auth.AuthorityChecker;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
@@ -77,6 +78,10 @@ public class ActiveLoadTsFileLoader {
   }
 
   public void tryTriggerTsFileLoad(String absolutePath, boolean 
isGeneratedByPipe) {
+    if (CommonDescriptor.getInstance().getConfig().isReadOnly()) {
+      return;
+    }
+
     if (pendingQueue.enqueue(absolutePath, isGeneratedByPipe)) {
       initFailDirIfNecessary();
       adjustExecutorIfNecessary();
@@ -211,6 +216,11 @@ public class ActiveLoadTsFileLoader {
           "Rejecting auto load tsfile {} (isGeneratedByPipe = {}) due to 
memory constraints, will retry later.",
           filePair.getLeft(),
           filePair.getRight());
+    } else if (status.getMessage() != null && 
status.getMessage().contains("read only")) {
+      LOGGER.info(
+          "Rejecting auto load tsfile {} (isGeneratedByPipe = {}) due to the 
system is read only, will retry later.",
+          filePair.getLeft(),
+          filePair.getRight());
     } else {
       LOGGER.warn(
           "Failed to auto load tsfile {} (isGeneratedByPipe = {}), status: {}. 
File will be moved to fail directory.",
@@ -235,6 +245,11 @@ public class ActiveLoadTsFileLoader {
           "Rejecting auto load tsfile {} (isGeneratedByPipe = {}) due to 
memory constraints, will retry later.",
           filePair.getLeft(),
           filePair.getRight());
+    } else if (e.getMessage() != null && e.getMessage().contains("read only")) 
{
+      LOGGER.info(
+          "Rejecting auto load tsfile {} (isGeneratedByPipe = {}) due to the 
system is read only, will retry later.",
+          filePair.getLeft(),
+          filePair.getRight());
     } else {
       LOGGER.warn(
           "Failed to auto load tsfile {} (isGeneratedByPipe = {}) because of 
an unexpected exception. File will be moved to fail directory.",

Reply via email to