XenAPI: Fix race-condition with cached images.
The core problem is that XenServer's `VDI.copy` call drops the destination file directly into the SR. This means that half-completed files are visible with no way to distinguish these from fully-copied files. We had some code that attempted to mitigate this issue by checking physical_utilisation against an expected value. The problem with this code is that it didn't account for VDI chaining where the physical_utilisation would not necessarily match the parent. The net effect of this was that 'cloned' VDIs would never be found because their physical_utilisation was far below what was expected. The work around is to create our own `_safe_copy_vdi` which is isolated and atomic. Long term, `VDI.copy` should be fixed so that half-completed files are never stored in the SR. Change-Id: I6eb3cb5259f9ee1c7394e58f76105a8b39bfc720
This commit is contained in:
@@ -288,6 +288,15 @@ class XenAPIVMTestCase(stubs.XenAPITestBase):
|
|||||||
self.stubs.Set(vmops.VMOps, 'inject_instance_metadata',
|
self.stubs.Set(vmops.VMOps, 'inject_instance_metadata',
|
||||||
fake_inject_instance_metadata)
|
fake_inject_instance_metadata)
|
||||||
|
|
||||||
|
def fake_safe_copy_vdi(session, sr_ref, instance, vdi_to_copy_ref):
|
||||||
|
name_label = "fakenamelabel"
|
||||||
|
disk_type = "fakedisktype"
|
||||||
|
virtual_size = 777
|
||||||
|
return vm_utils.create_vdi(
|
||||||
|
session, sr_ref, instance, name_label, disk_type,
|
||||||
|
virtual_size)
|
||||||
|
self.stubs.Set(vm_utils, '_safe_copy_vdi', fake_safe_copy_vdi)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
super(XenAPIVMTestCase, self).tearDown()
|
super(XenAPIVMTestCase, self).tearDown()
|
||||||
fake_image.FakeImageService_reset()
|
fake_image.FakeImageService_reset()
|
||||||
|
|||||||
Reference in New Issue
Block a user