From ba3f08e2fea87b75e62d5056d5459d38bf1f516a Mon Sep 17 00:00:00 2001 From: YC27 <76414902+YC27@users.noreply.github.com> Date: Fri, 13 Sep 2024 10:12:20 +0800 Subject: [PATCH] Active Load: Check dir r/w permissions before loading from listening dirs (#13488) (#13500) Co-authored-by: Steve Yurong Su --- .../load/active/ActiveLoadDirScanner.java | 43 +++++++++++++++++++ 1 file changed, 43 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 ca8760b3e3db..a9d30b8a7f77 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 @@ -51,6 +51,8 @@ public class ActiveLoadDirScanner extends ActiveLoadScheduledExecutorService { private final AtomicReference listeningDirsConfig = new AtomicReference<>(); private final Set listeningDirs = new CopyOnWriteArraySet<>(); + private final Set noPermissionDirs = new CopyOnWriteArraySet<>(); + private final ActiveLoadTsFileLoader activeLoadTsFileLoader; public ActiveLoadDirScanner(final ActiveLoadTsFileLoader activeLoadTsFileLoader) { @@ -73,6 +75,10 @@ private void scan() throws IOException { hotReloadActiveLoadDirs(); for (final String listeningDir : listeningDirs) { + if (!checkPermission(listeningDir)) { + continue; + } + final int currentAllowedPendingSize = activeLoadTsFileLoader.getCurrentAllowedPendingSize(); if (currentAllowedPendingSize <= 0) { return; @@ -93,6 +99,43 @@ private void scan() throws IOException { } } + private boolean checkPermission(final String listeningDir) { + try { + final Path listeningDirPath = new File(listeningDir).toPath(); + + if (!Files.isReadable(listeningDirPath)) { + if (!noPermissionDirs.contains(listeningDir)) { + LOGGER.error( + "Current dir path is not readable: {}." + + "Skip scanning this dir. Please check the permission.", + listeningDirPath); + noPermissionDirs.add(listeningDir); + } + return false; + } + + if (!Files.isWritable(listeningDirPath)) { + if (!noPermissionDirs.contains(listeningDir)) { + LOGGER.error( + "Current dir path is not writable: {}." + + "Skip scanning this dir. Please check the permission.", + listeningDirPath); + noPermissionDirs.add(listeningDir); + } + return false; + } + + noPermissionDirs.remove(listeningDir); + return true; + } catch (final Exception e) { + LOGGER.error( + "Error occurred during checking r/w permission of dir: {}. Skip scanning this dir.", + listeningDir, + e); + return false; + } + } + private boolean isTsFileCompleted(final String file) { try (final TsFileSequenceReader reader = new TsFileSequenceReader(file, false)) { return TSFileConfig.MAGIC_STRING.equals(reader.readTailMagic());