You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2020/04/22 15:01:23 UTC

[incubator-iotdb] branch master updated: Upgrade mlog (#1081)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new e92f24e  Upgrade mlog (#1081)
e92f24e is described below

commit e92f24e6231b88a0541c58ef9829554112b56df3
Author: Haonan <hh...@outlook.com>
AuthorDate: Wed Apr 22 23:01:13 2020 +0800

    Upgrade mlog (#1081)
---
 .../org/apache/iotdb/db/conf/IoTDBConfigCheck.java | 17 +++++++
 .../org/apache/iotdb/db/metadata/MLogWriter.java   | 52 +++++++++++++++++++++-
 2 files changed, 67 insertions(+), 2 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfigCheck.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfigCheck.java
index ec14db3..a5b30d5 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfigCheck.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfigCheck.java
@@ -19,6 +19,8 @@
 package org.apache.iotdb.db.conf;
 
 import org.apache.iotdb.db.engine.fileSystem.SystemFileFactory;
+import org.apache.iotdb.db.metadata.MLogWriter;
+import org.apache.iotdb.db.metadata.MetadataConstant;
 import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -39,6 +41,7 @@ public class IoTDBConfigCheck {
   private static String timestampPrecision = "ms";
   private static long partitionInterval = 86400;
   private static String tsfileFileSystem = "LOCAL";
+  private static String iotdbVersion = "0.10.0";
   private Properties properties = new Properties();
 
   public static final IoTDBConfigCheck getInstance() {
@@ -93,6 +96,7 @@ public class IoTDBConfigCheck {
           properties.setProperty("timestamp_precision", timestampPrecision);
           properties.setProperty("storage_group_time_range", String.valueOf(partitionInterval));
           properties.setProperty("tsfile_storage_fs", tsfileFileSystem);
+          properties.setProperty("iotdb_version", iotdbVersion);
           properties.store(outputStream, "System properties:");
         }
       }
@@ -120,6 +124,19 @@ public class IoTDBConfigCheck {
             .getProperty("tsfile_storage_fs") + " !");
         System.exit(-1);
       }
+      if (properties.getProperty("iotdb_version") == null) {
+        logger.info("Lower iotdb version detected, upgrading old mlog file... ");
+        MLogWriter.upgradeMLog(IoTDBDescriptor.getInstance().getConfig().getSchemaDir(), 
+            MetadataConstant.METADATA_LOG);
+        logger.info("Old mlog file is upgraded.");
+        try (FileOutputStream outputStream = new FileOutputStream(file.toString())) {
+          properties.setProperty("timestamp_precision", timestampPrecision);
+          properties.setProperty("storage_group_time_range", String.valueOf(partitionInterval));
+          properties.setProperty("tsfile_storage_fs", tsfileFileSystem);
+          properties.setProperty("iotdb_version", iotdbVersion);
+          properties.store(outputStream, "System properties:");
+        }
+      }
     } catch (IOException e) {
       logger.error("Load system.properties from {} failed.", file.getAbsolutePath(), e);
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MLogWriter.java b/server/src/main/java/org/apache/iotdb/db/metadata/MLogWriter.java
index 4067a3d..2e957a8 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MLogWriter.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MLogWriter.java
@@ -20,11 +20,14 @@ package org.apache.iotdb.db.metadata;
 
 import org.apache.iotdb.db.engine.fileSystem.SystemFileFactory;
 import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
+import org.apache.iotdb.tsfile.fileSystem.FSFactoryProducer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
+import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.util.Map;
@@ -84,8 +87,6 @@ public class MLogWriter {
       writer.write(String.valueOf(offset));
     }
 
-    writer.write(",");
-
     writer.newLine();
     writer.flush();
   }
@@ -113,4 +114,51 @@ public class MLogWriter {
     writer.newLine();
     writer.flush();
   }
+
+  public static void upgradeMLog(String schemaDir, String logFileName) throws IOException {
+    File logFile = FSFactoryProducer.getFSFactory()
+        .getFile(schemaDir + File.separator + logFileName);
+    File tmpLogFile = new File(logFile.getAbsolutePath() + ".tmp");
+
+    // if both old mlog and mlog.tmp do not exist, nothing to do
+    if (!logFile.exists() && !tmpLogFile.exists()) {
+      return;
+    } else if (!logFile.exists() && tmpLogFile.exists()) {
+      // if old mlog doesn't exsit but mlog.tmp exists, rename tmp file to mlog  
+      FSFactoryProducer.getFSFactory().moveFile(tmpLogFile, logFile);
+      return;
+    }
+
+    // if both old mlog and mlog.tmp exist, delete mlog tmp, then do upgrading
+    if (tmpLogFile.exists()) {
+      if (!tmpLogFile.delete()) {
+        throw new IOException("Deleting " + tmpLogFile + "failed.");
+      }
+    }
+    // upgrading
+    try (BufferedReader reader = new BufferedReader(new FileReader(logFile));
+        BufferedWriter writer = new BufferedWriter(new FileWriter(tmpLogFile, true));) {
+      String line;
+      while ((line = reader.readLine()) != null) {
+        StringBuilder buf = new StringBuilder();
+        buf.append(line);
+        if (line.startsWith(MetadataOperationType.CREATE_TIMESERIES)) {
+          buf.append(",,,");
+        }
+        writer.write(buf.toString());
+        writer.newLine();
+        writer.flush();
+        
+      }
+    }
+
+    // upgrade finished, delete old mlog file
+    if (!logFile.delete()) {
+      throw new IOException("Deleting " + logFile + "failed.");
+    }
+    
+    // rename tmpLogFile to mlog
+    FSFactoryProducer.getFSFactory().moveFile(tmpLogFile, logFile);
+  }
+  
 }