This is an automated email from the ASF dual-hosted git repository.
zyk pushed a commit to branch rel/1.1
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/rel/1.1 by this push:
new c144e84589 [To rel/1.1][IOTDB-5820] Exception when use PIPE if sender
has more than one data dir on different disks (#9699)
c144e84589 is described below
commit c144e84589b91d5f7fa4298d657ce43159b15fdb
Author: Chen YZ <[email protected]>
AuthorDate: Tue Apr 25 21:57:06 2023 +0800
[To rel/1.1][IOTDB-5820] Exception when use PIPE if sender has more than
one data dir on different disks (#9699)
---
.../iotdb/commons/sync/utils/SyncPathUtil.java | 4 ++
.../db/sync/sender/recovery/TsFilePipeLogger.java | 54 ++++++++++++++++++----
2 files changed, 50 insertions(+), 8 deletions(-)
diff --git
a/node-commons/src/main/java/org/apache/iotdb/commons/sync/utils/SyncPathUtil.java
b/node-commons/src/main/java/org/apache/iotdb/commons/sync/utils/SyncPathUtil.java
index 157110d498..3e29d3a4f2 100644
---
a/node-commons/src/main/java/org/apache/iotdb/commons/sync/utils/SyncPathUtil.java
+++
b/node-commons/src/main/java/org/apache/iotdb/commons/sync/utils/SyncPathUtil.java
@@ -88,6 +88,10 @@ public class SyncPathUtil {
return getSenderPipeDir(pipeName, createTime) + File.separator +
SyncConstant.PIPE_LOG_DIR_NAME;
}
+ public static String getSenderFileDataDir(String dataDir, String pipeName,
long createTime) {
+ return dataDir + File.separator + getSenderPipeDirName(pipeName,
createTime);
+ }
+
public static String getSenderFileDataDir(String pipeName, long createTime) {
return getSenderPipeDir(pipeName, createTime)
+ File.separator
diff --git
a/server/src/main/java/org/apache/iotdb/db/sync/sender/recovery/TsFilePipeLogger.java
b/server/src/main/java/org/apache/iotdb/db/sync/sender/recovery/TsFilePipeLogger.java
index f1c46fe38f..d77a6db5ce 100644
---
a/server/src/main/java/org/apache/iotdb/db/sync/sender/recovery/TsFilePipeLogger.java
+++
b/server/src/main/java/org/apache/iotdb/db/sync/sender/recovery/TsFilePipeLogger.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.commons.conf.IoTDBConstant;
import org.apache.iotdb.commons.sync.utils.SyncConstant;
import org.apache.iotdb.commons.sync.utils.SyncPathUtil;
import org.apache.iotdb.commons.utils.FileUtils;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.engine.modification.ModificationFile;
import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
import org.apache.iotdb.db.sync.sender.pipe.TsFilePipe;
@@ -34,6 +35,7 @@ import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
+import java.nio.file.FileSystemException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -44,7 +46,13 @@ public class TsFilePipeLogger {
private final String pipeDir;
private final String tsFileDir;
+ private final String pipeName;
+
+ private final long createTime;
+
public TsFilePipeLogger(TsFilePipe tsFilePipe) {
+ this.pipeName = tsFilePipe.getName();
+ this.createTime = tsFilePipe.getCreateTime();
pipeDir = SyncPathUtil.getSenderPipeDir(tsFilePipe.getName(),
tsFilePipe.getCreateTime());
tsFileDir = SyncPathUtil.getSenderFileDataDir(tsFilePipe.getName(),
tsFilePipe.getCreateTime());
}
@@ -108,15 +116,38 @@ public class TsFilePipeLogger {
}
private File createHardLink(File file) throws IOException {
- File link = new File(tsFileDir, getRelativeFilePath(file));
- if (!link.getParentFile().exists()) {
- link.getParentFile().mkdirs();
- }
+ try {
+ File link = new File(tsFileDir, getRelativeFilePath(file));
+ if (!link.getParentFile().exists()) {
+ link.getParentFile().mkdirs();
+ }
- Path sourcePath = FileSystems.getDefault().getPath(file.getAbsolutePath());
- Path linkPath = FileSystems.getDefault().getPath(link.getAbsolutePath());
- Files.createLink(linkPath, sourcePath);
- return link;
+ Path sourcePath =
FileSystems.getDefault().getPath(file.getAbsolutePath());
+ Path linkPath = FileSystems.getDefault().getPath(link.getAbsolutePath());
+ Files.createLink(linkPath, sourcePath);
+ return link;
+ } catch (FileSystemException e) {
+ // Invalid cross-device link
+ // dataDir/sequence/root.xx/x/xx/tsfile
+ File dataDir =
+
file.getParentFile().getParentFile().getParentFile().getParentFile().getParentFile();
+ for (String dir :
IoTDBDescriptor.getInstance().getConfig().getDataDirs()) {
+ if (dataDir.getCanonicalPath().equals(new
File(dir).getCanonicalPath())) {
+ File link =
+ new File(
+ SyncPathUtil.getSenderFileDataDir(dir, pipeName, createTime),
+ getRelativeFilePath(file));
+ if (!link.getParentFile().exists()) {
+ link.getParentFile().mkdirs();
+ }
+ Path sourcePath =
FileSystems.getDefault().getPath(file.getAbsolutePath());
+ Path linkPath =
FileSystems.getDefault().getPath(link.getAbsolutePath());
+ Files.createLink(linkPath, sourcePath);
+ return link;
+ }
+ }
+ throw e;
+ }
}
private String getRelativeFilePath(File file) {
@@ -151,5 +182,12 @@ public class TsFilePipeLogger {
if (pipeDir.exists()) {
FileUtils.deleteDirectory(pipeDir);
}
+ for (String dataDir :
IoTDBDescriptor.getInstance().getConfig().getDataDirs()) {
+ File crossDiskSyncDir =
+ new File(SyncPathUtil.getSenderFileDataDir(dataDir, pipeName,
createTime));
+ if (crossDiskSyncDir.exists()) {
+ FileUtils.deleteDirectory(crossDiskSyncDir);
+ }
+ }
}
}