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) {