diff options
-rw-r--r-- | nova/tests/test_libvirt.py | 38 | ||||
-rwxr-xr-x | nova/virt/libvirt/driver.py | 39 |
2 files changed, 77 insertions, 0 deletions
diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index c9b47437c..cad556851 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -270,6 +270,17 @@ class FakeVolumeDriver(object): return "" +class FakeConfigGuestDisk(object): + def __init__(self, *args, **kwargs): + self.source_type = None + self.driver_cache = None + + +class FakeConfigGuest(object): + def __init__(self, *args, **kwargs): + self.driver_cache = None + + class LibvirtConnTestCase(test.TestCase): def setUp(self): @@ -3571,6 +3582,33 @@ class LibvirtConnTestCase(test.TestCase): self.assertEqual(got_events[0].transition, virtevent.EVENT_LIFECYCLE_STOPPED) + def test_set_cache_mode(self): + self.flags(disk_cachemodes=['file=directsync']) + conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) + fake_conf = FakeConfigGuestDisk() + + fake_conf.source_type = 'file' + conn.set_cache_mode(fake_conf) + self.assertEqual(fake_conf.driver_cache, 'directsync') + + def test_set_cache_mode_invalid_mode(self): + self.flags(disk_cachemodes=['file=FAKE']) + conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) + fake_conf = FakeConfigGuestDisk() + + fake_conf.source_type = 'file' + conn.set_cache_mode(fake_conf) + self.assertEqual(fake_conf.driver_cache, None) + + def test_set_cache_mode_invalid_object(self): + self.flags(disk_cachemodes=['file=directsync']) + conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) + fake_conf = FakeConfigGuest() + + fake_conf.driver_cache = 'fake' + conn.set_cache_mode(fake_conf) + self.assertEqual(fake_conf.driver_cache, 'fake') + class HostStateTestCase(test.TestCase): diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index c726fe847..549647443 100755 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -205,6 +205,10 @@ libvirt_opts = [ cfg.StrOpt('xen_hvmloader_path', default='/usr/lib/xen/boot/hvmloader', help='Location where the Xen hvmloader is kept'), + cfg.ListOpt('disk_cachemodes', + default=[], + help='Specific cachemodes to use for different disk types ' + 'e.g: ["file=directsync","block=none"]'), ] CONF = cfg.CONF @@ -318,6 +322,25 @@ class LibvirtDriver(driver.ComputeDriver): self.image_cache_manager = imagecache.ImageCacheManager() self.image_backend = imagebackend.Backend(CONF.use_cow_images) + self.disk_cachemodes = {} + + self.valid_cachemodes = ["default", + "none", + "writethrough", + "writeback", + "directsync", + "writethrough", + "unsafe", + ] + + for mode_str in CONF.disk_cachemodes: + disk_type, sep, cache_mode = mode_str.partition('=') + if cache_mode not in self.valid_cachemodes: + LOG.warn(_("Invalid cachemode %(cache_mode)s specified " + "for disk type %(disk_type)s.") % locals()) + continue + self.disk_cachemodes[disk_type] = cache_mode + @property def disk_cachemode(self): if self._disk_cachemode is None: @@ -339,6 +362,18 @@ class LibvirtDriver(driver.ComputeDriver): self._host_state = HostState(self) return self._host_state + def set_cache_mode(self, conf): + """Set cache mode on LibvirtConfigGuestDisk object.""" + try: + source_type = conf.source_type + driver_cache = conf.driver_cache + except AttributeError: + return + + cache_mode = self.disk_cachemodes.get(source_type, + driver_cache) + conf.driver_cache = cache_mode + def has_min_version(self, lv_ver=None, hv_ver=None, hv_type=None): def _munge_version(ver): return ver[0] * 1000000 + ver[1] * 1000 + ver[2] @@ -919,6 +954,7 @@ class LibvirtDriver(driver.ComputeDriver): conf = self.volume_driver_method('connect_volume', connection_info, disk_info) + self.set_cache_mode(conf) try: # NOTE(vish): We can always affect config because our @@ -2040,6 +2076,9 @@ class LibvirtDriver(driver.ComputeDriver): 'raw') devices.append(diskconfig) + for d in devices: + self.set_cache_mode(d) + return devices def get_guest_config_sysinfo(self, instance): |