From 8615234c0fa331852a11e1bf595bf1d4b858f4bc Mon Sep 17 00:00:00 2001 From: Jonathan Brassow Date: Fri, 9 Aug 2013 17:09:47 -0500 Subject: [PATCH] RAID: Fix bug making lvchange unable to change recovery rate for RAID 1) Since the min|maxrecoveryrate args are size_kb_ARGs and they are recorded (and sent to the kernel) in terms of kB/sec/disk, we must back out the factor multiple done by size_kb_arg. This is already performed by 'lvcreate' for these arguments. 2) Allow all RAID types, not just RAID1, to change these values. 3) Add min|maxrecoveryrate_ARG to the list of 'update_partial_unsafe' commands so that lvchange will not complain about needing at least one of a certain set of arguments and failing. 4) Add tests that check that these values can be set via lvchange and lvcreate and that 'lvs' reports back the proper results. --- WHATS_NEW | 1 + test/shell/lvchange-raid.sh | 17 +++++++++++++++++ test/shell/lvcreate-raid.sh | 23 +++++++++++++++++++++++ test/shell/lvcreate-raid10.sh | 9 +++++++++ tools/lvchange.c | 4 +++- 5 files changed, 53 insertions(+), 1 deletion(-) diff --git a/WHATS_NEW b/WHATS_NEW index d2830ee42..6b6528123 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.100 - ================================ + Fix bug making lvchange unable to change recovery rate for RAID. Prohibit convertion of thin pool to external origin. Workaround gcc v4.8 -O2 bug causing failures if config/checks=1 (32bit arch). Verify clvmd message validity before processing and log error if incorrect. diff --git a/test/shell/lvchange-raid.sh b/test/shell/lvchange-raid.sh index 2e6231287..715df1505 100644 --- a/test/shell/lvchange-raid.sh +++ b/test/shell/lvchange-raid.sh @@ -214,6 +214,19 @@ run_refresh_check() { lvs --noheadings -o lv_attr $1/$2 | grep '.*-.$' } +# run_recovery_rate_check +# Assumes "$dev2" is in the array +run_recovery_rate_check() { + printf "#\n#\n#\n# %s/%s (%s): run_recovery_rate_check\n#\n#\n#\n" \ + $1 $2 `lvs --noheadings -o segtype $1/$2` + + lvchange --minrecoveryrate 50 $1/$2 + lvchange --maxrecoveryrate 100 $1/$2 + + [ `lvs --noheadings -o raid_min_recovery_rate $1/$2` == "50" ] + [ `lvs --noheadings -o raid_max_recovery_rate $1/$2` == "100" ] +} + # run_checks [snapshot_dev] run_checks() { # Without snapshots @@ -223,6 +236,8 @@ run_checks() { run_refresh_check $1 $2 + run_recovery_rate_check $1 $2 + # With snapshots if [ ! -z $3 ]; then lvcreate -s $1/$2 -l 4 -n snap $3 @@ -233,6 +248,8 @@ run_checks() { run_refresh_check $1 $2 + run_recovery_rate_check $1 $2 + lvremove -ff $1/snap fi } diff --git a/test/shell/lvcreate-raid.sh b/test/shell/lvcreate-raid.sh index 634c5186d..ee56b9c4b 100644 --- a/test/shell/lvcreate-raid.sh +++ b/test/shell/lvcreate-raid.sh @@ -38,6 +38,15 @@ lvcreate --type raid1 -m 2 -l 2 -n $lv1 $vg aux wait_for_sync $vg $lv1 lvremove -ff $vg +# Create RAID1 (explicit 3-way) - Set min/max recovery rate +lvcreate --type raid1 -m 2 -l 2 \ + --minrecoveryrate 50 --maxrecoveryrate 100 \ + -n $lv1 $vg +[ `lvs --noheadings -o raid_min_recovery_rate $vg/$lv1` -eq 50 ] +[ `lvs --noheadings -o raid_max_recovery_rate $vg/$lv1` -eq 100 ] +aux wait_for_sync $vg $lv1 +lvremove -ff $vg + # Create RAID 4/5/6 (explicit 3-stripe + parity devs) for i in raid4 \ raid5 raid5_ls raid5_la raid5_rs raid5_ra \ @@ -47,3 +56,17 @@ for i in raid4 \ aux wait_for_sync $vg $lv1 lvremove -ff $vg done + +# Create RAID 4/5/6 (explicit 3-stripe + parity devs) - Set min/max recovery +for i in raid4 \ + raid5 raid5_ls raid5_la raid5_rs raid5_ra \ + raid6 raid6_zr raid6_nr raid6_nc; do + + lvcreate --type $i -l 3 -i 3 \ + --minrecoveryrate 50 --maxrecoveryrate 100 \ + -n $lv1 $vg + [ `lvs --noheadings -o raid_min_recovery_rate $vg/$lv1` -eq 50 ] + [ `lvs --noheadings -o raid_max_recovery_rate $vg/$lv1` -eq 100 ] + aux wait_for_sync $vg $lv1 + lvremove -ff $vg +done diff --git a/test/shell/lvcreate-raid10.sh b/test/shell/lvcreate-raid10.sh index 830b390ac..933097abf 100644 --- a/test/shell/lvcreate-raid10.sh +++ b/test/shell/lvcreate-raid10.sh @@ -30,6 +30,15 @@ not lvcreate --type raid10 -m 2 -i 2 -l 2 -n $lv1 $vg # 2-way mirror, 2-stripes lvcreate --type raid10 -m 1 -i 2 -l 2 -n $lv1 $vg aux wait_for_sync $vg $lv1 +lvremove -ff $vg/$lv1 + +# 2-way mirror, 2-stripes - Set min/max recovery rate +lvcreate --type raid10 -m 1 -i 2 -l 2 \ + --minrecoveryrate 50 --maxrecoveryrate 100 \ + -n $lv1 $vg +[ `lvs --noheadings -o raid_min_recovery_rate $vg/$lv1` -eq 50 ] +[ `lvs --noheadings -o raid_max_recovery_rate $vg/$lv1` -eq 100 ] +aux wait_for_sync $vg $lv1 # 2-way mirror, 3-stripes lvcreate --type raid10 -m 1 -i 3 -l 3 -n $lv2 $vg diff --git a/tools/lvchange.c b/tools/lvchange.c index 3ba78e6ea..49734067e 100644 --- a/tools/lvchange.c +++ b/tools/lvchange.c @@ -1143,9 +1143,11 @@ int lvchange(struct cmd_context *cmd, int argc, char **argv) arg_count(cmd, detachprofile_ARG) || arg_count(cmd, setactivationskip_ARG); int update_partial_unsafe = - arg_count(cmd, resync_ARG) || arg_count(cmd, alloc_ARG) || arg_count(cmd, discards_ARG) || + arg_count(cmd, resync_ARG) || + arg_count(cmd, raidminrecoveryrate_ARG) || + arg_count(cmd, raidmaxrecoveryrate_ARG) || arg_count(cmd, syncaction_ARG) || arg_count(cmd, writebehind_ARG) || arg_count(cmd, writemostly_ARG) ||