This is an automated email from the ASF dual-hosted git repository.
sureshanaparti pushed a commit to branch 4.22
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.22 by this push:
new 6ca6aa1c3f0 Fix NPE in NASBackupProvider when no running KVM host is
available (#12805)
6ca6aa1c3f0 is described below
commit 6ca6aa1c3f012ede9b8342ad07adbb9f14e37f8f
Author: James Peru Mmbono <[email protected]>
AuthorDate: Fri Mar 27 19:02:13 2026 +0300
Fix NPE in NASBackupProvider when no running KVM host is available (#12805)
* Fix NPE in NASBackupProvider when no running KVM host is available
ResourceManager.findOneRandomRunningHostByHypervisor() can return null
when no KVM host in the zone has status=Up (e.g. during management
server startup, brief agent disconnections, or host state transitions).
NASBackupProvider.syncBackupStorageStats() and deleteBackup() call
host.getId() without a null check, causing a NullPointerException that
crashes the entire BackupSyncTask background job every sync interval.
This adds null checks in both methods:
- syncBackupStorageStats: log a warning and return early
- deleteBackup: throw CloudRuntimeException with a descriptive message
---
.../java/org/apache/cloudstack/backup/NASBackupProvider.java | 11 +++++++++++
1 file changed, 11 insertions(+)
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 f2ea8ac71c9..d4068d498d4 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
@@ -56,6 +56,7 @@ import org.apache.cloudstack.framework.config.Configurable;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
+import org.apache.commons.collections.CollectionUtils;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
@@ -471,6 +472,9 @@ public class NASBackupProvider extends AdapterBase
implements BackupProvider, Co
} else {
host =
resourceManager.findOneRandomRunningHostByHypervisor(Hypervisor.HypervisorType.KVM,
backup.getZoneId());
}
+ if (host == null) {
+ throw new CloudRuntimeException(String.format("Unable to find a
running KVM host in zone %d to delete backup %s", backup.getZoneId(),
backup.getUuid()));
+ }
DeleteBackupCommand command = new
DeleteBackupCommand(backup.getExternalId(), backupRepository.getType(),
backupRepository.getAddress(),
backupRepository.getMountOptions());
@@ -552,7 +556,14 @@ public class NASBackupProvider extends AdapterBase
implements BackupProvider, Co
@Override
public void syncBackupStorageStats(Long zoneId) {
final List<BackupRepository> repositories =
backupRepositoryDao.listByZoneAndProvider(zoneId, getName());
+ if (CollectionUtils.isEmpty(repositories)) {
+ return;
+ }
final Host host =
resourceManager.findOneRandomRunningHostByHypervisor(Hypervisor.HypervisorType.KVM,
zoneId);
+ if (host == null) {
+ logger.warn("Unable to find a running KVM host in zone {} to sync
backup storage stats", zoneId);
+ return;
+ }
for (final BackupRepository repository : repositories) {
GetBackupStorageStatsCommand command = new
GetBackupStorageStatsCommand(repository.getType(), repository.getAddress(),
repository.getMountOptions());
BackupStorageStatsAnswer answer;