Skip to content

Commit 4876cc9

Browse files
mprokopchuknvazquez
authored andcommitted
Handle null host in VM restore to prevent NPE on deleted host records
1 parent 32408be commit 4876cc9

2 files changed

Lines changed: 8 additions & 2 deletions

File tree

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9267,9 +9267,14 @@ private void handleManagedStorage(UserVmVO vm, VolumeVO root) {
92679267
Long hostId = vm.getHostId() != null ? vm.getHostId() : vm.getLastHostId();
92689268

92699269
if (hostId != null) {
9270-
VolumeInfo volumeInfo = volFactory.getVolume(root.getId());
92719270
Host host = _hostDao.findByIdIncludingRemoved(hostId);
92729271

9272+
// host row may have been hard-deleted from DB, treat like removed
9273+
if (host == null) {
9274+
s_logger.warn(String.format("Host with id %s not found in DB for VM %s (%s)",
9275+
hostId, vm.getUuid(), vm.getName()));
9276+
return;
9277+
}
92739278
// host could be in removed state, in which case no operation is performed.
92749279
if (host.getStatus() == Status.Removed) {
92759280
logger.warn("Host {} ({}) for VM {} ({}) removed on {}",
@@ -9279,6 +9284,7 @@ private void handleManagedStorage(UserVmVO vm, VolumeVO root) {
92799284

92809285
final Command cmd;
92819286

9287+
VolumeInfo volumeInfo = volFactory.getVolume(root.getId());
92829288
if (host.getHypervisorType() == HypervisorType.XenServer) {
92839289
DiskTO disk = new DiskTO(volumeInfo.getTO(), root.getDeviceId(), root.getPath(), root.getVolumeType());
92849290

server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1720,6 +1720,7 @@ public void testRestoreVirtualMachineWhenHostRemoved() throws ResourceUnavailabl
17201720
when(templateDataStoreDao.findByTemplateZoneReady(1L, 1L)).thenReturn(templateStore);
17211721

17221722
ServiceOfferingVO serviceOffering = mock(ServiceOfferingVO.class);
1723+
when(vm.getServiceOfferingId()).thenReturn(serviceOfferingId);
17231724
when(_serviceOfferingDao.findById(vmId, vm.getServiceOfferingId())).thenReturn(serviceOffering);
17241725

17251726
List<VolumeVO> rootVols = new ArrayList<>();
@@ -1759,7 +1760,6 @@ public void testRestoreVirtualMachineWhenHostRemoved() throws ResourceUnavailabl
17591760
.thenReturn(newVolume);
17601761
when(newVolume.getId()).thenReturn(11L);
17611762
when(newVolume.getState()).thenReturn(Volume.State.Ready);
1762-
when(newVolume.getState()).thenReturn(Volume.State.Ready);
17631763
doReturn(20L * 1024 * 1024 * 1024L).when(userVmManagerImpl).getRootVolumeSizeForVmRestore(
17641764
any(Volume.class), any(VMTemplateVO.class), any(UserVmVO.class),
17651765
any(DiskOffering.class), anyMap(), Mockito.anyBoolean());

0 commit comments

Comments
 (0)