summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-02-23 16:18:38 +0000
committerGerrit Code Review <review@openstack.org>2013-02-23 16:18:38 +0000
commitd2123eebf99092e3cc36a7ebc46b6a632e2742cd (patch)
tree4af606c64c691a636c67d74cff5485ce02612d57
parenta7078ae7b30490a4c46bc213784f46ae5134fedb (diff)
parentfaf8dceb639c1c70ef2b3277cfb0a2e370706f45 (diff)
downloadnova-d2123eebf99092e3cc36a7ebc46b6a632e2742cd.tar.gz
nova-d2123eebf99092e3cc36a7ebc46b6a632e2742cd.tar.xz
nova-d2123eebf99092e3cc36a7ebc46b6a632e2742cd.zip
Merge "Adding ability to specify the libvirt cache mode for disk devices"
-rw-r--r--nova/tests/test_libvirt.py38
-rwxr-xr-xnova/virt/libvirt/driver.py39
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):