Active Load: Fix load tsfile failed when system is read only (#13646)
Co-authored-by: Steve Yurong Su <rong@apache.org>
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 a9d30b8..f6c079c 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.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 @@
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 @@
}
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 e64075a..2f30da1 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.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 void tryTriggerTsFileLoad(String absolutePath, boolean isGeneratedByPipe) {
+ if (CommonDescriptor.getInstance().getConfig().isReadOnly()) {
+ return;
+ }
+
if (pendingQueue.enqueue(absolutePath, isGeneratedByPipe)) {
initFailDirIfNecessary();
adjustExecutorIfNecessary();
@@ -211,6 +216,11 @@
"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 @@
"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.",