Nice analysis.
You're correct that when we shelve an instance, we create a snapshot image, starting in the API:
https://github.com/openstack/nova/blob/b6a245f0425a07be3871a976952646d2bdd44533/nova/compute/api.py#L3244
That snapshot image_id is passed down to the compute service to do the actual snapshot and upload from the virt driver:
https://github.com/openstack/nova/blob/b6a245f0425a07be3871a976952646d2bdd44533/nova/compute/manager.py#L4598
We then store that snapshot image_id in the instance system_metadata for later when it's unshleved:
https://github.com/openstack/nova/blob/b6a245f0425a07be3871a976952646d2bdd44533/nova/compute/manager.py#L4601
When we unshelve, we get that snapshot image from glance:
https://github.com/openstack/nova/blob/b6a245f0425a07be3871a976952646d2bdd44533/nova/conductor/manager.py#L641
We then use that to update the instance.image_ref field to point at the snapshot image:
https://github.com/openstack/nova/blob/b6a245f0425a07be3871a976952646d2bdd44533/nova/compute/manager.py#L4764
It looks like the problem is that we then reset the instance.image_ref to the old image id before we unshelved:
https://github.com/openstack/nova/blob/b6a245f0425a07be3871a976952646d2bdd44533/nova/compute/manager.py#L4796
I have no idea why we do that, and that's probably the bug.
Nice analysis.
You're correct that when we shelve an instance, we create a snapshot image, starting in the API:
https:/ /github. com/openstack/ nova/blob/ b6a245f0425a07b e3871a976952646 d2bdd44533/ nova/compute/ api.py# L3244
That snapshot image_id is passed down to the compute service to do the actual snapshot and upload from the virt driver:
https:/ /github. com/openstack/ nova/blob/ b6a245f0425a07b e3871a976952646 d2bdd44533/ nova/compute/ manager. py#L4598
We then store that snapshot image_id in the instance system_metadata for later when it's unshleved:
https:/ /github. com/openstack/ nova/blob/ b6a245f0425a07b e3871a976952646 d2bdd44533/ nova/compute/ manager. py#L4601
When we unshelve, we get that snapshot image from glance:
https:/ /github. com/openstack/ nova/blob/ b6a245f0425a07b e3871a976952646 d2bdd44533/ nova/conductor/ manager. py#L641
We then use that to update the instance.image_ref field to point at the snapshot image:
https:/ /github. com/openstack/ nova/blob/ b6a245f0425a07b e3871a976952646 d2bdd44533/ nova/compute/ manager. py#L4764
It looks like the problem is that we then reset the instance.image_ref to the old image id before we unshelved:
https:/ /github. com/openstack/ nova/blob/ b6a245f0425a07b e3871a976952646 d2bdd44533/ nova/compute/ manager. py#L4796
I have no idea why we do that, and that's probably the bug.