From 1237fefa134a11ed426e100faa0d4b9ac61690bc Mon Sep 17 00:00:00 2001 From: Cpaulyz Date: Mon, 27 Mar 2023 11:32:12 +0800 Subject: [PATCH 1/2] done --- .../db/metadata/mtree/store/disk/schemafile/SchemaFile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/SchemaFile.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/SchemaFile.java index 5d8445e36700e..afdfc5c1a117a 100644 --- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/SchemaFile.java +++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/SchemaFile.java @@ -468,7 +468,7 @@ public static ISchemaFile loadSnapshot(File snapshotDir, String sgName, int sche getDirPath(sgName, schemaRegionId), MetadataConstant.SCHEMA_LOG_FILE_NAME); Files.deleteIfExists(schemaFile.toPath()); Files.deleteIfExists(schemaLogFile.toPath()); - Files.createLink(schemaFile.toPath(), snapshot.toPath()); + Files.copy(snapshot.toPath(), schemaFile.toPath()); return new SchemaFile( sgName, schemaRegionId, From 7925465d38c28207a9c9f7574963ad74ba624802 Mon Sep 17 00:00:00 2001 From: Cpaulyz Date: Tue, 25 Apr 2023 17:27:42 +0800 Subject: [PATCH 2/2] done --- .../commons/sync/utils/SyncPathUtil.java | 4 ++ .../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 157110d498c3d..3e29d3a4f266f 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 static String getSenderRealTimePipeLogDir(String pipeName, long createTim 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 f1c46fe38f592..d77a6db5ce7e1 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.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.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 void createTsFileResourceHardlink(File tsFile) throws IOException { } 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 void clear() throws IOException { 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); + } + } } }