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;

Reply via email to