From ebe4030ebd06595d86f7f697065c6b6963dfe7c2 Mon Sep 17 00:00:00 2001 From: meiyi Date: Tue, 2 Jun 2026 19:21:56 +0800 Subject: [PATCH] [fix](fe) cache version and get tablet stats actively for RestoreJob (#62704) --- .../org/apache/doris/backup/RestoreJob.java | 4 +- .../doris/cloud/backup/CloudRestoreJob.java | 45 ++++++++++++++++++- 2 files changed, 46 insertions(+), 3 deletions(-) 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 4e007723f49a18..4b5eeb56dcf180 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 @@ -2172,7 +2172,7 @@ protected Status allTabletCommitted(boolean isReplay) { } } - updateOlapTablesVersion(db); + updateOlapTablesVersion(db, isReplay); if (!isReplay) { restoredPartitions.clear(); @@ -2199,7 +2199,7 @@ protected Status allTabletCommitted(boolean isReplay) { return Status.OK; } - private void updateOlapTablesVersion(Database db) { + protected void updateOlapTablesVersion(Database db, boolean isReplay) { if (Env.getCurrentEnv().invalidCacheForCloud()) { return; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/cloud/backup/CloudRestoreJob.java b/fe/fe-core/src/main/java/org/apache/doris/cloud/backup/CloudRestoreJob.java index 4b724199a13bce..599589d119c5f5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/cloud/backup/CloudRestoreJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/cloud/backup/CloudRestoreJob.java @@ -22,6 +22,7 @@ import org.apache.doris.backup.RestoreJob; import org.apache.doris.backup.SnapshotInfo; import org.apache.doris.backup.Status; +import org.apache.doris.catalog.CloudTabletStatMgr; import org.apache.doris.catalog.Database; import org.apache.doris.catalog.Env; import org.apache.doris.catalog.EnvFactory; @@ -35,6 +36,7 @@ import org.apache.doris.catalog.ReplicaAllocation; import org.apache.doris.catalog.Table; import org.apache.doris.catalog.TableIf; +import org.apache.doris.catalog.TableIf.TableType; import org.apache.doris.catalog.Tablet; import org.apache.doris.catalog.TabletMeta; import org.apache.doris.cloud.catalog.CloudEnv; @@ -157,6 +159,36 @@ public synchronized void run() { } } + @Override + protected void updateOlapTablesVersion(Database db, boolean isReplay) { + super.updateOlapTablesVersion(db, isReplay); + if (isReplay) { + return; + } + for (String tableName : jobInfo.backupOlapTableObjects.keySet()) { + Table tbl = db.getTableNullable(jobInfo.getAliasByOriginNameIfSet(tableName)); + if (tbl == null || tbl.getType() != TableType.OLAP) { + continue; + } + OlapTable olapTable = (OlapTable) tbl; + + // sync version + List> tableVersionMap = Lists.newArrayList( + Pair.of(olapTable, olapTable.getCachedTableVersion())); + Map> partitionVersionMap = new HashMap<>(olapTable.getPartitions().size()); + for (Partition partition : olapTable.getPartitions()) { + CloudPartition cloudPartition = (CloudPartition) partition; + long version = cloudPartition.getCachedVisibleVersion(); + partitionVersionMap.put(cloudPartition, Pair.of(version, partition.getVisibleVersionTime())); + } + ((CloudEnv) env).getCloudFEVersionSynchronizer() + .pushVersionAsync(dbId, tableVersionMap, partitionVersionMap); + + // add active tablets to get stats + CloudTabletStatMgr.getInstance().addActiveTablets(olapTable.getAllTabletIds()); + } + } + @Override public void checkIfNeedCancel() { super.checkIfNeedCancel(); @@ -462,6 +494,13 @@ private void handleOlapTableMeta(MetaSeriviceOperation operation, OlapTable olap partitions.forEach(partition -> { visibleVersions.add(partition.getCachedVisibleVersion()); partitionIds.add(partition.getId()); + if (partition instanceof CloudPartition) { + ((CloudPartition) partition).setCachedVisibleVersion(partition.getVisibleVersion(), + System.currentTimeMillis()); + LOG.info("set cloud partition: {}, version: {}, versionTime: {}", + partition.getId(), partition.getCachedVisibleVersion(), + partition.getVisibleVersionTime()); + } }); preparePartitions(olapTable, partitionIds, visibleVersions); break; @@ -503,8 +542,12 @@ private void preparePartitions(OlapTable olapTable, List partitionIds, Lis private void commitPartitions(OlapTable olapTable, List partitionIds) throws DdlException { try { - ((CloudInternalCatalog) Env.getCurrentInternalCatalog()).commitPartition( + long tableVersion = ((CloudInternalCatalog) Env.getCurrentInternalCatalog()).commitPartition( dbId, olapTable.getId(), partitionIds, olapTable.getIndexIdList()); + if (tableVersion > 0) { + olapTable.setCachedTableVersion(tableVersion); + LOG.info("set cloud table: {}, version: {}", olapTable.getId(), tableVersion); + } } catch (Exception e) { String errMsg = String.format("cloud restore job failed to commit partitions, table=%s, " + "partitions=%s, errMsg: %s", olapTable.getName(), partitionIds, e.getMessage());