From: mornfall@sourceware.org <mornfall@sourceware.org>
To: lvm-devel@redhat.com
Subject: LVM2 test/t-lvconvert-repair-policy.sh test/t- ...
Date: 14 Apr 2010 13:51:59 -0000 [thread overview]
Message-ID: <20100414135159.26967.qmail@sourceware.org> (raw)
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: mornfall at sourceware.org 2010-04-14 13:51:59
Modified files:
test : t-lvconvert-repair-policy.sh
t-lvconvert-repair.sh
tools : lvconvert.c
Added files:
test : t-lvconvert-repair-replace.sh
Log message:
Allow incomplete mirror restore in lvconvert --repair upon insufficient space.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/test/t-lvconvert-repair-replace.sh.diff?cvsroot=lvm2&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/test/t-lvconvert-repair-policy.sh.diff?cvsroot=lvm2&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/test/t-lvconvert-repair.sh.diff?cvsroot=lvm2&r1=1.6&r2=1.7
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/lvconvert.c.diff?cvsroot=lvm2&r1=1.127&r2=1.128
/cvs/lvm2/LVM2/test/t-lvconvert-repair-replace.sh,v --> standard output
revision 1.1
--- LVM2/test/t-lvconvert-repair-replace.sh
+++ - 2010-04-14 13:51:59.339011000 +0000
@@ -0,0 +1,61 @@
+#!/bin/bash
+# Copyright (C) 2008 Red Hat, Inc. All rights reserved.
+#
+# This copyrighted material is made available to anyone wishing to use,
+# modify, copy, or redistribute it subject to the terms and conditions
+# of the GNU General Public License v.2.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+. ./test-utils.sh
+
+prepare_vg 6
+
+# multiple failures, full replace
+lvcreate --mirrorlog disk -m 2 --ig -L 1 -n 3way $vg $dev1 $dev2 $dev3 $dev4:0-1
+disable_dev $dev1 $dev2
+echo y | lvconvert --repair $vg/3way 2>&1 | tee 3way.out
+lvs -a -o +devices | not grep unknown
+not grep "WARNING: Failed" 3way.out
+vgreduce --removemissing $vg
+check mirror $vg 3way
+enable_dev $dev1 $dev2
+
+vgremove -ff $vg; vgcreate -c n $vg $dev1 $dev2 $dev3 $dev4 $dev5
+
+# multiple failures, partial replace
+lvcreate --mirrorlog disk -m 2 --ig -L 1 -n 3way $vg $dev1 $dev2 $dev3 $dev4
+disable_dev $dev1 $dev2
+echo y | lvconvert --repair $vg/3way 2>&1 | tee 3way.out
+grep "WARNING: Failed" 3way.out
+lvs -a -o +devices | not grep unknown
+vgreduce --removemissing $vg
+check mirror $vg 3way
+enable_dev $dev1 $dev2
+lvchange -a n $vg/3way
+
+vgremove -ff $vg; vgcreate -c n $vg $dev1 $dev2 $dev3
+
+lvcreate --mirrorlog disk -m 1 --ig -L 1 -n 2way $vg $dev1 $dev2 $dev3
+disable_dev $dev1
+echo y | lvconvert --repair $vg/2way 2>&1 | tee 2way.out
+grep "WARNING: Failed" 2way.out
+lvs -a -o +devices | not grep unknown
+vgreduce --removemissing $vg
+check mirror $vg 2way
+enable_dev $dev1 $dev2
+lvchange -a n $vg/2way
+
+vgremove -ff $vg; vgcreate -c n $vg $dev1 $dev2 $dev3 $dev4
+
+# Test repair of inactive mirror with log failure
+# Replacement should fail, but covert should succeed (switch to corelog)
+lvcreate -m 2 --ig -l 2 -n mirror2 $vg $dev1 $dev2 $dev3 $dev4:0
+vgchange -a n $vg
+pvremove -ff -y $dev4
+echo 'y' | lvconvert -y --repair $vg/mirror2
+check mirror $vg mirror2
+vgs
+
--- LVM2/test/t-lvconvert-repair-policy.sh 2010/03/31 02:36:03 1.3
+++ LVM2/test/t-lvconvert-repair-policy.sh 2010/04/14 13:51:58 1.4
@@ -25,25 +25,24 @@
}
repair() {
- lvconvert -i 1 --repair --use-policies --config "$1" $vg/mirror
+ lvconvert --repair --use-policies --config "$1" $vg/mirror
}
lvcreate -m 1 -L 1 -n mirror $vg
lvchange -a n $vg/mirror
# Fail a leg of a mirror.
-# Expected result: linear
disable_dev $dev1
lvchange --partial -a y $vg/mirror
repair 'activation { mirror_image_fault_policy = "remove" }'
-lvs | grep -- -wi-a- # non-mirror
+check linear $vg mirror
cleanup $dev1
# Fail a leg of a mirror.
# Expected result: Mirror (leg replaced)
disable_dev $dev1
repair 'activation { mirror_image_fault_policy = "replace" }'
-lvs | grep -- mwi-a- # mirror
+check mirror $vg mirror
lvs | grep mirror_mlog
cleanup $dev1
@@ -51,22 +50,22 @@
# Expected result: Mirror (leg replaced)
disable_dev $dev1
repair 'activation { mirror_device_fault_policy = "replace" }'
-lvs | grep -- mwi-a- # mirror
+check mirror $vg mirror
lvs | grep mirror_mlog
cleanup $dev1
# Fail a leg of a mirror w/ no available spare
-# Expected result: linear
+# Expected result: 2-way with corelog
disable_dev $dev2 $dev4
repair 'activation { mirror_image_fault_policy = "replace" }'
-lvs | grep -- -wi-a-
+check mirror $vg mirror
+lvs | not grep mirror_mlog
cleanup $dev2 $dev4
# Fail the log device of a mirror w/ no available spare
# Expected result: mirror w/ corelog
disable_dev $dev3 $dev4
-repair 'activation { mirror_image_fault_policy = "replace" }'
-lvs
-lvs | grep -- mwi-a-
+lvconvert --repair --use-policies --config 'activation { mirror_image_fault_policy = "replace" }' $vg/mirror
+check mirror $vg mirror
lvs | not grep mirror_mlog
cleanup $dev3 $dev4
--- LVM2/test/t-lvconvert-repair.sh 2010/03/31 02:36:03 1.6
+++ LVM2/test/t-lvconvert-repair.sh 2010/04/14 13:51:58 1.7
@@ -15,26 +15,26 @@
# fail multiple devices
-lvcreate -m 3 --ig -L 1 -n 3way $vg
+lvcreate -m 3 --ig -L 1 -n 4way $vg
disable_dev $dev2 $dev4
-echo n | lvconvert -i 1 --repair $vg/3way
-lvs -a -o +devices > lvlist
-not grep unknown lvlist
+echo n | lvconvert --repair $vg/4way 2>&1 | tee 4way.out
+lvs -a -o +devices | not grep unknown
vgreduce --removemissing $vg
enable_dev $dev2 $dev4
-lvchange -a n $vg/3way
+check mirror $vg 4way
+lvchange -a n $vg/4way
vgremove -ff $vg
vgcreate -c n $vg $dev1 $dev2 $dev3 $dev4
-lvcreate -m 2 --ig -L 1 -n 4way $vg
+lvcreate -m 2 --ig -L 1 -n 3way $vg
disable_dev $dev1 $dev2
-echo n | lvconvert -i 1 --repair $vg/4way
-lvs -a -o +devices > lvlist
-not grep unknown lvlist
+echo n | lvconvert --repair $vg/3way
+lvs -a -o +devices | not grep unknown
vgreduce --removemissing $vg
enable_dev $dev1 $dev2
-lvchange -a n $vg/4way
+check linear $vg 3way
+lvchange -a n $vg/3way
# fail single devices
@@ -49,29 +49,20 @@
lvchange --partial -a y $vg/mirror
not vgreduce -v --removemissing $vg
-lvconvert -y -i 1 --repair $vg/mirror
+lvconvert -y --repair $vg/mirror
vgreduce --removemissing $vg
enable_dev $dev1
vgextend $vg $dev1
disable_dev $dev2
-lvconvert -y -i 1 --repair $vg/mirror
+lvconvert -y --repair $vg/mirror
vgreduce --removemissing $vg
enable_dev $dev2
vgextend $vg $dev2
disable_dev $dev3
-lvconvert -y -i 1 --repair $vg/mirror
+lvconvert -y --repair $vg/mirror
vgreduce --removemissing $vg
enable_dev $dev3
vgextend $vg $dev3
lvremove -ff $vg
-
-# Test repair of inactive mirror with log failure
-# Replacement should fail, but covert should succeed (switch to corelog)
-lvcreate -m 2 --ig -l 2 -n mirror2 $vg $dev1 $dev2 $dev3 $dev4:0
-vgchange -a n $vg
-pvremove -ff -y $dev4
-echo 'y' | lvconvert -y -i 1 --repair $vg/mirror2
-# FIXME: check that mirror ok and log is now 'core'
-vgs
--- LVM2/tools/lvconvert.c 2010/04/13 17:26:03 1.127
+++ LVM2/tools/lvconvert.c 2010/04/14 13:51:58 1.128
@@ -919,24 +919,19 @@
* Add/remove mirror images and adjust log type. 'operable_pvs'
* are the set of PVs open to removal or allocation - depending
* on the operation being performed.
- *
- * If 'allocation_failures_ok' is set, and there is a failure to
- * convert due to space, success will be returned.
*/
static int _lvconvert_mirrors_aux(struct cmd_context *cmd,
struct logical_volume *lv,
struct lvconvert_params *lp,
struct dm_list *operable_pvs,
uint32_t new_mimage_count,
- uint32_t new_log_count,
- int allocation_failures_ok)
+ uint32_t new_log_count)
{
uint32_t region_size;
struct lv_segment *seg;
struct logical_volume *layer_lv;
uint32_t old_mimage_count = lv_mirror_count(lv);
uint32_t old_log_count = _get_log_count(lv);
- int failure_code = (allocation_failures_ok) ? 1 : 0;
if ((lp->mirrors == 1) && !(lv->status & MIRRORED)) {
log_error("Logical volume %s is already not mirrored.",
@@ -968,7 +963,7 @@
lp->stripe_size, region_size, new_log_count, operable_pvs,
lp->alloc, MIRROR_BY_LV)) {
stack;
- return failure_code;
+ return 0;
}
if (lp->wait_completion)
lp->need_polling = 1;
@@ -996,7 +991,7 @@
if (lv_is_origin(lv)) {
log_error("Can't add additional mirror images to "
"mirrors that are under snapshots");
- return failure_code;
+ return 0;
}
/*
@@ -1007,7 +1002,7 @@
if (!_lv_update_log_type(cmd, lp, lv,
operable_pvs, new_log_count)) {
stack;
- return failure_code;
+ return 0;
}
/* Insert a temporary layer for syncing,
@@ -1035,7 +1030,7 @@
return 0;
}
stack;
- return failure_code;
+ return 0;
}
if (seg->log_lv)
lv->status |= CONVERTING;
@@ -1073,7 +1068,7 @@
if (!_lv_update_log_type(cmd, lp, lv,
operable_pvs, new_log_count)) {
stack;
- return failure_code;
+ return 0;
}
}
@@ -1126,7 +1121,7 @@
int failed_mirrors = 0;
int replace_log = 0;
int replace_mirrors = 0;
- uint32_t new_log_count;
+ uint32_t new_log_count, log_count;
struct dm_list *failed_pvs = NULL;
struct logical_volume *log_lv;
@@ -1191,38 +1186,44 @@
return 0;
if (!_lvconvert_mirrors_aux(cmd, lv, lp, failed_pvs,
- lp->mirrors, new_log_count, 0))
+ lp->mirrors, new_log_count))
return 0;
/*
* Second phase - replace faulty devices
- *
- * FIXME: It would be nice to do this all in one step, but
- * for simplicity, we replace mimages first and then
- * work on the log.
*/
- if (replace_mirrors && (old_mimage_count != lp->mirrors)) {
+
+ if (replace_mirrors)
lp->mirrors = old_mimage_count;
- if (!_lvconvert_mirrors_aux(cmd, lv, lp, NULL,
- old_mimage_count, new_log_count, 1))
- return 0;
- }
- log_lv = first_seg(lv)->log_lv;
- if (replace_log && (old_log_count != new_log_count)) {
- /*
- * If we are up-converting the log from linear to
- * mirrored, then we must use '_lvconvert_mirrors_aux'
- */
- if ((new_log_count == 1) && (old_log_count > 1)) {
- if (!_lvconvert_mirrors_aux(cmd, log_lv, lp, NULL,
- old_log_count, 0, 1))
- return 0;
- } else if (!_lv_update_log_type(cmd, lp, lv,
- lp->pvh, new_log_count))
- return 0;
+ log_count = replace_log ? old_log_count : new_log_count;
+
+ while (replace_mirrors || replace_log) {
+ log_warn("Trying to up-convert to %d images, %d logs.", lp->mirrors, log_count);
+ if (_lvconvert_mirrors_aux(cmd, lv, lp, NULL,
+ lp->mirrors, log_count))
+ break;
+ else {
+ if (lp->mirrors > 2)
+ -- lp->mirrors;
+ else if (log_count > 0)
+ -- log_count;
+ else
+ break; /* nowhere to go, anymore... */
+ }
}
+ if (lp->mirrors != old_mimage_count)
+ log_warn("WARNING: Failed to replace %d of %d images in volume %s",
+ old_mimage_count - lp->mirrors, old_mimage_count, lv->name);
+ if (log_count != old_log_count)
+ log_warn("WARNING: Failed to replace %d of %d logs in volume %s",
+ old_log_count - log_count, old_log_count, lv->name);
+
+ /* if (!arg_count(cmd, use_policies_ARG) && (lp->mirrors != old_mimage_count
+ || log_count != old_log_count))
+ return 0; */
+
return 1;
}
@@ -1259,7 +1260,7 @@
old_log_count);
if (!_lvconvert_mirrors_aux(cmd, lv, lp, NULL,
- new_mimage_count, new_log_count, 0))
+ new_mimage_count, new_log_count))
return 0;
if (!lp->need_polling)
reply other threads:[~2010-04-14 13:51 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100414135159.26967.qmail@sourceware.org \
--to=mornfall@sourceware.org \
--cc=lvm-devel@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.