bhouse-nexthop opened a new issue, #14644:
URL: https://github.com/apache/cloudstack/issues/14644
### problem
`revertSnapshot` fails with a NullPointerException when the snapshot's
volume has been deleted:
```
Cannot invoke "com.cloud.storage.VolumeVO.getState()" because "volume" is
null
at com.cloud.storage.snapshot.SnapshotManagerImpl.revertSnapshot
```
`SnapshotManagerImpl.revertSnapshot` looks the volume up with `findById()`,
which does not return removed volumes, and uses the result without a null
check. Volume snapshots outlive their volume, so any snapshot of a deleted
volume hits this. The caller gets an internal error instead of being told why
the snapshot cannot be reverted.
A few other snapshot APIs have the same gap:
- `copySnapshot` without `sourcezoneid` takes the source zone from the
volume, also looked up with `findById()`. For a snapshot of a deleted volume it
fails with `Cannot invoke "com.cloud.storage.Volume.getDataCenterId()" because
"volume" is null`. The copy itself does not need the volume, and the same copy
works when `sourcezoneid` is passed.
- `createVolume` from a snapshot and `createTemplate` from a snapshot look
the volume up including removed rows, so a deleted volume is fine. They still
NPE when the volume row itself is gone (`parentVolume.getPassphraseId()` in
`VolumeApiServiceImpl.allocVolume`; for `createTemplate`, the template record
is created and the job then fails in
`TemplateManagerImpl.createPrivateTemplate`). A missing row is the case in
#14599.
### versions
4.22, and main.
### The steps to reproduce the bug
1. Create a data volume, attach it to a VM, and take a volume snapshot of it.
2. Detach and delete the volume. The snapshot remains.
3. Call `revertSnapshot id=<snapshot>`. It fails with the NPE above.
4. Call `copySnapshot id=<snapshot> destzoneids=<another zone>` without
`sourcezoneid`. It fails with the `getDataCenterId()` NPE.
For `createVolume snapshotid=` and `createTemplate snapshotid=`, the volume
row has to be missing from the `volumes` table.
### What to do about it?
- `revertSnapshot`: refuse with a clear error when the snapshot's volume no
longer exists.
- `copySnapshot`: when the volume is gone, take the source zone from the
snapshot, which records the zone it was taken in.
- `createVolume` and `createTemplate` from a snapshot: refuse with a clear
error when the volume row is missing, instead of failing with an NPE.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]