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 59a7ec1  optimize upgrade tool (#1234)
59a7ec1 is described below

commit 59a7ec16b551b59123fd362c3e89eab7fef1ee8b
Author: Haonan <[email protected]>
AuthorDate: Sat May 23 14:37:30 2020 +0800

    optimize upgrade tool (#1234)
    
    * Fix inserting unsequence data after upgrading
---
 docs/UserGuide/0-Get Started/1-QuickStart.md       |  2 +-
 .../5-Operation Manual/4-SQL Reference.md          |  2 +-
 .../5-Operation Manual/4-SQL Reference.md          |  2 +-
 .../org/apache/iotdb/db/conf/IoTDBConfigCheck.java | 44 +++++++++++++++++++++-
 .../engine/storagegroup/StorageGroupProcessor.java | 18 +++++++++
 .../db/tools/upgrade/TsFileOnlineUpgradeTool.java  |  6 +--
 6 files changed, 67 insertions(+), 7 deletions(-)

diff --git a/docs/UserGuide/0-Get Started/1-QuickStart.md 
b/docs/UserGuide/0-Get Started/1-QuickStart.md
index c7603ad..94e168d 100755
--- a/docs/UserGuide/0-Get Started/1-QuickStart.md      
+++ b/docs/UserGuide/0-Get Started/1-QuickStart.md      
@@ -258,4 +258,4 @@ Under the root path of incubator-iotdb:
 > mvn clean package -pl cli -am -DskipTests
 ```
 
-After build, the IoTDB client will be at the folder 
"client/target/iotdb-client-{project.version}".
\ No newline at end of file
+After build, the IoTDB cli will be at the folder 
"cli/target/iotdb-cli-{project.version}".
\ No newline at end of file
diff --git a/docs/UserGuide/5-Operation Manual/4-SQL Reference.md 
b/docs/UserGuide/5-Operation Manual/4-SQL Reference.md
index 3fb209f..0483a19 100644
--- a/docs/UserGuide/5-Operation Manual/4-SQL Reference.md      
+++ b/docs/UserGuide/5-Operation Manual/4-SQL Reference.md      
@@ -797,7 +797,7 @@ Eg. SELECT FIRST_VALUE (status), FIRST_VALUE (temperature) 
FROM root.ln.wf01.wt0
 Note: the statement needs to satisfy this constraint: <PrefixPath> + <Path> = 
<Timeseries>
 ```
 
-* LAST_VALUE(Rename from `LAST` at `V0.10.0`)
+* LAST_VALUE
 
 The LAST_VALUE function returns the last point value of the choosen 
timeseries(one or more).
 
diff --git a/docs/zh/UserGuide/5-Operation Manual/4-SQL Reference.md 
b/docs/zh/UserGuide/5-Operation Manual/4-SQL Reference.md
index 7e404ed..818ae2c 100644
--- a/docs/zh/UserGuide/5-Operation Manual/4-SQL Reference.md   
+++ b/docs/zh/UserGuide/5-Operation Manual/4-SQL Reference.md   
@@ -783,7 +783,7 @@ Note: the statement needs to satisfy this constraint: 
<PrefixPath> + <Path> = <T
 ```
 
 * LAST_VALUE
-原有的 `LAST` 方法在 `v0.10.0` 版本更名为 `LAST_VALUE`。
+
 ```
 SELECT LAST_VALUE (Path) (COMMA LAST_VALUE (Path))* FROM <FromClause> [WHERE 
<WhereClause>]?
 Eg. SELECT LAST_VALUE (status), LAST_VALUE (temperature) FROM 
root.ln.wf01.wt01 WHERE root.ln.wf01.wt01.temperature < 24
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 7e45ce6..eacca25 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,15 +19,20 @@
 package org.apache.iotdb.db.conf;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.iotdb.db.conf.directories.DirectoryManager;
 import org.apache.iotdb.db.engine.fileSystem.SystemFileFactory;
+import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.metadata.MLogWriter;
 import org.apache.iotdb.db.metadata.MetadataConstant;
 import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
+import org.apache.iotdb.tsfile.common.constant.TsFileConstant;
+import org.apache.iotdb.tsfile.fileSystem.FSFactoryProducer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.*;
 import java.nio.file.Files;
+import java.util.List;
 import java.util.Properties;
 
 public class IoTDBConfigCheck {
@@ -37,6 +42,8 @@ public class IoTDBConfigCheck {
   public static final String PROPERTIES_FILE_NAME = "system.properties";
   public static final String SCHEMA_DIR =
           IoTDBDescriptor.getInstance().getConfig().getSchemaDir();
+  public static final String WAL_DIR =
+      IoTDBDescriptor.getInstance().getConfig().getWalFolder();
   private static final Logger logger = 
LoggerFactory.getLogger(IoTDBDescriptor.class);
   // this is a initial parameter.
   private static String timestampPrecision = "ms";
@@ -70,10 +77,10 @@ public class IoTDBConfigCheck {
     }
 
     tsfileFileSystem = 
IoTDBDescriptor.getInstance().getConfig().getTsFileStorageFs().toString();
-
     createDir(SCHEMA_DIR);
     checkFile(SCHEMA_DIR);
     logger.info("System configuration is ok.");
+    
   }
 
   private void createDir(String filepath) {
@@ -121,6 +128,7 @@ public class IoTDBConfigCheck {
       properties.load(new InputStreamReader(inputStream, 
TSFileConfig.STRING_CHARSET));
       // need to upgrade
       if (!properties.containsKey("iotdb_version")) {
+        checkUnClosedTsFileV1();
         upgradeMlog();
       } else {
         checkProperties();
@@ -193,6 +201,40 @@ public class IoTDBConfigCheck {
     }
   }
 
+  private void checkUnClosedTsFileV1() {
+    if (SystemFileFactory.INSTANCE.getFile(WAL_DIR).isDirectory() 
+        && SystemFileFactory.INSTANCE.getFile(WAL_DIR).list().length != 0) {
+      logger.error("Unclosed Version-1 TsFile detected, please run 'flush' on 
V0.9 IoTDB"
+          + " before upgrading to V0.10");
+      System.exit(-1);
+    }
+    
checkUnClosedTsFileV1Helper(DirectoryManager.getInstance().getAllSequenceFileFolders());
+    
checkUnClosedTsFileV1Helper(DirectoryManager.getInstance().getAllUnSequenceFileFolders());
+  }
+
+  private void checkUnClosedTsFileV1Helper(List<String> folders) {
+    for (String baseDir : folders) {
+      File fileFolder = FSFactoryProducer.getFSFactory().getFile(baseDir);
+      if (!fileFolder.isDirectory()) {
+        continue;
+      }
+      for (File storageGroup : fileFolder.listFiles()) {
+        if (!storageGroup.isDirectory()) {
+          continue;
+        }
+        File[] tsfiles = FSFactoryProducer.getFSFactory()
+            .listFilesBySuffix(storageGroup.toString(), 
TsFileConstant.TSFILE_SUFFIX);
+        File[] resources = FSFactoryProducer.getFSFactory()
+            .listFilesBySuffix(storageGroup.toString(), 
TsFileResource.RESOURCE_SUFFIX);
+        if (tsfiles.length != resources.length) {
+          logger.error("Unclosed Version-1 TsFile detected, please run 'flush' 
on V0.9 IoTDB"
+              + " before upgrading to V0.10");
+          System.exit(-1);
+        }
+      }
+    }
+  }
+
   private static class IoTDBConfigCheckHolder {
 
     private static final IoTDBConfigCheck INSTANCE = new IoTDBConfigCheck();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
index b250a60..58a7810 100755
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
@@ -1509,6 +1509,24 @@ public class StorageGroupProcessor {
     }
     mergeLock.writeLock().unlock();
     insertLock.writeLock().unlock();
+    
+    // after upgrade complete, update partitionLatestFlushedTimeForEachDevice
+    if (countUpgradeFiles() == 0) {
+      for (Entry<Long, Map<String, Long>> entry : 
newlyFlushedPartitionLatestFlushedTimeForEachDevice
+          .entrySet()) {
+        long timePartitionId = entry.getKey();
+        Map<String, Long> latestFlushTimeForPartition = 
partitionLatestFlushedTimeForEachDevice
+            .getOrDefault(timePartitionId, new HashMap<>());
+        for (Entry<String, Long> endTimeMap : entry.getValue().entrySet()) {
+          String device = endTimeMap.getKey();
+          long endTime = endTimeMap.getValue();
+          if (latestFlushTimeForPartition.getOrDefault(device, Long.MIN_VALUE) 
< endTime) {
+            partitionLatestFlushedTimeForEachDevice
+                .computeIfAbsent(timePartitionId, id -> new 
HashMap<>()).put(device, endTime);
+          }
+        }
+      }
+    }
   }
 
   public void merge(boolean fullMerge) {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/tools/upgrade/TsFileOnlineUpgradeTool.java
 
b/server/src/main/java/org/apache/iotdb/db/tools/upgrade/TsFileOnlineUpgradeTool.java
index 3b61a32..9fc72d2 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/tools/upgrade/TsFileOnlineUpgradeTool.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/tools/upgrade/TsFileOnlineUpgradeTool.java
@@ -41,7 +41,6 @@ import org.apache.iotdb.tsfile.file.MetaMarker;
 import org.apache.iotdb.tsfile.file.footer.ChunkGroupFooter;
 import org.apache.iotdb.tsfile.file.header.ChunkHeader;
 import org.apache.iotdb.tsfile.file.header.PageHeader;
-import org.apache.iotdb.tsfile.file.metadata.ChunkGroupMetadata;
 import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -339,7 +338,7 @@ public class TsFileOnlineUpgradeTool implements 
AutoCloseable {
     long startOffsetOfChunkGroup = 0;
     boolean newChunkGroup = true;
     long versionOfChunkGroup = 0;
-    List<ChunkGroupMetadata> newMetaData = new ArrayList<>();
+    int chunkGroupCount = 0;
     List<List<PageHeader>> pageHeadersInChunkGroup = new ArrayList<>();
     List<List<ByteBuffer>> pageDataInChunkGroup = new ArrayList<>();
     List<List<Boolean>> pagePartitionInfoInChunkGroup = new ArrayList<>();
@@ -389,6 +388,7 @@ public class TsFileOnlineUpgradeTool implements 
AutoCloseable {
             measurementSchemaList.clear();
             pagePartitionInfoInChunkGroup.clear();
             newChunkGroup = true;
+            chunkGroupCount++;
             break;
 
           default:
@@ -403,7 +403,7 @@ public class TsFileOnlineUpgradeTool implements 
AutoCloseable {
       }
     } catch (IOException e2) {
       logger.info("TsFile upgrade process cannot proceed at position {} after 
{} chunk groups "
-          + "recovered, because : {}", this.position(), newMetaData.size(), 
e2.getMessage());
+          + "recovered, because : {}", this.position(), chunkGroupCount, 
e2.getMessage());
     } finally {
       if (tsFileInput != null) {
         tsFileInput.close();

Reply via email to