From 1415a7e2b8e19510907549df38f8fd4835fdeba5 Mon Sep 17 00:00:00 2001 From: marsishandsome Date: Wed, 23 Mar 2022 10:13:20 +0800 Subject: [PATCH] remove cdc and br releated components Signed-off-by: marsishandsome --- pom.xml | 6 - src/main/java/org/tikv/br/BackupDecoder.java | 67 ----- .../java/org/tikv/br/BackupMetaDecoder.java | 41 ---- src/main/java/org/tikv/br/KVDecoder.java | 27 -- 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 ----- src/main/java/org/tikv/cdc/CDCClient.java | 232 ------------------ src/main/java/org/tikv/cdc/CDCConfig.java | 58 ----- src/main/java/org/tikv/cdc/CDCEvent.java | 81 ------ .../java/org/tikv/cdc/RegionCDCClient.java | 201 --------------- .../java/org/tikv/br/BackupDecoderTest.java | 95 ------- ...ad5d0c7c0eacb502_1633919546277_default.sst | Bin 6161 -> 0 bytes ...d15d6c15b0f00a08_1633919546278_default.sst | Bin 6122 -> 0 bytes src/test/resources/sst/backupmeta | 11 - ...ad5d0c7c0eacb502_1634199092593_default.sst | Bin 6327 -> 0 bytes ...d15d6c15b0f00a08_1634199092587_default.sst | Bin 6282 -> 0 bytes src/test/resources/sst_ttl/backupmeta | 11 - 18 files changed, 1043 deletions(-) delete mode 100644 src/main/java/org/tikv/br/BackupDecoder.java delete mode 100644 src/main/java/org/tikv/br/BackupMetaDecoder.java delete mode 100644 src/main/java/org/tikv/br/KVDecoder.java delete mode 100644 src/main/java/org/tikv/br/RawKVDecoderV1.java delete mode 100644 src/main/java/org/tikv/br/SSTDecoder.java delete mode 100644 src/main/java/org/tikv/br/SSTIterator.java delete mode 100644 src/main/java/org/tikv/cdc/CDCClient.java delete mode 100644 src/main/java/org/tikv/cdc/CDCConfig.java delete mode 100644 src/main/java/org/tikv/cdc/CDCEvent.java delete mode 100644 src/main/java/org/tikv/cdc/RegionCDCClient.java delete mode 100644 src/test/java/org/tikv/br/BackupDecoderTest.java delete mode 100644 src/test/resources/sst/1_2_2_7154800cc311f03afd1532e961b9a878dfbb119b104cf4daad5d0c7c0eacb502_1633919546277_default.sst delete mode 100644 src/test/resources/sst/4_8_2_9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08_1633919546278_default.sst delete mode 100644 src/test/resources/sst/backupmeta delete mode 100644 src/test/resources/sst_ttl/1_2_2_7154800cc311f03afd1532e961b9a878dfbb119b104cf4daad5d0c7c0eacb502_1634199092593_default.sst delete mode 100644 src/test/resources/sst_ttl/5_8_2_9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08_1634199092587_default.sst delete mode 100644 src/test/resources/sst_ttl/backupmeta diff --git a/pom.xml b/pom.xml index 3b7a796cb25..375265b7cc9 100644 --- a/pom.xml +++ b/pom.xml @@ -54,7 +54,6 @@ 1.8 UTF-8 UTF-8 - 6.22.1.1 3.5.1 1.2.17 1.7.16 @@ -92,11 +91,6 @@ perfmark-traceviewer 0.24.0 - - org.rocksdb - rocksdbjni - ${rocksdb.version} - org.antlr antlr4-runtime diff --git a/src/main/java/org/tikv/br/BackupDecoder.java b/src/main/java/org/tikv/br/BackupDecoder.java deleted file mode 100644 index a6654c6ae8f..00000000000 --- a/src/main/java/org/tikv/br/BackupDecoder.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2021 TiKV Project Authors. - * - * 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, - * 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.tikv.br; - -import java.io.Serializable; -import org.rocksdb.Options; -import org.rocksdb.ReadOptions; -import org.tikv.common.exception.SSTDecodeException; -import org.tikv.kvproto.Brpb; - -public class BackupDecoder implements Serializable { - 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 { - if (backupMeta.getIsRawKv()) { - if ("V1".equals(backupMeta.getApiVersion().name())) { - return new RawKVDecoderV1(ttlEnabled); - } else { - throw new SSTDecodeException( - "does not support decode APIVersion " + backupMeta.getApiVersion().name()); - } - } 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 deleted file mode 100644 index 4ffbf8b53c9..00000000000 --- a/src/main/java/org/tikv/br/BackupMetaDecoder.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2021 TiKV Project Authors. - * - * 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, - * 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.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 deleted file mode 100644 index 651d90f667f..00000000000 --- a/src/main/java/org/tikv/br/KVDecoder.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2021 TiKV Project Authors. - * - * 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, - * 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.tikv.br; - -import com.google.protobuf.ByteString; -import java.io.Serializable; - -public interface KVDecoder extends Serializable { - 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 deleted file mode 100644 index 02c009914e5..00000000000 --- a/src/main/java/org/tikv/br/RawKVDecoderV1.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2021 TiKV Project Authors. - * - * 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, - * 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.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 deleted file mode 100644 index 8d235504cd3..00000000000 --- a/src/main/java/org/tikv/br/SSTDecoder.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2021 TiKV Project Authors. - * - * 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, - * 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.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 deleted file mode 100644 index 1dd55cbfa81..00000000000 --- a/src/main/java/org/tikv/br/SSTIterator.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2021 TiKV Project Authors. - * - * 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, - * 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.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/cdc/CDCClient.java b/src/main/java/org/tikv/cdc/CDCClient.java deleted file mode 100644 index 58fd20e97df..00000000000 --- a/src/main/java/org/tikv/cdc/CDCClient.java +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright 2021 TiKV Project Authors. - * - * 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, - * 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.tikv.cdc; - -import com.google.common.base.Preconditions; -import com.google.common.collect.Range; -import com.google.common.collect.TreeMultiset; -import io.grpc.ManagedChannel; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.TreeMap; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.TimeUnit; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.tikv.common.TiSession; -import org.tikv.common.key.Key; -import org.tikv.common.region.TiRegion; -import org.tikv.common.util.RangeSplitter; -import org.tikv.common.util.RangeSplitter.RegionTask; -import org.tikv.kvproto.Cdcpb.Event.Row; -import org.tikv.kvproto.Coprocessor.KeyRange; -import org.tikv.kvproto.Kvrpcpb; - -public class CDCClient implements AutoCloseable { - private static final Logger LOGGER = LoggerFactory.getLogger(CDCClient.class); - - private final TiSession session; - private final KeyRange keyRange; - private final CDCConfig config; - - private final BlockingQueue eventsBuffer; - private final TreeMap regionClients = new TreeMap<>(); - private final Map regionToResolvedTs = new HashMap<>(); - private final TreeMultiset resolvedTsSet = TreeMultiset.create(); - - private boolean started = false; - - public CDCClient(final TiSession session, final KeyRange keyRange) { - this(session, keyRange, new CDCConfig()); - } - - public CDCClient(final TiSession session, final KeyRange keyRange, final CDCConfig config) { - Preconditions.checkState( - session.getConf().getIsolationLevel().equals(Kvrpcpb.IsolationLevel.SI), - "Unsupported Isolation Level"); // only support SI for now - this.session = session; - this.keyRange = keyRange; - this.config = config; - eventsBuffer = new ArrayBlockingQueue<>(config.getEventBufferSize()); - } - - public synchronized void start(final long startTs) { - Preconditions.checkState(!started, "Client is already started"); - try { - applyKeyRange(keyRange, startTs); - } catch (final Throwable e) { - LOGGER.error("failed to start:", e); - } - started = true; - } - - public synchronized Row get() throws InterruptedException { - final CDCEvent event = eventsBuffer.poll(100, TimeUnit.MILLISECONDS); - if (event != null) { - switch (event.eventType) { - case ROW: - return event.row; - case RESOLVED_TS: - handleResolvedTs(event.regionId, event.resolvedTs); - break; - case ERROR: - handleErrorEvent(event.regionId, event.error); - break; - } - } - return null; - } - - public synchronized long getMinResolvedTs() { - return resolvedTsSet.firstEntry().getElement(); - } - - public synchronized long getMaxResolvedTs() { - return resolvedTsSet.lastEntry().getElement(); - } - - public synchronized void close() { - removeRegions(regionClients.keySet()); - } - - private synchronized void applyKeyRange(final KeyRange keyRange, final long timestamp) { - final RangeSplitter splitter = RangeSplitter.newSplitter(session.getRegionManager()); - - final Iterator newRegionsIterator = - splitter - .splitRangeByRegion(Arrays.asList(keyRange)) - .stream() - .map(RegionTask::getRegion) - .sorted((a, b) -> Long.compare(a.getId(), b.getId())) - .iterator(); - final Iterator oldRegionsIterator = regionClients.values().iterator(); - - final ArrayList regionsToAdd = new ArrayList<>(); - final ArrayList regionsToRemove = new ArrayList<>(); - - TiRegion newRegion = newRegionsIterator.hasNext() ? newRegionsIterator.next() : null; - RegionCDCClient oldRegionClient = - oldRegionsIterator.hasNext() ? oldRegionsIterator.next() : null; - - while (newRegion != null && oldRegionClient != null) { - if (newRegion.getId() == oldRegionClient.getRegion().getId()) { - // check if should refresh region - if (!oldRegionClient.isRunning()) { - regionsToRemove.add(newRegion.getId()); - regionsToAdd.add(newRegion); - } - - newRegion = newRegionsIterator.hasNext() ? newRegionsIterator.next() : null; - oldRegionClient = oldRegionsIterator.hasNext() ? oldRegionsIterator.next() : null; - } else if (newRegion.getId() < oldRegionClient.getRegion().getId()) { - regionsToAdd.add(newRegion); - newRegion = newRegionsIterator.hasNext() ? newRegionsIterator.next() : null; - } else { - regionsToRemove.add(oldRegionClient.getRegion().getId()); - oldRegionClient = oldRegionsIterator.hasNext() ? oldRegionsIterator.next() : null; - } - } - - while (newRegion != null) { - regionsToAdd.add(newRegion); - newRegion = newRegionsIterator.hasNext() ? newRegionsIterator.next() : null; - } - - while (oldRegionClient != null) { - regionsToRemove.add(oldRegionClient.getRegion().getId()); - oldRegionClient = oldRegionsIterator.hasNext() ? oldRegionsIterator.next() : null; - } - - removeRegions(regionsToRemove); - addRegions(regionsToAdd, timestamp); - LOGGER.info("keyRange applied"); - } - - private synchronized void addRegions(final Iterable regions, final long timestamp) { - LOGGER.info("add regions: {}, timestamp: {}", regions, timestamp); - for (final TiRegion region : regions) { - if (overlapWithRegion(region)) { - final String address = - session - .getRegionManager() - .getStoreById(region.getLeader().getStoreId()) - .getStore() - .getAddress(); - final ManagedChannel channel = - session.getChannelFactory().getChannel(address, session.getPDClient().getHostMapping()); - try { - final RegionCDCClient client = - new RegionCDCClient(region, keyRange, channel, eventsBuffer::offer, config); - regionClients.put(region.getId(), client); - regionToResolvedTs.put(region.getId(), timestamp); - resolvedTsSet.add(timestamp); - - client.start(timestamp); - } catch (final Exception e) { - LOGGER.error("failed to add region(regionId: {}, reason: {})", region.getId(), e); - throw new RuntimeException(e); - } - } - } - } - - private synchronized void removeRegions(final Iterable regionIds) { - LOGGER.info("remove regions: {}", regionIds); - for (final long regionId : regionIds) { - final RegionCDCClient regionClient = regionClients.remove(regionId); - if (regionClient != null) { - try { - regionClient.close(); - } catch (final Exception e) { - LOGGER.error("failed to close region client, region id: {}, error: {}", regionId, e); - } finally { - resolvedTsSet.remove(regionToResolvedTs.remove(regionId)); - regionToResolvedTs.remove(regionId); - } - } - } - } - - private boolean overlapWithRegion(final TiRegion region) { - final Range regionRange = - Range.closedOpen(Key.toRawKey(region.getStartKey()), Key.toRawKey(region.getEndKey())); - final Range clientRange = - Range.closedOpen(Key.toRawKey(keyRange.getStart()), Key.toRawKey(keyRange.getEnd())); - final Range intersection = regionRange.intersection(clientRange); - return !intersection.isEmpty(); - } - - private void handleResolvedTs(final long regionId, final long resolvedTs) { - LOGGER.info("handle resolvedTs: {}, regionId: {}", resolvedTs, regionId); - resolvedTsSet.remove(regionToResolvedTs.replace(regionId, resolvedTs)); - resolvedTsSet.add(resolvedTs); - } - - private void handleErrorEvent(final long regionId, final Throwable error) { - LOGGER.info("handle error: {}, regionId: {}", error, regionId); - final TiRegion region = regionClients.get(regionId).getRegion(); - session.getRegionManager().onRequestFail(region); // invalidate cache for corresponding region - - removeRegions(Arrays.asList(regionId)); - applyKeyRange(keyRange, getMinResolvedTs()); // reapply the whole keyRange - } -} diff --git a/src/main/java/org/tikv/cdc/CDCConfig.java b/src/main/java/org/tikv/cdc/CDCConfig.java deleted file mode 100644 index 7de56b04fb4..00000000000 --- a/src/main/java/org/tikv/cdc/CDCConfig.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2021 TiKV Project Authors. - * - * 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, - * 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.tikv.cdc; - -import org.tikv.kvproto.Kvrpcpb; - -public class CDCConfig { - private static final int EVENT_BUFFER_SIZE = 50000; - private static final int MAX_ROW_KEY_SIZE = 10240; - private static final boolean READ_OLD_VALUE = true; - - private int eventBufferSize = EVENT_BUFFER_SIZE; - private int maxRowKeySize = MAX_ROW_KEY_SIZE; - private boolean readOldValue = READ_OLD_VALUE; - - public void setEventBufferSize(final int bufferSize) { - eventBufferSize = bufferSize; - } - - public void setMaxRowKeySize(final int rowKeySize) { - maxRowKeySize = rowKeySize; - } - - public void setReadOldValue(final boolean value) { - readOldValue = value; - } - - public int getEventBufferSize() { - return eventBufferSize; - } - - public int getMaxRowKeySize() { - return maxRowKeySize; - } - - public boolean getReadOldValue() { - return readOldValue; - } - - Kvrpcpb.ExtraOp getExtraOp() { - return readOldValue ? Kvrpcpb.ExtraOp.ReadOldValue : Kvrpcpb.ExtraOp.Noop; - } -} diff --git a/src/main/java/org/tikv/cdc/CDCEvent.java b/src/main/java/org/tikv/cdc/CDCEvent.java deleted file mode 100644 index 568f22a9219..00000000000 --- a/src/main/java/org/tikv/cdc/CDCEvent.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2021 TiKV Project Authors. - * - * 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, - * 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.tikv.cdc; - -import org.tikv.kvproto.Cdcpb.Event.Row; - -class CDCEvent { - enum CDCEventType { - ROW, - RESOLVED_TS, - ERROR - } - - public final long regionId; - - public final CDCEventType eventType; - - public final long resolvedTs; - - public final Row row; - - public final Throwable error; - - private CDCEvent( - final long regionId, - final CDCEventType eventType, - final long resolvedTs, - final Row row, - final Throwable error) { - this.regionId = regionId; - this.eventType = eventType; - this.resolvedTs = resolvedTs; - this.row = row; - this.error = error; - } - - public static CDCEvent rowEvent(final long regionId, final Row row) { - return new CDCEvent(regionId, CDCEventType.ROW, 0, row, null); - } - - public static CDCEvent resolvedTsEvent(final long regionId, final long resolvedTs) { - return new CDCEvent(regionId, CDCEventType.RESOLVED_TS, resolvedTs, null, null); - } - - public static CDCEvent error(final long regionId, final Throwable error) { - return new CDCEvent(regionId, CDCEventType.ERROR, 0, null, error); - } - - @Override - public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("CDCEvent[").append(eventType.toString()).append("] {"); - switch (eventType) { - case ERROR: - builder.append("error=").append(error.getMessage()); - break; - case RESOLVED_TS: - builder.append("resolvedTs=").append(resolvedTs); - break; - case ROW: - builder.append("row=").append(row); - break; - } - return builder.append("}").toString(); - } -} diff --git a/src/main/java/org/tikv/cdc/RegionCDCClient.java b/src/main/java/org/tikv/cdc/RegionCDCClient.java deleted file mode 100644 index 88146becea1..00000000000 --- a/src/main/java/org/tikv/cdc/RegionCDCClient.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright 2021 TiKV Project Authors. - * - * 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, - * 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.tikv.cdc; - -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableSet; -import io.grpc.ManagedChannel; -import io.grpc.stub.StreamObserver; -import java.util.Set; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicLong; -import java.util.function.Consumer; -import java.util.function.Predicate; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.tikv.common.region.TiRegion; -import org.tikv.common.util.FastByteComparisons; -import org.tikv.common.util.KeyRangeUtils; -import org.tikv.kvproto.Cdcpb.ChangeDataEvent; -import org.tikv.kvproto.Cdcpb.ChangeDataRequest; -import org.tikv.kvproto.Cdcpb.Event.LogType; -import org.tikv.kvproto.Cdcpb.Event.Row; -import org.tikv.kvproto.Cdcpb.Header; -import org.tikv.kvproto.Cdcpb.ResolvedTs; -import org.tikv.kvproto.ChangeDataGrpc; -import org.tikv.kvproto.ChangeDataGrpc.ChangeDataStub; -import org.tikv.kvproto.Coprocessor.KeyRange; - -class RegionCDCClient implements AutoCloseable, StreamObserver { - private static final Logger LOGGER = LoggerFactory.getLogger(RegionCDCClient.class); - private static final AtomicLong REQ_ID_COUNTER = new AtomicLong(0); - private static final Set ALLOWED_LOGTYPE = - ImmutableSet.of(LogType.PREWRITE, LogType.COMMIT, LogType.COMMITTED, LogType.ROLLBACK); - - private final TiRegion region; - private final KeyRange keyRange; - private final KeyRange regionKeyRange; - private final ManagedChannel channel; - private final ChangeDataStub asyncStub; - private final Consumer eventConsumer; - private final CDCConfig config; - private final Predicate rowFilter; - - private final AtomicBoolean running = new AtomicBoolean(false); - - private final boolean started = false; - - public RegionCDCClient( - final TiRegion region, - final KeyRange keyRange, - final ManagedChannel channel, - final Consumer eventConsumer, - final CDCConfig config) { - this.region = region; - this.keyRange = keyRange; - this.channel = channel; - this.asyncStub = ChangeDataGrpc.newStub(channel); - this.eventConsumer = eventConsumer; - this.config = config; - - this.regionKeyRange = - KeyRange.newBuilder().setStart(region.getStartKey()).setEnd(region.getEndKey()).build(); - - this.rowFilter = - regionEnclosed() - ? ((row) -> true) - : new Predicate() { - final byte[] buffer = new byte[config.getMaxRowKeySize()]; - - final byte[] start = keyRange.getStart().toByteArray(); - final byte[] end = keyRange.getEnd().toByteArray(); - - @Override - public boolean test(final Row row) { - final int len = row.getKey().size(); - row.getKey().copyTo(buffer, 0); - return (FastByteComparisons.compareTo(buffer, 0, len, start, 0, start.length) >= 0) - && (FastByteComparisons.compareTo(buffer, 0, len, end, 0, end.length) < 0); - } - }; - } - - public synchronized void start(final long startTs) { - Preconditions.checkState(!started, "RegionCDCClient has already started"); - running.set(true); - LOGGER.info("start streaming region: {}, running: {}", region.getId(), running.get()); - final ChangeDataRequest request = - ChangeDataRequest.newBuilder() - .setRequestId(REQ_ID_COUNTER.incrementAndGet()) - .setHeader(Header.newBuilder().setTicdcVersion("5.0.0").build()) - .setRegionId(region.getId()) - .setCheckpointTs(startTs) - .setStartKey(keyRange.getStart()) - .setEndKey(keyRange.getEnd()) - .setRegionEpoch(region.getRegionEpoch()) - .setExtraOp(config.getExtraOp()) - .build(); - final StreamObserver requestObserver = asyncStub.eventFeed(this); - requestObserver.onNext(request); - } - - public TiRegion getRegion() { - return region; - } - - public KeyRange getKeyRange() { - return keyRange; - } - - public KeyRange getRegionKeyRange() { - return regionKeyRange; - } - - public boolean regionEnclosed() { - return KeyRangeUtils.makeRange(keyRange.getStart(), keyRange.getEnd()) - .encloses(KeyRangeUtils.makeRange(regionKeyRange.getStart(), regionKeyRange.getEnd())); - } - - public boolean isRunning() { - return running.get(); - } - - @Override - public void close() throws Exception { - LOGGER.info("close (region: {})", region.getId()); - running.set(false); - synchronized (this) { - channel.shutdown(); - } - try { - LOGGER.debug("awaitTermination (region: {})", region.getId()); - channel.awaitTermination(60, TimeUnit.SECONDS); - } catch (final InterruptedException e) { - LOGGER.error("Failed to shutdown channel(regionId: {})", region.getId()); - Thread.currentThread().interrupt(); - synchronized (this) { - channel.shutdownNow(); - } - } - LOGGER.info("terminated (region: {})", region.getId()); - } - - @Override - public void onCompleted() { - // should never been called - onError(new IllegalStateException("RegionCDCClient should never complete")); - } - - @Override - public void onError(final Throwable error) { - LOGGER.error("region CDC error: region: {}, error: {}", region.getId(), error); - running.set(false); - eventConsumer.accept(CDCEvent.error(region.getId(), error)); - } - - @Override - public void onNext(final ChangeDataEvent event) { - try { - if (running.get()) { - event - .getEventsList() - .stream() - .flatMap(ev -> ev.getEntries().getEntriesList().stream()) - .filter(row -> ALLOWED_LOGTYPE.contains(row.getType())) - .filter(this.rowFilter) - .map(row -> CDCEvent.rowEvent(region.getId(), row)) - .forEach(this::submitEvent); - - if (event.hasResolvedTs()) { - final ResolvedTs resolvedTs = event.getResolvedTs(); - if (resolvedTs.getRegionsList().indexOf(region.getId()) >= 0) { - submitEvent(CDCEvent.resolvedTsEvent(region.getId(), resolvedTs.getTs())); - } - } - } - } catch (final Exception e) { - onError(e); - } - } - - private void submitEvent(final CDCEvent event) { - LOGGER.debug("submit event: {}", event); - eventConsumer.accept(event); - } -} diff --git a/src/test/java/org/tikv/br/BackupDecoderTest.java b/src/test/java/org/tikv/br/BackupDecoderTest.java deleted file mode 100644 index 4abda8604bb..00000000000 --- a/src/test/java/org/tikv/br/BackupDecoderTest.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2021 TiKV Project Authors. - * - * 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, - * 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.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 deleted file mode 100644 index 8ca01d467811622861a2f30ad538366e27952b3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6161 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 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 deleted file mode 100644 index 03bcd27c117710677057658bff0a77430789cd2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6122 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 diff --git a/src/test/resources/sst/backupmeta b/src/test/resources/sst/backupmeta deleted file mode 100644 index abcca0b24ca..00000000000 --- a/src/test/resources/sst/backupmeta +++ /dev/null @@ -1,11 +0,0 @@ -턘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 deleted file mode 100644 index 6bf2760fa0869e944c455bc7887b9d079e2e7ec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6327 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 Gru`Qmx8?Hy 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 deleted file mode 100644 index 9c582e58188aa18db48cbf8327cee42ece333614..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6282 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 Uk+ZG;XPlkbAK8g%)Lx4FFKDUdd;kCd diff --git a/src/test/resources/sst_ttl/backupmeta b/src/test/resources/sst_ttl/backupmeta deleted file mode 100644 index 978ef5f61a9..00000000000 --- a/src/test/resources/sst_ttl/backupmeta +++ /dev/null @@ -1,11 +0,0 @@ -ȗ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