Skip to content

Commit 6ca6aa1

Browse files
authored
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
1 parent 131ea9f commit 6ca6aa1

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed

plugins/backup/nas/src/main/java/org/apache/cloudstack/backup/NASBackupProvider.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
5757
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
5858
import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
59+
import org.apache.commons.collections.CollectionUtils;
5960
import org.apache.logging.log4j.Logger;
6061
import org.apache.logging.log4j.LogManager;
6162

@@ -471,6 +472,9 @@ public boolean deleteBackup(Backup backup, boolean forced) {
471472
} else {
472473
host = resourceManager.findOneRandomRunningHostByHypervisor(Hypervisor.HypervisorType.KVM, backup.getZoneId());
473474
}
475+
if (host == null) {
476+
throw new CloudRuntimeException(String.format("Unable to find a running KVM host in zone %d to delete backup %s", backup.getZoneId(), backup.getUuid()));
477+
}
474478

475479
DeleteBackupCommand command = new DeleteBackupCommand(backup.getExternalId(), backupRepository.getType(),
476480
backupRepository.getAddress(), backupRepository.getMountOptions());
@@ -552,7 +556,14 @@ public Pair<Long, Long> getBackupStorageStats(Long zoneId) {
552556
@Override
553557
public void syncBackupStorageStats(Long zoneId) {
554558
final List<BackupRepository> repositories = backupRepositoryDao.listByZoneAndProvider(zoneId, getName());
559+
if (CollectionUtils.isEmpty(repositories)) {
560+
return;
561+
}
555562
final Host host = resourceManager.findOneRandomRunningHostByHypervisor(Hypervisor.HypervisorType.KVM, zoneId);
563+
if (host == null) {
564+
logger.warn("Unable to find a running KVM host in zone {} to sync backup storage stats", zoneId);
565+
return;
566+
}
556567
for (final BackupRepository repository : repositories) {
557568
GetBackupStorageStatsCommand command = new GetBackupStorageStatsCommand(repository.getType(), repository.getAddress(), repository.getMountOptions());
558569
BackupStorageStatsAnswer answer;

0 commit comments

Comments
 (0)