Skip to content

Commit 73db373

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Move file system freeze after end of mirroring"
2 parents bbc3b91 + caf5faf commit 73db373

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

nova/tests/unit/virt/libvirt/test_driver.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19985,9 +19985,10 @@ def _test_live_snapshot(
1998519985
mock.patch('nova.virt.libvirt.utils.get_disk_backing_file'),
1998619986
mock.patch('nova.virt.libvirt.utils.create_cow_image'),
1998719987
mock.patch('nova.virt.libvirt.utils.extract_snapshot'),
19988-
mock.patch.object(drvr, '_set_quiesced')
19988+
mock.patch.object(drvr, '_set_quiesced'),
19989+
mock.patch.object(drvr, '_can_quiesce')
1998919990
) as (mock_define, mock_size, mock_backing, mock_create_cow,
19990-
mock_snapshot, mock_quiesce):
19991+
mock_snapshot, mock_quiesce, mock_can_quiesce):
1999119992

1999219993
xmldoc = "<domain/>"
1999319994
srcfile = "/first/path"
@@ -20002,7 +20003,7 @@ def _test_live_snapshot(
2000220003
guest = libvirt_guest.Guest(mock_dom)
2000320004

2000420005
if not can_quiesce:
20005-
mock_quiesce.side_effect = (
20006+
mock_can_quiesce.side_effect = (
2000620007
exception.InstanceQuiesceNotSupported(
2000720008
instance_id=self.test_instance['id'], reason='test'))
2000820009

@@ -20033,6 +20034,7 @@ def _test_live_snapshot(
2003320034
mock_define.assert_called_once_with(xmldoc)
2003420035
mock_quiesce.assert_any_call(mock.ANY, self.test_instance,
2003520036
mock.ANY, True)
20037+
2003620038
if can_quiesce:
2003720039
mock_quiesce.assert_any_call(mock.ANY, self.test_instance,
2003820040
mock.ANY, False)

nova/virt/libvirt/driver.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3271,14 +3271,15 @@ def _live_snapshot(self, context, instance, guest, disk_path, out_path,
32713271
libvirt_utils.create_cow_image(src_back_path, disk_delta,
32723272
src_disk_size)
32733273

3274-
quiesced = False
32753274
try:
3276-
self._set_quiesced(context, instance, image_meta, True)
3277-
quiesced = True
3275+
self._can_quiesce(instance, image_meta)
32783276
except exception.NovaException as err:
3279-
if self._requires_quiesce(image_meta):
3277+
if image_meta.properties.get('os_require_quiesce', False):
3278+
LOG.error('Quiescing instance failed but image property '
3279+
'"os_require_quiesce" is set: %(reason)s.',
3280+
{'reason': err}, instance=instance)
32803281
raise
3281-
LOG.info('Skipping quiescing instance: %(reason)s.',
3282+
LOG.info('Quiescing instance not available: %(reason)s.',
32823283
{'reason': err}, instance=instance)
32833284

32843285
try:
@@ -3299,12 +3300,24 @@ def _live_snapshot(self, context, instance, guest, disk_path, out_path,
32993300
while not dev.is_job_complete():
33003301
time.sleep(0.5)
33013302

3303+
finally:
3304+
quiesced = False
3305+
try:
3306+
# NOTE: The freeze FS is applied after the end of
3307+
# the mirroring of the disk to minimize the time of
3308+
# the freeze. The mirror between both disks is finished,
3309+
# sync continuously, and stopped after abort_job().
3310+
self.quiesce(context, instance, image_meta)
3311+
quiesced = True
3312+
except exception.NovaException as err:
3313+
LOG.info('Skipping quiescing instance: %(reason)s.',
3314+
{'reason': err}, instance=instance)
3315+
33023316
dev.abort_job()
33033317
nova.privsep.path.chown(disk_delta, uid=os.getuid())
3304-
finally:
33053318
self._host.write_instance_config(xml)
33063319
if quiesced:
3307-
self._set_quiesced(context, instance, image_meta, False)
3320+
self.unquiesce(context, instance, image_meta)
33083321

33093322
# Convert the delta (CoW) image with a backing file to a flat
33103323
# image with no backing file.

0 commit comments

Comments
 (0)