未验证 提交 a235a88c 编写于 作者: J Jackie Tien 提交者: GitHub

[IOTDB-2457] Fix Write is blocked after set time_index_level=FILE_TIM… (#4935)

上级 09a46f34
......@@ -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();
}
......
......@@ -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:
......
/*
* 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.");
}
}
......@@ -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();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册