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 630df4ffffaded0d18c093ae12bf4741343430a8..1984f9495adf5456cd2f1532462339647512451d 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 95e9b9eee8fc5fe40490b1c0410e3cdc712cdcc8..428f8c3094c2776030f91ab7a469bbeb0aa49859 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 0000000000000000000000000000000000000000..84c8b9c1ed591d69b76f570c6024233495fd7bb2 --- /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 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 107e3f83bcfddae0ad5a2b624407085c8de53628..38604344a033fbadbd453cadfcb749aff5f314d9 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();