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()); + } + +}