Skip to content

Commit 80435b4

Browse files
James PeruJames Peru
authored andcommitted
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 30e6c22 commit 80435b4

1 file changed

Lines changed: 10 additions & 0 deletions

File tree

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,9 @@ public boolean deleteBackup(Backup backup, boolean forced) {
478478
} else {
479479
host = resourceManager.findOneRandomRunningHostByHypervisor(Hypervisor.HypervisorType.KVM, backup.getZoneId());
480480
}
481+
if (host == null) {
482+
throw new CloudRuntimeException(String.format("Unable to find a running KVM host in zone %d to delete backup %s", backup.getZoneId(), backup.getUuid()));
483+
}
481484

482485
DeleteBackupCommand command = new DeleteBackupCommand(backup.getExternalId(), backupRepository.getType(),
483486
backupRepository.getAddress(), backupRepository.getMountOptions());
@@ -564,7 +567,14 @@ public Pair<Long, Long> getBackupStorageStats(Long zoneId) {
564567
@Override
565568
public void syncBackupStorageStats(Long zoneId) {
566569
final List<BackupRepository> repositories = backupRepositoryDao.listByZoneAndProvider(zoneId, getName());
570+
if (CollectionUtils.isEmpty(repositories)) {
571+
return;
572+
}
567573
final Host host = resourceManager.findOneRandomRunningHostByHypervisor(Hypervisor.HypervisorType.KVM, zoneId);
574+
if (host == null) {
575+
logger.warn("Unable to find a running KVM host in zone {} to sync backup storage stats", zoneId);
576+
return;
577+
}
568578
for (final BackupRepository repository : repositories) {
569579
GetBackupStorageStatsCommand command = new GetBackupStorageStatsCommand(repository.getType(), repository.getAddress(), repository.getMountOptions());
570580
BackupStorageStatsAnswer answer;

0 commit comments

Comments
 (0)