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',
|
||||
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):
|
||||
super(XenAPIVMTestCase, self).tearDown()
|
||||
fake_image.FakeImageService_reset()
|
||||
|
||||
Reference in New Issue
Block a user