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/15 06:05:42 UTC

[iotdb] branch master updated: [IOTDB-5223] Check data directories cross-disk under RatisConsensus (#8469)

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

tanxinyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new f6b3810b63 [IOTDB-5223] Check data directories cross-disk under RatisConsensus (#8469)
f6b3810b63 is described below

commit f6b3810b630aa7e95d80c7b1756105ed22ea6e2c
Author: Chen YZ <43...@users.noreply.github.com>
AuthorDate: Thu Dec 15 14:05:36 2022 +0800

    [IOTDB-5223] Check data directories cross-disk under RatisConsensus (#8469)
    
    * done
    
    * enhance loop
---
 .../org/apache/iotdb/db/conf/IoTDBStartCheck.java  |  8 +++++++
 .../db/conf/directories/DirectoryChecker.java      | 27 ++++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java
index 5cda30853c..44c82254ff 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java
@@ -205,10 +205,18 @@ public class IoTDBStartCheck {
    * accessing same director.
    */
   public void checkDirectory() throws ConfigurationException, IOException {
+
     // check data dirs
     for (String dataDir : config.getDataDirs()) {
       DirectoryChecker.getInstance().registerDirectory(new File(dataDir));
     }
+    if (config.isClusterMode()
+        && config.getDataRegionConsensusProtocolClass().equals(ConsensusFactory.RATIS_CONSENSUS)) {
+      if (DirectoryChecker.getInstance().isCrossDisk(config.getDataDirs())) {
+        throw new ConfigurationException(
+            "Configuring the data directories as cross-disk directories is not supported under RatisConsensus(it will be supported in a later version).");
+      }
+    }
     // check system dir
     DirectoryChecker.getInstance().registerDirectory(new File(config.getSystemDir()));
     // check WAL dir
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/directories/DirectoryChecker.java b/server/src/main/java/org/apache/iotdb/db/conf/directories/DirectoryChecker.java
index 9ea5bf34b5..71c021dfa2 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/directories/DirectoryChecker.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/directories/DirectoryChecker.java
@@ -31,6 +31,9 @@ import java.io.RandomAccessFile;
 import java.nio.channels.FileChannel;
 import java.nio.channels.FileLock;
 import java.nio.channels.OverlappingFileLockException;
+import java.nio.file.FileStore;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -84,6 +87,30 @@ public class DirectoryChecker {
     randomAccessFileList.add(randomAccessFile);
   }
 
+  public boolean isCrossDisk(String[] dirs) throws IOException {
+    if (dirs.length < 2) {
+      return false;
+    }
+    Path root = mountOf(new File(dirs[0]).toPath());
+    for (int i = 1; i < dirs.length; i++) {
+      Path path = mountOf(new File(dirs[i]).toPath());
+      if (!path.equals(root)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private Path mountOf(Path p) throws IOException {
+    FileStore fs = Files.getFileStore(p);
+    Path temp = p.toAbsolutePath();
+    Path mountp = temp;
+    while ((temp = temp.getParent()) != null && fs.equals(Files.getFileStore(temp))) {
+      mountp = temp;
+    }
+    return mountp;
+  }
+
   public void deregisterAll() {
     try {
       for (RandomAccessFile randomAccessFile : randomAccessFileList) {