From 65c04464571fe437ee45f8f4cfb68995574f37b8 Mon Sep 17 00:00:00 2001 From: Abhisar Sinha <63767682+abh1sar@users.noreply.github.com> Date: Fri, 23 Oct 2026 09:17:36 +0530 Subject: [PATCH] NAS backup: keep the Failed row when the agent reports a failed backup #13180 made takeBackup keep the backup row in Failed state instead of deleting it. The forward merge of 4.22 after #14305 resolved the failed-answer branch to the 4.22 version, which deletes the row again. Restore the update and return the row to the caller as the Error branch does, so the schedule, name and resource counts are recorded on it. --- .../org/apache/cloudstack/backup/NASBackupProvider.java | 4 ++-- .../apache/cloudstack/backup/NASBackupProviderTest.java | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/backup/nas/src/main/java/org/apache/cloudstack/backup/NASBackupProvider.java b/plugins/backup/nas/src/main/java/org/apache/cloudstack/backup/NASBackupProvider.java index 57244305ebba..e8aebd6c7b52 100644 --- a/plugins/backup/nas/src/main/java/org/apache/cloudstack/backup/NASBackupProvider.java +++ b/plugins/backup/nas/src/main/java/org/apache/cloudstack/backup/NASBackupProvider.java @@ -669,8 +669,8 @@ public Pair takeBackup(final VirtualMachine vm, Boolean quiesce return new Pair<>(false, backupVO); } backupVO.setStatus(Backup.Status.Failed); - backupDao.remove(backupVO.getId()); - return new Pair<>(false, null); + backupDao.update(backupVO.getId(), backupVO); + return new Pair<>(false, backupVO); } } diff --git a/plugins/backup/nas/src/test/java/org/apache/cloudstack/backup/NASBackupProviderTest.java b/plugins/backup/nas/src/test/java/org/apache/cloudstack/backup/NASBackupProviderTest.java index 9e3d7b77c152..1a528889e186 100644 --- a/plugins/backup/nas/src/test/java/org/apache/cloudstack/backup/NASBackupProviderTest.java +++ b/plugins/backup/nas/src/test/java/org/apache/cloudstack/backup/NASBackupProviderTest.java @@ -311,7 +311,7 @@ public void takeBackupFailureNeedingCleanupReturnsErrorBackup() throws AgentUnav } @Test - public void takeBackupFailureWithoutCleanupRemovesBackup() throws AgentUnavailableException, OperationTimedoutException { + public void takeBackupFailureWithoutCleanupKeepsFailedBackup() throws AgentUnavailableException, OperationTimedoutException { VMInstanceVO vm = mockRunningVmForBackup(1L, 2L, 3L, 4L, 5L, 6L); BackupAnswer answer = mock(BackupAnswer.class); @@ -324,8 +324,10 @@ public void takeBackupFailureWithoutCleanupRemovesBackup() throws AgentUnavailab Pair result = nasBackupProvider.takeBackup(vm, false, false); Assert.assertFalse(result.first()); - Assert.assertNull(result.second()); - Mockito.verify(backupDao).remove(Mockito.anyLong()); + Assert.assertNotNull(result.second()); + Assert.assertEquals(Backup.Status.Failed, result.second().getStatus()); + Mockito.verify(backupDao).update(Mockito.anyLong(), Mockito.any(BackupVO.class)); + Mockito.verify(backupDao, Mockito.never()).remove(Mockito.anyLong()); Mockito.verifyNoInteractions(alertManager); }