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

haonan 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 c486e3fd1a9 fixed backup bug (#12504)
c486e3fd1a9 is described below

commit c486e3fd1a990c5edafd042df6ca5774ae06aa1f
Author: CloudWise-Lukemiao <[email protected]>
AuthorDate: Sat May 11 11:28:25 2024 +0800

    fixed backup bug (#12504)
    
    Co-authored-by: luke.miao <[email protected]>
---
 .../cli/src/assembly/resources/tools/backup.sh     |   2 +-
 .../org/apache/iotdb/tool/IoTDBDataBackTool.java   | 112 +++++++++++++--------
 2 files changed, 70 insertions(+), 44 deletions(-)

diff --git a/iotdb-client/cli/src/assembly/resources/tools/backup.sh 
b/iotdb-client/cli/src/assembly/resources/tools/backup.sh
index a77a0e3c489..43a6f171371 100644
--- a/iotdb-client/cli/src/assembly/resources/tools/backup.sh
+++ b/iotdb-client/cli/src/assembly/resources/tools/backup.sh
@@ -131,4 +131,4 @@ fi
 
 IOTDB_CLI_CONF=${IOTDB_HOME}/conf
 
iotdb_cli_params="-Dlogback.configurationFile=${IOTDB_CLI_CONF}/logback-backup.xml"
-exec nohup "$JAVA" -DIOTDB_HOME=${IOTDB_HOME} $iotdb_cli_params -cp 
"$CLASSPATH" "$MAIN_CLASS" "$@" 2>&1 > /dev/null  <&- &
+exec nohup "$JAVA" -DIOTDB_HOME=${IOTDB_HOME} $iotdb_cli_params -cp 
"$CLASSPATH" "$MAIN_CLASS" "$@" >/dev/null 2>&1 <&- &
diff --git 
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/IoTDBDataBackTool.java 
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/IoTDBDataBackTool.java
index 7d3315d1f67..823872d6730 100644
--- 
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/IoTDBDataBackTool.java
+++ 
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/IoTDBDataBackTool.java
@@ -60,6 +60,7 @@ public class IoTDBDataBackTool {
   static String targetDirParam = "";
   static String targetDataDirParam = "";
   static String targetWalDirParam = "";
+  static String remoteDnDataDir = "";
 
   static String DATA_NODE_CONF_NAME = IoTDBConfig.CONFIG_NAME;
   static String CONFIG_NODE_CONF_NAME = "iotdb-confignode.properties";
@@ -72,6 +73,7 @@ public class IoTDBDataBackTool {
 
   private static final IoTDBDescriptor ioTDBDescriptor = 
IoTDBDescriptor.getInstance();
   static String sourcePath = System.getProperty(IoTDBConstant.IOTDB_HOME, 
null);
+  static boolean IS_OBJECT_STORAGE = false;
   static String DEFAULT_DN_DATA_DIRS =
       "data"
           + File.separator
@@ -137,6 +139,11 @@ public class IoTDBDataBackTool {
       if (targetDirParam.isEmpty()) {
         LOGGER.error(" -targetdir cannot be empty, The backup folder must be 
specified");
         isVaild = false;
+      } else {
+        if (isRelativePath(targetDirParam)) {
+          LOGGER.error("-targetdir parameter exception, please use absolute 
path");
+          isVaild = false;
+        }
       }
 
       if (!targetDataDirParam.isEmpty()) {
@@ -145,6 +152,10 @@ public class IoTDBDataBackTool {
               "-targetdatadir parameter exception, the number of original 
paths does not match the number of specified paths");
           isVaild = false;
         }
+        if (targetPathVild(targetDataDirParam)) {
+          LOGGER.error("-targetdatadir parameter exception, please use 
absolute path");
+          isVaild = false;
+        }
       }
 
       if (!targetWalDirParam.isEmpty()) {
@@ -153,6 +164,10 @@ public class IoTDBDataBackTool {
               "-targetwaldir parameter exception, the number of original paths 
does not match the number of specified paths");
           isVaild = false;
         }
+        if (targetPathVild(targetWalDirParam)) {
+          LOGGER.error("-targetwaldir parameter exception, please use absolute 
path");
+          isVaild = false;
+        }
       }
     }
     return isVaild;
@@ -490,7 +505,9 @@ public class IoTDBDataBackTool {
 
     String dnWalDirs = dataProperties.getProperty("dn_wal_dirs");
     String dnDataDirs = dataProperties.getProperty("dn_data_dirs");
-
+    String dnDataDirAll = dnDataDirs;
+    dnDataDirs = isObjectStorage(dnDataDirs);
+    remoteDnDataDir = dnDataDirAll.replaceAll(dnDataDirs, "");
     dnSystemDir = pathHandler(dnSystemDir);
     dnConsensusDir = pathHandler(dnConsensusDir);
     dnTracingDir = pathHandler(dnTracingDir);
@@ -500,9 +517,8 @@ public class IoTDBDataBackTool {
     String bakDnConsensusDir = targetDirString + File.separatorChar + 
DEFAULT_DN_CONSENSUS_DIR;
     String bakDnTracingDir = targetDirString + File.separatorChar + 
DEFAULT_DN_TRACING_DIR;
     String bakDnWalDirs = targetDirString + File.separatorChar + 
DEFAULT_DN_WAL_DIRS;
-
     if (type.equals("quick")) {
-      targetDataDirParam = 
sourceDnDataDirsCoverTargetDnDataDirsHandler(dnDataDirs);
+      targetDirParam = targetDirString;
       targetWalDirParam = sourceWalCoverTargetWalDirsHandler(dnWalDirs, 
bakDnWalDirs);
     }
     if (targetWalDirParam.isEmpty()) {
@@ -510,7 +526,7 @@ public class IoTDBDataBackTool {
     } else {
       targetWalDirParam = getCreateDnDataPathString(dnWalDirs, 
targetWalDirParam, "wal");
     }
-    String targetDnDataDirs = "";
+    String targetDnDataDirs;
     if (targetDataDirParam.isEmpty()) {
       targetDataDirParam =
           targetDirParam
@@ -520,16 +536,11 @@ public class IoTDBDataBackTool {
               + "datanode"
               + File.separatorChar
               + "data";
-      targetDnDataDirs = getCreateDnDataPathString(dnDataDirs, 
targetDataDirParam, "data");
-      // targetDnDataDirs = 
sourceDnDataDirsCoverTargetDnDataDirsHandler(dnDataDirs);
-    } else {
-      targetDnDataDirs = getCreateDnDataPathString(dnDataDirs, 
targetDataDirParam, "data");
     }
-    // dnDataDirs = pathHandler(targetDataDirParam);
-    if (!vaildParam(targetDataDirParam, targetWalDirParam)) {
+    if (!vaildParam(dnDataDirs, dnWalDirs)) {
       System.exit(0);
     }
-
+    targetDnDataDirs = getCreateDnDataPathString(dnDataDirs, 
targetDataDirParam, "data");
     Map<String, String> dnSystemDirMap =
         getCreatePathMapping(Objects.requireNonNull(dnSystemDir), 
bakDnSystemDir, "system");
     dnDataDirsMap.putAll(getCreatePathMapping(dnDataDirs, targetDnDataDirs, 
"data"));
@@ -545,12 +556,41 @@ public class IoTDBDataBackTool {
     copyMap.putAll(dnTracingDirMap);
 
     dnMapProperties.put("dn_system_dir", bakDnSystemDir);
-    dnMapProperties.put("dn_data_dirs", targetDnDataDirs);
+    dnMapProperties.put("dn_data_dirs", targetDnDataDirs + remoteDnDataDir);
     dnMapProperties.put("dn_wal_dirs", targetWalDirParam);
     dnMapProperties.put("dn_tracing_dir", bakDnTracingDir);
     dnMapProperties.put("dn_consensus_dir", bakDnConsensusDir);
   }
 
+  private static String isObjectStorage(String dnDataDirs) {
+    StringBuilder tmpDnDataDirs = new StringBuilder();
+    String[] patternDirs = dnDataDirs.split(";");
+    for (int i = 0; i < patternDirs.length; i++) {
+      String patternDir = patternDirs[i];
+      String[] subPatternDirs = patternDir.split(",");
+      for (int c = 0; c < subPatternDirs.length; c++) {
+        if (c == subPatternDirs.length - 1 && i == patternDirs.length - 1) {
+          if (subPatternDirs[c].equals("OBJECT_STORAGE")) {
+            IS_OBJECT_STORAGE = true;
+          } else {
+            tmpDnDataDirs.append(subPatternDirs[c]);
+          }
+        } else {
+          tmpDnDataDirs.append(subPatternDirs[c]);
+          if (subPatternDirs.length > 1 && c < subPatternDirs.length - 1) {
+            tmpDnDataDirs.append(",");
+          } else if (patternDirs.length > 1 && i < patternDirs.length - 1) {
+            tmpDnDataDirs.append(";");
+          }
+        }
+      }
+    }
+    if (IS_OBJECT_STORAGE) {
+      return tmpDnDataDirs.toString().substring(0, 
tmpDnDataDirs.toString().length() - 1);
+    }
+    return tmpDnDataDirs.toString();
+  }
+
   private static void countConfigNodeFile(
       String targetDirString, Map<String, String> copyMap, Map<String, String> 
cnMapProperties) {
     Properties configProperties = getProperties(CONFIG_NODE_CONF_NAME);
@@ -559,9 +599,6 @@ public class IoTDBDataBackTool {
     String bakCnSystemDir = targetDirString + File.separatorChar + 
DEFAULT_CN_SYSTEM_DIR;
     String bakCnConsensusDir = targetDirString + File.separatorChar + 
DEFAULT_CN_CONSENSUS_DIR;
 
-    if (!vaildParam(targetDataDirParam, targetWalDirParam)) {
-      System.exit(0);
-    }
     String cnSystemDir = configProperties.getProperty("cn_system_dir");
     String cnConsensusDir = configProperties.getProperty("cn_consensus_dir");
     cnSystemDir = pathHandler(cnSystemDir);
@@ -614,31 +651,6 @@ public class IoTDBDataBackTool {
     return !p.isAbsolute();
   }
 
-  public static String sourceDnDataDirsCoverTargetDnDataDirsHandler(String 
dnDirs) {
-    String[] sourcePathsList = dnDirs.split(";");
-    StringBuilder targetDataDirSb = new StringBuilder();
-    for (int t = 0; t < sourcePathsList.length; t++) {
-      String sourcePaths = sourcePathsList[t];
-      String[] sourcePathList = sourcePaths.split(",");
-      StringBuilder subTargetDataDir = new StringBuilder();
-      for (int i = 0; i < sourcePathList.length; i++) {
-        String path = sourcePathList[i];
-        path = path + "_backup";
-        if (i == sourcePathList.length - 1) {
-          subTargetDataDir.append(path);
-        } else {
-          subTargetDataDir.append(path).append(",");
-        }
-      }
-      if (t == sourcePathsList.length - 1) {
-        targetDataDirSb.append(subTargetDataDir);
-      } else {
-        targetDataDirSb.append(subTargetDataDir).append(";");
-      }
-    }
-    return targetDataDirSb.toString();
-  }
-
   public static String sourceWalCoverTargetWalDirsHandler(String dnDirs, 
String targetDirs) {
     String[] sourcePathList = dnDirs.split(",");
     StringBuilder subTargetDataDir = new StringBuilder();
@@ -710,7 +722,7 @@ public class IoTDBDataBackTool {
         if (sourcePathArray.length != targetPathArray.length) {
           if (targetPathArray.length == 1) {
             for (int j = 0; j < sourcePathArray.length; j++) {
-              String newPath = "";
+              String newPath;
               if (sourcePathsList.length == 1
                   && targetPathsList.length == 1
                   && sourcePathArray.length == 1) {
@@ -780,7 +792,7 @@ public class IoTDBDataBackTool {
         if (sourcePathArray.length != targetPathArray.length) {
           if (targetPathArray.length == 1) {
             for (int j = 0; j < sourcePathArray.length; j++) {
-              String newPath = "";
+              String newPath;
               if (sourcePathsList.length == 1
                   && targetPathsList.length == 1
                   && sourcePathArray.length == 1) {
@@ -831,10 +843,24 @@ public class IoTDBDataBackTool {
     return matchDirectory(input, pattern);
   }
 
+  public static boolean targetPathVild(String pattern) {
+    String[] patternDirs = pattern.split(";");
+    for (int i = 0; i < patternDirs.length; i++) {
+      String patternDir = patternDirs[i];
+      String[] subPatternDirs = patternDir.split(",");
+      for (String subPatternDir : subPatternDirs) {
+        if (isRelativePath(subPatternDir)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
   private static boolean matchDirectory(String inputDir, String patternDir) {
     String[] inputLevels = inputDir.split(",");
     String[] patternLevels = patternDir.split(",");
-    return inputLevels.length == patternLevels.length || inputLevels.length == 
1;
+    return inputLevels.length == patternLevels.length || patternLevels.length 
== 1;
   }
 
   private static void initDataNodeProperties(Properties properties) {

Reply via email to