mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
lvmdbusd: Add support for LVM writecache
This commit is contained in:
parent
e12bdd591a
commit
8f1068c02d
@ -453,6 +453,15 @@ def lv_cache_lv(cache_pool_full_name, lv_full_name, cache_options):
|
||||
return call(cmd)
|
||||
|
||||
|
||||
def lv_writecache_lv(cache_lv_full_name, lv_full_name, cache_options):
|
||||
# lvconvert --type writecache --cachevol VG/CacheLV VG/OriginLV
|
||||
cmd = ['lvconvert']
|
||||
cmd.extend(options_to_cli_args(cache_options))
|
||||
cmd.extend(['-y', '--type', 'writecache', '--cachevol',
|
||||
cache_lv_full_name, lv_full_name])
|
||||
return call(cmd)
|
||||
|
||||
|
||||
def lv_detach_cache(lv_full_name, detach_options, destroy_cache):
|
||||
cmd = ['lvconvert']
|
||||
if destroy_cache:
|
||||
|
@ -743,6 +743,49 @@ class Lv(LvCommon):
|
||||
cb, cbe, return_tuple=False)
|
||||
cfg.worker_q.put(r)
|
||||
|
||||
@staticmethod
|
||||
def _writecache_lv(lv_uuid, lv_name, lv_object_path, cache_options):
|
||||
# Make sure we have a dbus object representing it
|
||||
dbo = LvCommon.validate_dbus_object(lv_uuid, lv_name)
|
||||
|
||||
# Make sure we have dbus object representing lv to cache
|
||||
lv_to_cache = cfg.om.get_object_by_path(lv_object_path)
|
||||
|
||||
if lv_to_cache:
|
||||
fcn = lv_to_cache.lv_full_name()
|
||||
rc, out, err = cmdhandler.lv_writecache_lv(
|
||||
dbo.lv_full_name(), fcn, cache_options)
|
||||
if rc == 0:
|
||||
# When we cache an LV, the cache pool and the lv that is getting
|
||||
# cached need to be removed from the object manager and
|
||||
# re-created as their interfaces have changed!
|
||||
mt_remove_dbus_objects((dbo, lv_to_cache))
|
||||
cfg.load()
|
||||
|
||||
lv_converted = cfg.om.get_object_path_by_lvm_id(fcn)
|
||||
else:
|
||||
raise dbus.exceptions.DBusException(
|
||||
LV_INTERFACE,
|
||||
'Exit code %s, stderr = %s' % (str(rc), err))
|
||||
else:
|
||||
raise dbus.exceptions.DBusException(
|
||||
LV_INTERFACE, 'LV to cache with object path %s not present!' %
|
||||
lv_object_path)
|
||||
return lv_converted
|
||||
|
||||
@dbus.service.method(
|
||||
dbus_interface=LV_INTERFACE,
|
||||
in_signature='oia{sv}',
|
||||
out_signature='(oo)',
|
||||
async_callbacks=('cb', 'cbe'))
|
||||
def WriteCacheLv(self, lv_object, tmo, cache_options, cb, cbe):
|
||||
r = RequestEntry(
|
||||
tmo, Lv._writecache_lv,
|
||||
(self.Uuid, self.lvm_id, lv_object,
|
||||
cache_options), cb, cbe)
|
||||
cfg.worker_q.put(r)
|
||||
|
||||
|
||||
# noinspection PyPep8Naming
|
||||
@utils.dbus_property(VDO_POOL_INTERFACE, 'OperatingMode', 's')
|
||||
@utils.dbus_property(VDO_POOL_INTERFACE, 'CompressionState', 's')
|
||||
|
@ -1558,6 +1558,36 @@ class TestDbusService(unittest.TestCase):
|
||||
cached_lv.Lv.Rename(dbus.String(new_name), dbus.Int32(g_tmo), EOD))
|
||||
verify_cache_lv_count()
|
||||
|
||||
def test_writecache_lv(self):
|
||||
vg = self._vg_create().Vg
|
||||
data_lv = self._create_lv(size=mib(16), vg=vg)
|
||||
cache_lv = self._create_lv(size=mib(16), vg=vg)
|
||||
|
||||
# both LVs need to be inactive
|
||||
self.handle_return(data_lv.Lv.Deactivate(
|
||||
dbus.UInt64(0), dbus.Int32(g_tmo), EOD))
|
||||
data_lv.update()
|
||||
self.handle_return(cache_lv.Lv.Deactivate(
|
||||
dbus.UInt64(0), dbus.Int32(g_tmo), EOD))
|
||||
cache_lv.update()
|
||||
|
||||
cached_lv_path = self.handle_return(
|
||||
cache_lv.Lv.WriteCacheLv(
|
||||
dbus.ObjectPath(data_lv.object_path),
|
||||
dbus.Int32(g_tmo),
|
||||
EOD))
|
||||
|
||||
intf = (LV_COMMON_INT, LV_INT, CACHE_LV_INT)
|
||||
cached_lv = ClientProxy(self.bus, cached_lv_path, interfaces=intf)
|
||||
self.assertEqual(cached_lv.LvCommon.SegType, ["writecache"])
|
||||
|
||||
uncached_lv_path = self.handle_return(
|
||||
cached_lv.CachedLv.DetachCachePool(
|
||||
dbus.Boolean(True),
|
||||
dbus.Int32(g_tmo),
|
||||
EOD))
|
||||
self.assertTrue('/com/redhat/lvmdbus1/Lv' in uncached_lv_path)
|
||||
|
||||
def test_vg_change(self):
|
||||
vg_proxy = self._vg_create()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user