Skip to content

Commit 89cfae7

Browse files
authored
Load TsFile version upon openning a TsFileSequenceReader (#254)
* Load TsFile version upon openning a TsFileSequenceReader * handle exception
1 parent efb39a6 commit 89cfae7

File tree

5 files changed

+75
-32
lines changed

5 files changed

+75
-32
lines changed

java/tsfile/src/main/java/org/apache/tsfile/exception/NotCompatibleTsFileException.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,8 @@ public class NotCompatibleTsFileException extends TsFileRuntimeException {
2626
public NotCompatibleTsFileException(String message) {
2727
super(message);
2828
}
29+
30+
public NotCompatibleTsFileException(Throwable cause) {
31+
super(cause);
32+
}
2933
}

java/tsfile/src/main/java/org/apache/tsfile/exception/TsFileRuntimeException.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,8 @@ public TsFileRuntimeException(String message) {
3434
public TsFileRuntimeException(Throwable cause) {
3535
super(cause);
3636
}
37+
38+
public TsFileRuntimeException(String message, Throwable cause) {
39+
super(message, cause);
40+
}
3741
}

java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.apache.tsfile.encrypt.EncryptUtils;
3030
import org.apache.tsfile.encrypt.IDecryptor;
3131
import org.apache.tsfile.enums.TSDataType;
32+
import org.apache.tsfile.exception.NotCompatibleTsFileException;
3233
import org.apache.tsfile.exception.StopReadTsFileByInterruptException;
3334
import org.apache.tsfile.exception.TsFileRuntimeException;
3435
import org.apache.tsfile.exception.TsFileStatisticsMistakesException;
@@ -157,7 +158,9 @@ public TsFileSequenceReader(String file, boolean loadMetadataSize) throws IOExce
157158
}
158159
this.file = file;
159160
tsFileInput = FSFactoryProducer.getFileInputFactory().getTsFileInput(file);
161+
160162
try {
163+
loadFileVersion();
161164
if (loadMetadataSize) {
162165
loadMetadataSize();
163166
}
@@ -221,17 +224,24 @@ public TsFileSequenceReader(TsFileInput input, long fileMetadataPos, int fileMet
221224
}
222225

223226
private void loadFileVersion() throws IOException {
224-
tsFileInput.position(TSFileConfig.MAGIC_STRING.getBytes(TSFileConfig.STRING_CHARSET).length);
225-
final ByteBuffer buffer = ByteBuffer.allocate(1);
226-
tsFileInput.read(buffer);
227-
buffer.flip();
228-
fileVersion = buffer.get();
227+
try {
228+
tsFileInput.position(TSFileConfig.MAGIC_STRING.getBytes(TSFileConfig.STRING_CHARSET).length);
229+
final ByteBuffer buffer = ByteBuffer.allocate(1);
230+
tsFileInput.read(buffer);
231+
buffer.flip();
232+
fileVersion = buffer.get();
229233

230-
checkFileVersion();
231-
configDeserializer();
234+
checkFileVersion();
235+
configDeserializer();
236+
237+
tsFileInput.position(0);
238+
} catch (Exception e) {
239+
tsFileInput.close();
240+
throw new NotCompatibleTsFileException(e);
241+
}
232242
}
233243

234-
private void configDeserializer() throws IOException {
244+
private void configDeserializer() {
235245
if (fileVersion == TSFileConfig.VERSION_NUMBER_V3) {
236246
deserializeConfig = CompatibilityUtils.v3DeserializeConfig;
237247
}
@@ -244,8 +254,6 @@ private void checkFileVersion() throws FileVersionTooOldException {
244254
}
245255

246256
public void loadMetadataSize() throws IOException {
247-
loadFileVersion();
248-
249257
ByteBuffer metadataSize = ByteBuffer.allocate(Integer.BYTES);
250258
if (readTailMagic().equals(TSFileConfig.MAGIC_STRING)) {
251259
tsFileInput.read(
@@ -1863,10 +1871,11 @@ public long selfCheck(
18631871
if (fileSize < headerLength) {
18641872
return TsFileCheckStatus.INCOMPATIBLE_FILE;
18651873
}
1866-
if (!TSFileConfig.MAGIC_STRING.equals(readHeadMagic())
1867-
|| (TSFileConfig.VERSION_NUMBER != readVersionNumber())) {
1874+
if (!TSFileConfig.MAGIC_STRING.equals(readHeadMagic())) {
18681875
return TsFileCheckStatus.INCOMPATIBLE_FILE;
18691876
}
1877+
fileVersion = readVersionNumber();
1878+
checkFileVersion();
18701879

18711880
tsFileInput.position(headerLength);
18721881
boolean isComplete = isComplete();

java/tsfile/src/main/java/org/apache/tsfile/write/writer/RestorableTsFileIOWriter.java

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -107,29 +107,35 @@ public RestorableTsFileIOWriter(File file, boolean truncate) throws IOException
107107
return;
108108
}
109109

110-
if (file.exists()) {
111-
try (TsFileSequenceReader reader = new TsFileSequenceReader(file.getAbsolutePath(), false)) {
112-
schema.setEnabledUpdateSchema(false);
113-
truncatedSize = reader.selfCheck(schema, chunkGroupMetadataList, true);
114-
minPlanIndex = reader.getMinPlanIndex();
115-
maxPlanIndex = reader.getMaxPlanIndex();
116-
if (truncatedSize == TsFileCheckStatus.COMPLETE_FILE) {
117-
crashed = false;
118-
canWrite = false;
119-
out.close();
120-
} else if (truncatedSize == TsFileCheckStatus.INCOMPATIBLE_FILE) {
121-
out.close();
122-
throw new NotCompatibleTsFileException(
123-
String.format("%s is not in TsFile format.", file.getAbsolutePath()));
124-
} else {
125-
crashed = true;
126-
canWrite = true;
127-
// remove broken data
128-
if (truncate) {
129-
out.truncate(truncatedSize);
110+
try {
111+
if (file.exists()) {
112+
try (TsFileSequenceReader reader =
113+
new TsFileSequenceReader(file.getAbsolutePath(), false)) {
114+
schema.setEnabledUpdateSchema(false);
115+
truncatedSize = reader.selfCheck(schema, chunkGroupMetadataList, true);
116+
minPlanIndex = reader.getMinPlanIndex();
117+
maxPlanIndex = reader.getMaxPlanIndex();
118+
if (truncatedSize == TsFileCheckStatus.COMPLETE_FILE) {
119+
crashed = false;
120+
canWrite = false;
121+
out.close();
122+
} else if (truncatedSize == TsFileCheckStatus.INCOMPATIBLE_FILE) {
123+
out.close();
124+
throw new NotCompatibleTsFileException(
125+
String.format("%s is not in TsFile format.", file.getAbsolutePath()));
126+
} else {
127+
crashed = true;
128+
canWrite = true;
129+
// remove broken data
130+
if (truncate) {
131+
out.truncate(truncatedSize);
132+
}
130133
}
131134
}
132135
}
136+
} catch (Exception e) {
137+
out.close();
138+
throw e;
133139
}
134140
}
135141

java/tsfile/src/test/java/org/apache/tsfile/compatibility/CompatibilityTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,26 @@
1919

2020
package org.apache.tsfile.compatibility;
2121

22+
import org.apache.tsfile.file.metadata.ChunkGroupMetadata;
23+
import org.apache.tsfile.file.metadata.IDeviceID.Factory;
2224
import org.apache.tsfile.read.TsFileReader;
2325
import org.apache.tsfile.read.TsFileSequenceReader;
2426
import org.apache.tsfile.read.common.Path;
2527
import org.apache.tsfile.read.common.RowRecord;
2628
import org.apache.tsfile.read.expression.QueryExpression;
2729
import org.apache.tsfile.read.query.dataset.QueryDataSet;
30+
import org.apache.tsfile.write.schema.Schema;
2831

2932
import org.junit.Test;
3033

3134
import java.io.File;
3235
import java.io.IOException;
36+
import java.util.ArrayList;
37+
import java.util.List;
3338

39+
import static org.apache.tsfile.read.TsFileCheckStatus.COMPLETE_FILE;
3440
import static org.junit.Assert.assertEquals;
41+
import static org.junit.Assert.assertTrue;
3542
import static org.junit.Assert.fail;
3643

3744
public class CompatibilityTest {
@@ -45,6 +52,19 @@ public void testReadV3() {
4552
readOneRow();
4653
}
4754

55+
@Test
56+
public void testV3SelfCheck() throws IOException {
57+
Schema schema = new Schema();
58+
List<ChunkGroupMetadata> chunkGroupMetadataList = new ArrayList<>();
59+
try (TsFileSequenceReader sequenceReader = new TsFileSequenceReader(fileName)) {
60+
assertEquals(COMPLETE_FILE, sequenceReader.selfCheck(schema, chunkGroupMetadataList, false));
61+
assertTrue(sequenceReader.isComplete());
62+
}
63+
assertTrue(schema.containsDevice(Factory.DEFAULT_FACTORY.create("d1")));
64+
assertTrue(schema.containsDevice(Factory.DEFAULT_FACTORY.create("d2")));
65+
assertEquals(2, chunkGroupMetadataList.size());
66+
}
67+
4868
private void readOneRow() {
4969
readOneRow(5);
5070
}

0 commit comments

Comments
 (0)