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 2022/01/21 05:46:28 UTC

[iotdb] branch master updated: [IOTDB-2457] Fix Write is blocked after set time_index_level=FILE_TIM… (#4935)

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/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new a235a88  [IOTDB-2457] Fix Write is blocked after set time_index_level=FILE_TIM… (#4935)
a235a88 is described below

commit a235a88c21741783b92e7d7a03c39addce04504f
Author: Jackie Tien <ja...@gmail.com>
AuthorDate: Fri Jan 21 13:45:49 2022 +0800

    [IOTDB-2457] Fix Write is blocked after set time_index_level=FILE_TIM… (#4935)
---
 .../db/engine/storagegroup/TsFileResource.java     |  11 +-
 .../storagegroup/timeindex/TimeIndexLevel.java     |  11 +-
 .../storagegroup/timeindex/V012FileTimeIndex.java  | 169 +++++++++++++++++++++
 .../db/engine/compaction/CompactionUtilsTest.java  |   4 +-
 4 files changed, 188 insertions(+), 7 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
index 630df4f..1984f94 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
@@ -92,7 +92,7 @@ public class TsFileResource {
   /** time index */
   protected ITimeIndex timeIndex;
 
-  /** time index type, fileTimeIndex = 0, deviceTimeIndex = 1 */
+  /** time index type, V012FileTimeIndex = 0, deviceTimeIndex = 1, fileTimeIndex = 2 */
   private byte timeIndexType;
 
   private ModificationFile modFile;
@@ -271,6 +271,13 @@ public class TsFileResource {
         }
       }
     }
+
+    // upgrade from v0.12 to v0.13, we need to rewrite the TsFileResource if the previous time index
+    // is file time index
+    if (timeIndexType == 0) {
+      timeIndexType = 2;
+      serialize();
+    }
   }
 
   /** deserialize tsfile resource from old file */
@@ -954,7 +961,7 @@ public class TsFileResource {
     long endTime = timeIndex.getMaxEndTime();
     // replace the DeviceTimeIndex with FileTimeIndex
     timeIndex = new FileTimeIndex(startTime, endTime);
-    timeIndexType = 0;
+    timeIndexType = 2;
     return ramSize - timeIndex.calculateRamSize();
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/TimeIndexLevel.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/TimeIndexLevel.java
index 95e9b9e..428f8c3 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/TimeIndexLevel.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/TimeIndexLevel.java
@@ -20,14 +20,19 @@
 package org.apache.iotdb.db.engine.storagegroup.timeindex;
 
 public enum TimeIndexLevel {
-  /** file to time index (small memory foot print) */
-  FILE_TIME_INDEX,
+  /** v0.12 file to time index (small memory foot print) */
+  V012_FILE_TIME_INDEX,
 
   /** device to time index (large memory foot print) */
-  DEVICE_TIME_INDEX;
+  DEVICE_TIME_INDEX,
+
+  /** file to time index (small memory foot print) */
+  FILE_TIME_INDEX;
 
   public ITimeIndex getTimeIndex() {
     switch (this) {
+      case V012_FILE_TIME_INDEX:
+        return new V012FileTimeIndex();
       case FILE_TIME_INDEX:
         return new FileTimeIndex();
       case DEVICE_TIME_INDEX:
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/V012FileTimeIndex.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/V012FileTimeIndex.java
new file mode 100644
index 0000000..84c8b9c
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/timeindex/V012FileTimeIndex.java
@@ -0,0 +1,169 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.engine.storagegroup.timeindex;
+
+import org.apache.iotdb.db.exception.PartitionViolationException;
+import org.apache.iotdb.db.utils.SerializeUtils;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.util.Set;
+
+public class V012FileTimeIndex implements ITimeIndex {
+
+  /** devices */
+  public V012FileTimeIndex() {}
+
+  @Override
+  public void serialize(OutputStream outputStream) throws IOException {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and serialize() method should not be called any more.");
+  }
+
+  @Override
+  public FileTimeIndex deserialize(InputStream inputStream) throws IOException {
+    int size = ReadWriteIOUtils.readInt(inputStream);
+    for (int i = 0; i < size; i++) {
+      ReadWriteIOUtils.readString(inputStream);
+    }
+    return new FileTimeIndex(
+        ReadWriteIOUtils.readLong(inputStream), ReadWriteIOUtils.readLong(inputStream));
+  }
+
+  @Override
+  public FileTimeIndex deserialize(ByteBuffer buffer) {
+    int size = buffer.getInt();
+    for (int i = 0; i < size; i++) {
+      SerializeUtils.deserializeString(buffer);
+    }
+    return new FileTimeIndex(buffer.getLong(), buffer.getLong());
+  }
+
+  @Override
+  public void close() {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and close() method should not be called any more.");
+  }
+
+  @Override
+  public Set<String> getDevices(String tsFilePath) {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and getDevices() method should not be called any more.");
+  }
+
+  @Override
+  public boolean endTimeEmpty() {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and endTimeEmpty() method should not be called any more.");
+  }
+
+  @Override
+  public boolean stillLives(long timeLowerBound) {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and stillLives() method should not be called any more.");
+  }
+
+  @Override
+  public long calculateRamSize() {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and calculateRamSize() method should not be called any more.");
+  }
+
+  @Override
+  public long getTimePartition(String tsFilePath) {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and getTimePartition() method should not be called any more.");
+  }
+
+  @Override
+  public long getTimePartitionWithCheck(String tsFilePath) throws PartitionViolationException {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and getTimePartitionWithCheck() method should not be called any more.");
+  }
+
+  @Override
+  public boolean isSpanMultiTimePartitions() {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and isSpanMultiTimePartitions() method should not be called any more.");
+  }
+
+  @Override
+  public void updateStartTime(String deviceId, long time) {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and updateStartTime() method should not be called any more.");
+  }
+
+  @Override
+  public void updateEndTime(String deviceId, long time) {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and updateEndTime() method should not be called any more.");
+  }
+
+  @Override
+  public void putStartTime(String deviceId, long time) {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and putStartTime() method should not be called any more.");
+  }
+
+  @Override
+  public void putEndTime(String deviceId, long time) {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and putEndTime() method should not be called any more.");
+  }
+
+  @Override
+  public long getStartTime(String deviceId) {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and getStartTime() method should not be called any more.");
+  }
+
+  @Override
+  public long getEndTime(String deviceId) {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and getEndTime() method should not be called any more.");
+  }
+
+  @Override
+  public boolean checkDeviceIdExist(String deviceId) {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and checkDeviceIdExist() method should not be called any more.");
+  }
+
+  @Override
+  public long getMinStartTime() {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and getMinStartTime() method should not be called any more.");
+  }
+
+  @Override
+  public long getMaxEndTime() {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading and getMaxEndTime() method should not be called any more.");
+  }
+
+  @Override
+  public int compareDegradePriority(ITimeIndex timeIndex) {
+    throw new UnsupportedOperationException(
+        "V012FileTimeIndex should be rewritten while upgrading.");
+  }
+}
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/compaction/CompactionUtilsTest.java b/server/src/test/java/org/apache/iotdb/db/engine/compaction/CompactionUtilsTest.java
index 107e3f8..3860434 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/compaction/CompactionUtilsTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/compaction/CompactionUtilsTest.java
@@ -3205,10 +3205,10 @@ public class CompactionUtilsTest extends AbstractCompactionTest {
     generateModsFile(seriesPaths, unseqResources, Long.MIN_VALUE, Long.MAX_VALUE);
 
     for (TsFileResource resource : seqResources) {
-      resource.setTimeIndexType((byte) 0);
+      resource.setTimeIndexType((byte) 2);
     }
     for (TsFileResource resource : unseqResources) {
-      resource.setTimeIndexType((byte) 0);
+      resource.setTimeIndexType((byte) 2);
     }
 
     for (int i = TsFileGeneratorUtils.getAlignDeviceOffset();