From bbe4f9b0c4e0c8d29eb1875cf96903b389d0775c Mon Sep 17 00:00:00 2001 From: Liangliang Gu Date: Thu, 14 Oct 2021 17:13:57 +0800 Subject: [PATCH] Support SST Decoder (#284) --- pom.xml | 6 ++ scripts/proto.sh | 2 +- src/main/java/org/tikv/br/BackupDecoder.java | 64 ++++++++++++ .../java/org/tikv/br/BackupMetaDecoder.java | 41 ++++++++ src/main/java/org/tikv/br/KVDecoder.java | 26 +++++ src/main/java/org/tikv/br/RawKVDecoderV1.java | 56 +++++++++++ src/main/java/org/tikv/br/SSTDecoder.java | 93 ++++++++++++++++++ src/main/java/org/tikv/br/SSTIterator.java | 64 ++++++++++++ .../common/exception/SSTDecodeException.java | 26 +++++ .../tikv/common/region/RegionStoreClient.java | 2 +- .../java/org/tikv/br/BackupDecoderTest.java | 78 +++++++++++++++ ...ad5d0c7c0eacb502_1633919546277_default.sst | Bin 0 -> 6161 bytes ...d15d6c15b0f00a08_1633919546278_default.sst | Bin 0 -> 6122 bytes src/test/resources/sst/backupmeta | 11 +++ ...ad5d0c7c0eacb502_1634199092593_default.sst | Bin 0 -> 6327 bytes ...d15d6c15b0f00a08_1634199092587_default.sst | Bin 0 -> 6282 bytes src/test/resources/sst_ttl/backupmeta | 11 +++ 17 files changed, 478 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/tikv/br/BackupDecoder.java create mode 100644 src/main/java/org/tikv/br/BackupMetaDecoder.java create mode 100644 src/main/java/org/tikv/br/KVDecoder.java create mode 100644 src/main/java/org/tikv/br/RawKVDecoderV1.java create mode 100644 src/main/java/org/tikv/br/SSTDecoder.java create mode 100644 src/main/java/org/tikv/br/SSTIterator.java create mode 100644 src/main/java/org/tikv/common/exception/SSTDecodeException.java create mode 100644 src/test/java/org/tikv/br/BackupDecoderTest.java create mode 100644 src/test/resources/sst/1_2_2_7154800cc311f03afd1532e961b9a878dfbb119b104cf4daad5d0c7c0eacb502_1633919546277_default.sst create mode 100644 src/test/resources/sst/4_8_2_9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08_1633919546278_default.sst create mode 100644 src/test/resources/sst/backupmeta create mode 100644 src/test/resources/sst_ttl/1_2_2_7154800cc311f03afd1532e961b9a878dfbb119b104cf4daad5d0c7c0eacb502_1634199092593_default.sst create mode 100644 src/test/resources/sst_ttl/5_8_2_9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08_1634199092587_default.sst create mode 100644 src/test/resources/sst_ttl/backupmeta diff --git a/pom.xml b/pom.xml index e56c6a0613..4aa8c96893 100644 --- a/pom.xml +++ b/pom.xml @@ -61,6 +61,7 @@ 1.8 UTF-8 UTF-8 + 6.22.1.1 3.5.1 1.2.17 1.7.16 @@ -79,6 +80,11 @@ + + org.rocksdb + rocksdbjni + ${rocksdb.version} + org.antlr antlr4-runtime diff --git a/scripts/proto.sh b/scripts/proto.sh index 8d65d7dd2f..a5e54ccd4e 100755 --- a/scripts/proto.sh +++ b/scripts/proto.sh @@ -14,7 +14,7 @@ # limitations under the License. # -kvproto_hash=2ac2a7984b2d01b96ed56fd8474f4bf80fa33c51 +kvproto_hash=465fa4c7b42e644d5aacaf79d06c75733dc12eb3 raft_rs_hash=b9891b673573fad77ebcf9bbe0969cf945841926 tipb_hash=c4d518eb1d60c21f05b028b36729e64610346dac diff --git a/src/main/java/org/tikv/br/BackupDecoder.java b/src/main/java/org/tikv/br/BackupDecoder.java new file mode 100644 index 0000000000..fb63d63ee4 --- /dev/null +++ b/src/main/java/org/tikv/br/BackupDecoder.java @@ -0,0 +1,64 @@ +/* + * + * Copyright 2021 PingCAP, Inc. + * + * Licensed 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, + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.tikv.br; + +import org.rocksdb.Options; +import org.rocksdb.ReadOptions; +import org.tikv.common.exception.SSTDecodeException; +import org.tikv.kvproto.Brpb; + +public class BackupDecoder { + private final Brpb.BackupMeta backupMeta; + private final boolean ttlEnabled; + private final KVDecoder kvDecoder; + + public BackupDecoder(Brpb.BackupMeta backupMeta) throws SSTDecodeException { + this.backupMeta = backupMeta; + this.ttlEnabled = false; + this.kvDecoder = initKVDecoder(); + } + + public BackupDecoder(Brpb.BackupMeta backupMeta, boolean ttlEnabled) throws SSTDecodeException { + this.backupMeta = backupMeta; + this.ttlEnabled = ttlEnabled; + this.kvDecoder = initKVDecoder(); + } + + private KVDecoder initKVDecoder() throws SSTDecodeException { + // Currently only v1 is supported. + // V2 will be added after https://github.com/tikv/tikv/issues/10938. + if (backupMeta.getIsRawKv()) { + // TODO: ttl_enable should be witten to BackupMeta + return new RawKVDecoderV1(ttlEnabled); + } else { + throw new SSTDecodeException("TxnKV is not supported yet!"); + } + } + + public SSTDecoder decodeSST(String sstFilePath) { + return decodeSST(sstFilePath, new Options(), new ReadOptions()); + } + + public SSTDecoder decodeSST(String sstFilePath, Options options, ReadOptions readOptions) { + return new SSTDecoder(sstFilePath, kvDecoder, options, readOptions); + } + + public Brpb.BackupMeta getBackupMeta() { + return backupMeta; + } +} diff --git a/src/main/java/org/tikv/br/BackupMetaDecoder.java b/src/main/java/org/tikv/br/BackupMetaDecoder.java new file mode 100644 index 0000000000..ce4a258fe9 --- /dev/null +++ b/src/main/java/org/tikv/br/BackupMetaDecoder.java @@ -0,0 +1,41 @@ +/* + * + * Copyright 2021 PingCAP, Inc. + * + * Licensed 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, + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.tikv.br; + +import com.google.protobuf.InvalidProtocolBufferException; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import org.tikv.kvproto.Brpb; + +public class BackupMetaDecoder { + private final Brpb.BackupMeta backupMeta; + + public BackupMetaDecoder(byte[] data) throws InvalidProtocolBufferException { + this.backupMeta = Brpb.BackupMeta.parseFrom(data); + } + + public Brpb.BackupMeta getBackupMeta() { + return backupMeta; + } + + public static BackupMetaDecoder parse(String backupMetaFilePath) throws IOException { + byte[] data = Files.readAllBytes(new File(backupMetaFilePath).toPath()); + return new BackupMetaDecoder(data); + } +} diff --git a/src/main/java/org/tikv/br/KVDecoder.java b/src/main/java/org/tikv/br/KVDecoder.java new file mode 100644 index 0000000000..1f0b580c1a --- /dev/null +++ b/src/main/java/org/tikv/br/KVDecoder.java @@ -0,0 +1,26 @@ +/* + * + * Copyright 2021 PingCAP, Inc. + * + * Licensed 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, + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.tikv.br; + +import com.google.protobuf.ByteString; + +public interface KVDecoder { + ByteString decodeKey(byte[] key); + + ByteString decodeValue(byte[] value); +} diff --git a/src/main/java/org/tikv/br/RawKVDecoderV1.java b/src/main/java/org/tikv/br/RawKVDecoderV1.java new file mode 100644 index 0000000000..7b2e50db9b --- /dev/null +++ b/src/main/java/org/tikv/br/RawKVDecoderV1.java @@ -0,0 +1,56 @@ +/* + * + * Copyright 2021 PingCAP, Inc. + * + * Licensed 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, + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.tikv.br; + +import com.google.protobuf.ByteString; +import java.util.Arrays; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RawKVDecoderV1 implements KVDecoder { + private static final Logger logger = LoggerFactory.getLogger(SSTIterator.class); + + private final boolean ttlEnabled; + + public RawKVDecoderV1(boolean ttlEnabled) { + this.ttlEnabled = ttlEnabled; + } + + @Override + public ByteString decodeKey(byte[] key) { + if (key == null || key.length == 0) { + logger.warn( + "skip Key-Value pair because key == null || key.length == 0, key = " + + Arrays.toString(key)); + return null; + } else if (key[0] != 'z') { + logger.warn("skip Key-Value pair because key[0] != 'z', key = " + Arrays.toString(key)); + return null; + } + return ByteString.copyFrom(key, 1, key.length - 1); + } + + @Override + public ByteString decodeValue(byte[] value) { + if (!ttlEnabled) { + return ByteString.copyFrom(value); + } else { + return ByteString.copyFrom(value).substring(0, value.length - 8); + } + } +} diff --git a/src/main/java/org/tikv/br/SSTDecoder.java b/src/main/java/org/tikv/br/SSTDecoder.java new file mode 100644 index 0000000000..1841b4e9db --- /dev/null +++ b/src/main/java/org/tikv/br/SSTDecoder.java @@ -0,0 +1,93 @@ +/* + * + * Copyright 2021 PingCAP, Inc. + * + * Licensed 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, + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.tikv.br; + +import com.google.protobuf.ByteString; +import java.util.Iterator; +import org.rocksdb.Options; +import org.rocksdb.ReadOptions; +import org.rocksdb.RocksDBException; +import org.rocksdb.SstFileReader; +import org.rocksdb.SstFileReaderIterator; +import org.tikv.common.util.Pair; + +public class SSTDecoder { + private final String filePath; + private final KVDecoder kvDecoder; + private final Options options; + private final ReadOptions readOptions; + + private SstFileReader sstFileReader; + private SstFileReaderIterator iterator; + + public SSTDecoder(String sstFilePath, KVDecoder kvDecoder) { + this.filePath = sstFilePath; + this.kvDecoder = kvDecoder; + this.options = new Options(); + this.readOptions = new ReadOptions(); + } + + public SSTDecoder( + String filePath, KVDecoder kvDecoder, Options options, ReadOptions readOptions) { + this.filePath = filePath; + this.kvDecoder = kvDecoder; + this.options = options; + this.readOptions = readOptions; + } + + public synchronized Iterator> getIterator() throws RocksDBException { + if (sstFileReader != null || iterator != null) { + throw new RocksDBException("File already opened!"); + } + + sstFileReader = new SstFileReader(new Options()); + sstFileReader.open(filePath); + iterator = sstFileReader.newIterator(new ReadOptions()); + return new SSTIterator(iterator, kvDecoder); + } + + public synchronized void close() { + try { + if (iterator != null) { + iterator.close(); + } + } finally { + iterator = null; + } + + try { + if (sstFileReader != null) { + sstFileReader.close(); + } + } finally { + sstFileReader = null; + } + } + + public String getFilePath() { + return filePath; + } + + public Options getOptions() { + return options; + } + + public ReadOptions getReadOptions() { + return readOptions; + } +} diff --git a/src/main/java/org/tikv/br/SSTIterator.java b/src/main/java/org/tikv/br/SSTIterator.java new file mode 100644 index 0000000000..0b8e40c5c3 --- /dev/null +++ b/src/main/java/org/tikv/br/SSTIterator.java @@ -0,0 +1,64 @@ +/* + * + * Copyright 2021 PingCAP, Inc. + * + * Licensed 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, + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.tikv.br; + +import com.google.protobuf.ByteString; +import java.util.Iterator; +import org.rocksdb.SstFileReaderIterator; +import org.tikv.common.util.Pair; + +public class SSTIterator implements Iterator> { + private final SstFileReaderIterator iterator; + private final KVDecoder kvDecoder; + + private Pair nextPair; + + public SSTIterator(SstFileReaderIterator iterator, KVDecoder kvDecoder) { + this.iterator = iterator; + this.kvDecoder = kvDecoder; + this.iterator.seekToFirst(); + this.nextPair = processNext(); + } + + @Override + public boolean hasNext() { + return nextPair != null; + } + + @Override + public Pair next() { + Pair result = nextPair; + nextPair = processNext(); + return result; + } + + private Pair processNext() { + if (iterator.isValid()) { + ByteString key = kvDecoder.decodeKey(iterator.key()); + ByteString value = kvDecoder.decodeValue(iterator.value()); + iterator.next(); + if (key != null) { + return Pair.create(key, value); + } else { + return processNext(); + } + } else { + return null; + } + } +} diff --git a/src/main/java/org/tikv/common/exception/SSTDecodeException.java b/src/main/java/org/tikv/common/exception/SSTDecodeException.java new file mode 100644 index 0000000000..5d8ecfec80 --- /dev/null +++ b/src/main/java/org/tikv/common/exception/SSTDecodeException.java @@ -0,0 +1,26 @@ +/* + * Copyright 2021 PingCAP, Inc. + * + * Licensed 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, + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.tikv.common.exception; + +public class SSTDecodeException extends RuntimeException { + public SSTDecodeException(Exception e) { + super(e); + } + + public SSTDecodeException(String msg) { + super(msg); + } +} diff --git a/src/main/java/org/tikv/common/region/RegionStoreClient.java b/src/main/java/org/tikv/common/region/RegionStoreClient.java index bfe655e912..29d3bdc64d 100644 --- a/src/main/java/org/tikv/common/region/RegionStoreClient.java +++ b/src/main/java/org/tikv/common/region/RegionStoreClient.java @@ -1042,7 +1042,7 @@ public class RegionStoreClient extends AbstractRegionStoreClient { RawBatchPutRequest.newBuilder() .setContext(makeContext(storeType)) .addAllPairs(kvPairs) - .setTtl(ttl) + .addTtls(ttl) .setForCas(atomicForCAS) .build(); RegionErrorHandler handler = diff --git a/src/test/java/org/tikv/br/BackupDecoderTest.java b/src/test/java/org/tikv/br/BackupDecoderTest.java new file mode 100644 index 0000000000..c1f81de595 --- /dev/null +++ b/src/test/java/org/tikv/br/BackupDecoderTest.java @@ -0,0 +1,78 @@ +package org.tikv.br; + +import com.google.protobuf.ByteString; +import java.io.File; +import java.io.IOException; +import java.util.Iterator; +import org.junit.Assert; +import org.junit.Test; +import org.rocksdb.RocksDBException; +import org.tikv.common.util.Pair; +import org.tikv.kvproto.Brpb; + +public class BackupDecoderTest { + + private static final int TOTAL_COUNT = 500; + private static final String KEY_PREFIX = "test_"; + private static final String VALUE = + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; + + @Test + public void rawKVSSTDecoderTest() throws RocksDBException, IOException { + String backupmetaFilePath = "src/test/resources/sst/backupmeta"; + String sst1FilePath = + "src/test/resources/sst/1_2_2_7154800cc311f03afd1532e961b9a878dfbb119b104cf4daad5d0c7c0eacb502_1633919546277_default.sst"; + String sst2FilePath = + "src/test/resources/sst/4_8_2_9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08_1633919546278_default.sst"; + + BackupMetaDecoder backupMetaDecoder = BackupMetaDecoder.parse(backupmetaFilePath); + Brpb.BackupMeta backupMeta = backupMetaDecoder.getBackupMeta(); + + BackupDecoder sstBackup = new BackupDecoder(backupMeta); + + decodeSST(sstBackup, sst1FilePath); + decodeSST(sstBackup, sst2FilePath); + } + + @Test + public void rawKVWithTTLSSTDecoderTest() throws RocksDBException, IOException { + String backupmetaFilePath = "src/test/resources/sst_ttl/backupmeta"; + String sst1FilePath = + "src/test/resources/sst_ttl/1_2_2_7154800cc311f03afd1532e961b9a878dfbb119b104cf4daad5d0c7c0eacb502_1634199092593_default.sst"; + String sst2FilePath = + "src/test/resources/sst_ttl/5_8_2_9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08_1634199092587_default.sst"; + + BackupMetaDecoder backupMetaDecoder = BackupMetaDecoder.parse(backupmetaFilePath); + Brpb.BackupMeta backupMeta = backupMetaDecoder.getBackupMeta(); + + BackupDecoder sstBackup = new BackupDecoder(backupMeta, true); + + decodeSST(sstBackup, sst1FilePath); + decodeSST(sstBackup, sst2FilePath); + } + + private void decodeSST(BackupDecoder sstBackup, String sst) throws RocksDBException { + String fileName = new File(sst).getName(); + Brpb.File backupFile = + sstBackup + .getBackupMeta() + .getFilesList() + .stream() + .filter(a -> a.getName().equals(fileName)) + .findFirst() + .get(); + Assert.assertEquals(TOTAL_COUNT, backupFile.getTotalKvs()); + + SSTDecoder sstDecoder = sstBackup.decodeSST(sst); + Iterator> iterator = sstDecoder.getIterator(); + int count = 0; + while (iterator.hasNext()) { + Pair pair = iterator.next(); + Assert.assertEquals(VALUE, pair.second.toStringUtf8()); + Assert.assertTrue(pair.first.toStringUtf8().startsWith(KEY_PREFIX)); + count += 1; + } + sstDecoder.close(); + Assert.assertEquals(TOTAL_COUNT, count); + } +} diff --git a/src/test/resources/sst/1_2_2_7154800cc311f03afd1532e961b9a878dfbb119b104cf4daad5d0c7c0eacb502_1633919546277_default.sst b/src/test/resources/sst/1_2_2_7154800cc311f03afd1532e961b9a878dfbb119b104cf4daad5d0c7c0eacb502_1633919546277_default.sst new file mode 100644 index 0000000000000000000000000000000000000000..8ca01d467811622861a2f30ad538366e27952b3c GIT binary patch literal 6161 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/sst/4_8_2_9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08_1633919546278_default.sst b/src/test/resources/sst/4_8_2_9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08_1633919546278_default.sst new file mode 100644 index 0000000000000000000000000000000000000000..03bcd27c117710677057658bff0a77430789cd2b GIT binary patch literal 6122 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/sst/backupmeta b/src/test/resources/sst/backupmeta new file mode 100644 index 0000000000..abcca0b24c --- /dev/null +++ b/src/test/resources/sst/backupmeta @@ -0,0 +1,11 @@ +턘a"5.3.0-alpha" +" +`4_8_2_9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08_1633919546278_default.sst -婔1N7@h*2,L>c_Q?test"test_-009965169116504@HRdefaultX/" +`1_2_2_7154800cc311f03afd1532e961b9a878dfbb119b104cf4daad5d0c7c0eacb502_1633919546277_default.sst H]f;FjLV@7ytest_-009965169116504"u@HRdefaultX0@J +testudefaultR[]ZBR +Release Version: v5.2.1 +Git Commit Hash: cd8fb24c5f7ebd9d479ed228bb41848bd5e97445 +Git Branch: heads/refs/tags/v5.2.1 +Go Version: go1.16.4 +UTC Build Time: 2021-09-07 16:19:11 +Race Enabled: false \ No newline at end of file diff --git a/src/test/resources/sst_ttl/1_2_2_7154800cc311f03afd1532e961b9a878dfbb119b104cf4daad5d0c7c0eacb502_1634199092593_default.sst b/src/test/resources/sst_ttl/1_2_2_7154800cc311f03afd1532e961b9a878dfbb119b104cf4daad5d0c7c0eacb502_1634199092593_default.sst new file mode 100644 index 0000000000000000000000000000000000000000..6bf2760fa0869e944c455bc7887b9d079e2e7ec4 GIT binary patch literal 6327 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 Gru`Qmx8?Hy literal 0 HcmV?d00001 diff --git a/src/test/resources/sst_ttl/5_8_2_9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08_1634199092587_default.sst b/src/test/resources/sst_ttl/5_8_2_9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08_1634199092587_default.sst new file mode 100644 index 0000000000000000000000000000000000000000..9c582e58188aa18db48cbf8327cee42ece333614 GIT binary patch literal 6282 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 Uk+ZG;XPlkbAK8g%)Lx4FFKDUdd;kCd literal 0 HcmV?d00001 diff --git a/src/test/resources/sst_ttl/backupmeta b/src/test/resources/sst_ttl/backupmeta new file mode 100644 index 0000000000..978ef5f61a --- /dev/null +++ b/src/test/resources/sst_ttl/backupmeta @@ -0,0 +1,11 @@ +ȗa"5.3.0-alpha" +" +`5_8_2_9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08_1634199092587_default.sst I~Ѷ:8~0KFtest"test_-009965169116504@HRdefaultX1" +`1_2_2_7154800cc311f03afd1532e961b9a878dfbb119b104cf4daad5d0c7c0eacb502_1634199092593_default.sst w2l^9>6#Մލ)qar~test_-009965169116504"u@HRdefaultX1@J +testudefaultR[]ZBR +Release Version: v5.2.1 +Git Commit Hash: cd8fb24c5f7ebd9d479ed228bb41848bd5e97445 +Git Branch: heads/refs/tags/v5.2.1 +Go Version: go1.16.4 +UTC Build Time: 2021-09-07 16:19:11 +Race Enabled: false \ No newline at end of file