From 6e1ce8d2bcf6b0cfc1b08f0dfd2cee795d2b1154 Mon Sep 17 00:00:00 2001 From: Jerry Hu Date: Wed, 29 May 2024 10:02:11 +0800 Subject: [PATCH 1/2] [opt](scan) Use lazy-init for segment iterators and avoid caching all segments in the rowset reader (#35484) ## Proposed changes pick #35432 ## Further comments If this is a relatively large or complex change, kick off the discussion at [dev@doris.apache.org](mailto:dev@doris.apache.org) by explaining why you chose the solution you did and what alternatives you considered, etc... From 87d783e69da5b9c312500e3435c1e9f4f046a2e7 Mon Sep 17 00:00:00 2001 From: felixwluo Date: Wed, 26 Aug 2026 01:22:03 +0800 Subject: [PATCH 2/2] [fix](cloud) Skip empty partition meta RPCs in cloud restore --- .../doris/cloud/backup/CloudRestoreJob.java | 10 ++++++- .../cloud/backup/CloudRestoreJobTest.java | 27 ++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) 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 33b66648b4fcb0..e94fc91affb88e 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 @@ -241,10 +241,13 @@ public void doCreateReplicas() { } // set storage vault for new restoring table if (((CloudEnv) Env.getCurrentEnv()).getEnableStorageVault()) { + if (Strings.isNullOrEmpty(storageVaultId)) { + storageVaultId = Env.getCurrentEnv().getStorageVaultMgr().getVaultIdByName(storageVaultName); + } for (Table table : restoredTbls) { if (table.getType() == TableIf.TableType.OLAP) { OlapTable olapTable = (OlapTable) table; - if (olapTable.getStorageVaultId().isEmpty() && storageVaultId != null) { + if (olapTable.getStorageVaultId().isEmpty()) { olapTable.setStorageVaultId(storageVaultId); } } @@ -494,6 +497,11 @@ private void handleMetaObject(MetaSeriviceOperation operation) throws DdlExcepti private void handleOlapTableMeta(MetaSeriviceOperation operation, OlapTable olapTable, Collection partitions) throws DdlException { + if (partitions.isEmpty()) { + LOG.info("cloud restore job skip {} partitions, dbId: {}, tableName: {}, vault name: {}", + operation, dbId, olapTable.getName(), storageVaultName); + return; + } List partitionIds = new ArrayList<>(); switch (operation) { case PREPARE: { diff --git a/fe/fe-core/src/test/java/org/apache/doris/cloud/backup/CloudRestoreJobTest.java b/fe/fe-core/src/test/java/org/apache/doris/cloud/backup/CloudRestoreJobTest.java index d384a8c1bfaff3..ee966df076a1b1 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/cloud/backup/CloudRestoreJobTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/cloud/backup/CloudRestoreJobTest.java @@ -112,6 +112,7 @@ public void setUp() throws Exception { Assert.assertTrue(cloudSystemInfoService instanceof CloudSystemInfoService); Mockito.when(storageVaultMgr.getVaultNameById(Mockito.anyString())).thenReturn("test_vault"); + Mockito.when(storageVaultMgr.getVaultIdByName("test_vault")).thenReturn("test_vault_id"); mockMetaServiceProxyInstance = Mockito.mock(MetaServiceProxy.class); mockedMetaServiceProxy = Mockito.mockStatic(MetaServiceProxy.class); @@ -256,5 +257,29 @@ public void testCreateReplicas() throws UserException { Assert.assertTrue(job.getStatus().ok()); } -} + @Test + public void testSkipCloudMetaServiceForEmptyRestorePartitions() throws Exception { + Map properties = Maps.newHashMap(); + properties.put("storage_vault_id", ""); + expectedRestoreTbl.setTableProperty(new TableProperty(properties)); + Partition partition = expectedRestoreTbl.getPartition(CatalogTestUtil.testPartition1); + expectedRestoreTbl.getPartitionInfo().setIsInMemory(partition.getId(), false); + expectedRestoreTbl.dropPartitionAndReserveTablet(partition.getName()); + Deencapsulation.setField(job, "restoredTbls", Lists.newArrayList(expectedRestoreTbl)); + + job.doCreateReplicas(); + Assert.assertTrue(job.getStatus().ok()); + Assert.assertEquals("test_vault_id", expectedRestoreTbl.getStorageVaultId()); + job.waitingAllReplicasCreated(); + Assert.assertTrue(job.getStatus().ok()); + + job.cleanMetaObjects(false); + Assert.assertTrue(job.getStatus().ok()); + + Mockito.verify(mockMetaServiceProxyInstance, Mockito.never()).preparePartition(Mockito.any()); + Mockito.verify(mockMetaServiceProxyInstance, Mockito.never()).commitPartition(Mockito.any()); + Mockito.verify(mockMetaServiceProxyInstance, Mockito.never()).dropPartition(Mockito.any()); + } + +}