[lvm-devel] master - vdo: enhance vdo pool extension
Zdenek Kabelac
zkabelac at sourceware.org
Tue Sep 22 21:46:49 UTC 2020
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=3a3307c0d8029f545a31d305a23a0dec2ece65f2
Commit: 3a3307c0d8029f545a31d305a23a0dec2ece65f2
Parent: f38b7afd62533041ec68b10349169efb70c37d82
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Tue Sep 22 23:25:58 2020 +0200
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Tue Sep 22 23:28:43 2020 +0200
vdo: enhance vdo pool extension
When user tries to extend vdo pool - he needs to go always
at least by 1 full VDO slab (defined as vdo_slab_size_mb).
To avoid all trouble around find 'workable' size - lvm2 automatically
increases the passed (or by --use-policies calculated) extension size
(and informs a user about sometimes possibly large increase as slab
size can go upto 32GiB)
With VDO users need to always 'think-big' anyway and expect such
operation to be in GiB domain range.
---
WHATS_NEW | 1 +
lib/metadata/lv_manip.c | 21 +++++++++++++++++++++
2 files changed, 22 insertions(+)
diff --git a/WHATS_NEW b/WHATS_NEW
index 4be9b8bad..ad3cbde6a 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.03.11 -
==================================
+ Lvextend of vdo pool volumes ensure at least 1 new VDO slab is added.
Use revert_lv() on reload error path after vg_revert().
Configure --with-integrity enabled.
Restore lost signal blocking while VG lock is held.
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index fc0acd6ee..9f15e9f21 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -5465,6 +5465,27 @@ static int _lvresize_adjust_extents(struct logical_volume *lv,
else
seg_size = lp->extents - existing_extents;
+ if (lv_is_vdo_pool_data(lv)) {
+ if (!(seg = get_only_segment_using_this_lv(lv)))
+ return_0;
+ /* Min growth is defined this way: max(1 slab, 128M + 128K (recovery journal + slab summary)) */
+ new_extents = max(seg->vdo_params.slab_size_mb * 1024, UINT32_C(128 * 1024 + 128));
+ new_extents *= (1024 >> SECTOR_SHIFT); /* minimal growth (~128MiB..32GiB) in sectors */
+
+ if (new_extents > vg->extent_size) {
+ /* Minimal growth in extent size units */
+ new_extents = (new_extents + vg->extent_size - 1) / vg->extent_size;
+
+ if (new_extents > seg_size) {
+ /* Notify user about extra increase of extension */
+ log_print_unless_silent("Increasing incremention size from %s to %s to fit new VDO slab.",
+ display_size(cmd, (uint64_t)seg_size * vg->extent_size),
+ display_size(cmd, (uint64_t)new_extents * vg->extent_size));
+ seg_size = new_extents;
+ }
+ }
+ }
+
/* Convert PEs to LEs */
if (lp->extents_are_pes && !seg_is_striped(seg_last) && !seg_is_virtual(seg_last)) {
area_multiple = _calc_area_multiple(seg_last->segtype, seg_last->area_count, 0);
More information about the lvm-devel
mailing list