[lvm-devel] [PATCH 1/2] lvmdbusd: Add support for LVM writecache
Tony Asleson
tasleson at redhat.com
Thu Aug 6 20:46:54 UTC 2020
Reviewed, tested, and committed upstream.
Thanks Vojtech!
-Tony
On 7/1/20 6:27 AM, Vojtech Trefny wrote:
> ---
> daemons/lvmdbusd/cmdhandler.py | 9 +++++++
> daemons/lvmdbusd/lv.py | 43 ++++++++++++++++++++++++++++++++++
> test/dbus/lvmdbustest.py | 30 ++++++++++++++++++++++++
> 3 files changed, 82 insertions(+)
>
> diff --git a/daemons/lvmdbusd/cmdhandler.py b/daemons/lvmdbusd/cmdhandler.py
> index 7d2f4c4ba..1c15b7888 100644
> --- a/daemons/lvmdbusd/cmdhandler.py
> +++ b/daemons/lvmdbusd/cmdhandler.py
> @@ -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:
> diff --git a/daemons/lvmdbusd/lv.py b/daemons/lvmdbusd/lv.py
> index fd46f348b..f21a332a3 100644
> --- a/daemons/lvmdbusd/lv.py
> +++ b/daemons/lvmdbusd/lv.py
> @@ -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')
> diff --git a/test/dbus/lvmdbustest.py b/test/dbus/lvmdbustest.py
> index 8753e65d0..efa1afb26 100755
> --- a/test/dbus/lvmdbustest.py
> +++ b/test/dbus/lvmdbustest.py
> @@ -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()
>
>
More information about the lvm-devel
mailing list