Fix nits from change Ia7cf4414feb335b3c2e863b4c8b4ff559b275c34

Change-Id: I05f0791d41c65115c9153f301b387dfdf9065007
Implements: blueprint libvirt-file-backed-memory
This commit is contained in:
Zack Cornelius 2018-06-21 17:43:05 -05:00
parent e9683f1432
commit b1fdb2ee0c
3 changed files with 40 additions and 90 deletions

View File

@ -21,9 +21,9 @@ file-backed memory to placement in place of the total system memory capacity.
This allows the node to run more instances than would normally fit This allows the node to run more instances than would normally fit
within system memory. within system memory.
When available in libivrt and qemu, instance memory will be discarded by qemu When available in libvirt and qemu, instance memory will be discarded by qemu
at shutdown by calling madvise(MADV_REMOVE), to avoid flushing any dirty memory at shutdown by calling ``madvise(MADV_REMOVE)``, to avoid flushing any dirty
to the backing store on exit. memory to the backing store on exit.
To enable file-backed memory, follow the steps below: To enable file-backed memory, follow the steps below:
@ -42,12 +42,12 @@ Prerequisites and Limitations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Libvirt Libvirt
File-backed memory requires libvirt version 4.0.0 or newer File-backed memory requires libvirt version 4.0.0 or newer. Discard
Discard capability requires libvirt ersion 4.4.0 or newer capability requires libvirt version 4.4.0 or newer.
Qemu Qemu
File-backed memory requires qemu version 2.6.0 or newer File-backed memory requires qemu version 2.6.0 or newer.Discard capability
Discard capability requires qemu version 2.10.0 or newer requires qemu version 2.10.0 or newer.
Memory overcommit Memory overcommit
File-backed memory is not compatible with memory overcommit. File-backed memory is not compatible with memory overcommit.

View File

@ -236,12 +236,13 @@ class _TestLibvirtLiveMigrateData(object):
supported_perf_events=[], supported_perf_events=[],
serial_listen_addr='127.0.0.1', serial_listen_addr='127.0.0.1',
target_connect_addr='127.0.0.1', target_connect_addr='127.0.0.1',
dst_wants_file_backed_memory=False) dst_wants_file_backed_memory=False,
file_backed_memory_discard=False)
data = lambda x: x['nova_object.data'] data = lambda x: x['nova_object.data']
primitive = data(obj.obj_to_primitive()) primitive = data(obj.obj_to_primitive())
self.assertIn('dst_wants_file_backed_memory', primitive) self.assertIn('file_backed_memory_discard', primitive)
primitive = data(obj.obj_to_primitive(target_version='1.0')) primitive = data(obj.obj_to_primitive(target_version='1.0'))
self.assertNotIn('target_connect_addr', primitive) self.assertNotIn('target_connect_addr', primitive)
self.assertNotIn('supported_perf_events', primitive) self.assertNotIn('supported_perf_events', primitive)

View File

@ -8829,16 +8829,14 @@ class LibvirtConnTestCase(test.NoDBTestCase,
@mock.patch.object(libvirt_driver.LibvirtDriver, @mock.patch.object(libvirt_driver.LibvirtDriver,
'_create_shared_storage_test_file') '_create_shared_storage_test_file')
@mock.patch.object(fakelibvirt.Connection, 'compareCPU') @mock.patch.object(fakelibvirt.Connection, 'compareCPU')
def test_check_can_live_migrate_dest_file_backed_discard( def _test_check_can_live_migrate_dest_file_backed_discard(
self, mock_cpu, mock_test_file, mock_svc, mock_lib_version, self, libvirt_version, qemu_version, mock_cpu, mock_test_file,
mock_version): mock_svc, mock_lib_version, mock_version):
self.flags(file_backed_memory=1024, group='libvirt') self.flags(file_backed_memory=1024, group='libvirt')
mock_lib_version.return_value = versionutils.convert_version_to_int( mock_lib_version.return_value = libvirt_version
libvirt_driver.MIN_LIBVIRT_FILE_BACKED_DISCARD_VERSION) mock_version.return_value = qemu_version
mock_version.return_value = versionutils.convert_version_to_int(
libvirt_driver.MIN_QEMU_FILE_BACKED_DISCARD_VERSION)
instance_ref = objects.Instance(**self.test_instance) instance_ref = objects.Instance(**self.test_instance)
instance_ref.vcpu_model = test_vcpu_model.fake_vcpumodel instance_ref.vcpu_model = test_vcpu_model.fake_vcpumodel
@ -8862,92 +8860,43 @@ class LibvirtConnTestCase(test.NoDBTestCase,
return_value = drvr.check_can_live_migrate_destination(self.context, return_value = drvr.check_can_live_migrate_destination(self.context,
instance_ref, None, compute_info, False) instance_ref, None, compute_info, False)
self.assertTrue(return_value.dst_wants_file_backed_memory) return return_value
self.assertTrue(return_value.file_backed_memory_discard)
@mock.patch.object(fakelibvirt.Connection, 'getVersion') def test_check_can_live_migrate_dest_file_backed_discard(self):
@mock.patch.object(fakelibvirt.Connection, 'getLibVersion') libvirt_version = versionutils.convert_version_to_int(
@mock.patch.object(objects.Service, 'get_by_compute_host') libvirt_driver.MIN_LIBVIRT_FILE_BACKED_DISCARD_VERSION)
@mock.patch.object(libvirt_driver.LibvirtDriver, qemu_version = versionutils.convert_version_to_int(
'_create_shared_storage_test_file') libvirt_driver.MIN_QEMU_FILE_BACKED_DISCARD_VERSION)
@mock.patch.object(fakelibvirt.Connection, 'compareCPU')
def test_check_can_live_migrate_dest_file_backed_discard_bad_libvirt(
self, mock_cpu, mock_test_file, mock_svc, mock_lib_version,
mock_version):
self.flags(file_backed_memory=1024, group='libvirt') data = self._test_check_can_live_migrate_dest_file_backed_discard(
libvirt_version, qemu_version)
mock_lib_version.return_value = versionutils.convert_version_to_int( self.assertTrue(data.dst_wants_file_backed_memory)
self.assertTrue(data.file_backed_memory_discard)
def test_check_can_live_migrate_dest_file_backed_discard_bad_libvirt(self):
libvirt_version = versionutils.convert_version_to_int(
libvirt_driver.MIN_LIBVIRT_FILE_BACKED_DISCARD_VERSION) - 1 libvirt_driver.MIN_LIBVIRT_FILE_BACKED_DISCARD_VERSION) - 1
mock_version.return_value = versionutils.convert_version_to_int( qemu_version = versionutils.convert_version_to_int(
libvirt_driver.MIN_QEMU_FILE_BACKED_DISCARD_VERSION) libvirt_driver.MIN_QEMU_FILE_BACKED_DISCARD_VERSION)
instance_ref = objects.Instance(**self.test_instance) data = self._test_check_can_live_migrate_dest_file_backed_discard(
instance_ref.vcpu_model = test_vcpu_model.fake_vcpumodel libvirt_version, qemu_version)
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) self.assertTrue(data.dst_wants_file_backed_memory)
compute_info = {'disk_available_least': 400, self.assertFalse(data.file_backed_memory_discard)
'cpu_info': 'asdf',
}
filename = "file" def test_check_can_live_migrate_dest_file_backed_discard_bad_qemu(self):
libvirt_version = versionutils.convert_version_to_int(
svc = objects.Service()
svc.version = 32
mock_svc.return_value = svc
# _check_cpu_match
mock_cpu.return_value = 1
# mounted_on_same_shared_storage
mock_test_file.return_value = filename
# No need for the src_compute_info
return_value = drvr.check_can_live_migrate_destination(self.context,
instance_ref, None, compute_info, False)
self.assertTrue(return_value.dst_wants_file_backed_memory)
self.assertFalse(return_value.file_backed_memory_discard)
@mock.patch.object(fakelibvirt.Connection, 'getVersion')
@mock.patch.object(fakelibvirt.Connection, 'getLibVersion')
@mock.patch.object(objects.Service, 'get_by_compute_host')
@mock.patch.object(libvirt_driver.LibvirtDriver,
'_create_shared_storage_test_file')
@mock.patch.object(fakelibvirt.Connection, 'compareCPU')
def test_check_can_live_migrate_dest_file_backed_discard_bad_qemu(
self, mock_cpu, mock_test_file, mock_svc, mock_lib_version,
mock_version):
self.flags(file_backed_memory=1024, group='libvirt')
mock_lib_version.return_value = versionutils.convert_version_to_int(
libvirt_driver.MIN_LIBVIRT_FILE_BACKED_DISCARD_VERSION) libvirt_driver.MIN_LIBVIRT_FILE_BACKED_DISCARD_VERSION)
mock_version.return_value = versionutils.convert_version_to_int( qemu_version = versionutils.convert_version_to_int(
libvirt_driver.MIN_QEMU_FILE_BACKED_DISCARD_VERSION) - 1 libvirt_driver.MIN_QEMU_FILE_BACKED_DISCARD_VERSION) - 1
instance_ref = objects.Instance(**self.test_instance) data = self._test_check_can_live_migrate_dest_file_backed_discard(
instance_ref.vcpu_model = test_vcpu_model.fake_vcpumodel libvirt_version, qemu_version)
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) self.assertTrue(data.dst_wants_file_backed_memory)
compute_info = {'disk_available_least': 400, self.assertFalse(data.file_backed_memory_discard)
'cpu_info': 'asdf',
}
filename = "file"
svc = objects.Service()
svc.version = 32
mock_svc.return_value = svc
# _check_cpu_match
mock_cpu.return_value = 1
# mounted_on_same_shared_storage
mock_test_file.return_value = filename
# No need for the src_compute_info
return_value = drvr.check_can_live_migrate_destination(self.context,
instance_ref, None, compute_info, False)
self.assertTrue(return_value.dst_wants_file_backed_memory)
self.assertFalse(return_value.file_backed_memory_discard)
@mock.patch.object(objects.Service, 'get_by_compute_host') @mock.patch.object(objects.Service, 'get_by_compute_host')
@mock.patch.object(fakelibvirt.Connection, 'compareCPU') @mock.patch.object(fakelibvirt.Connection, 'compareCPU')