From afe09e459e3e45451fddec245b863e266c1e1187 Mon Sep 17 00:00:00 2001 From: smallx Date: Fri, 30 Aug 2024 10:24:42 +0800 Subject: [PATCH] [fix](restore) Reset next version for remote table when restore (#40118) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We should reset next version to visible version + 1 for all partitions of remote table, when restoring table that do not exist locally. 在高并发insert场景,CCR源端表的next version可能比visible version大比较多,目标集群restore全量快照后,切换到增量binlog后,commit事务时使用的version(来自next version)就可能比当前visible version大比较多。 此时,对于MoW表,就会出现publish version不连续,增量binlog一直无法publish的问题。事务状态会一直是`COMMITTED`,并伴随类似ErrMsg `wait for publishing partition 15027 version 1037597. self version: 1037627. table 15025`。 --- .../src/main/java/org/apache/doris/backup/RestoreJob.java | 3 +++ .../src/main/java/org/apache/doris/catalog/OlapTable.java | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java b/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java index 5b2a2e7e8220a5..10c57467951af6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java @@ -771,6 +771,9 @@ private void checkAndPrepareMeta() { return; } + // reset next version to visible version + 1 for all partitions + remoteOlapTbl.resetVersionForRestore(); + // Reset properties to correct values. remoteOlapTbl.resetPropertiesForRestore(reserveDynamicPartitionEnable, reserveReplica, replicaAlloc, isBeingSynced); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java index 483dfc18e749ea..b8b51f01625ba2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java @@ -629,6 +629,12 @@ public void resetPropertiesForRestore(boolean reserveDynamicPartitionEnable, boo setColocateGroup(null); } + public void resetVersionForRestore() { + for (Partition partition : idToPartition.values()) { + partition.setNextVersion(partition.getVisibleVersion() + 1); + } + } + public Status resetIdsForRestore(Env env, Database db, ReplicaAllocation restoreReplicaAlloc, boolean reserveReplica, String srcDbName) { // ATTN: The meta of the restore may come from different clusters, so the