mirror of
git://sourceware.org/git/lvm2.git
synced 2025-03-11 20:58:50 +03:00
lvcreate: reject '--nosync' option for RAID6 LVs
The MD raid6 personality being used to drive lvm raid6 LVs does read-modify-write updates to any stripes and thus relies on correct P and Q Syndromes being written during initial synchronization or it may fail reconstructing proper user data in case of SubLVs failing. We may not allow the '--nosync' option on creation of raid6 LVs for that reason. Update/fix 'man lvcreate' in that regard. add lvcreate-raid-nosync.sh test script. - Resolves rhbz1358532
This commit is contained in:
parent
57fa5d4329
commit
7d6cf12554
@ -381,10 +381,11 @@ would result in a mirror with two-sides; that is,
|
|||||||
a linear volume plus one copy.
|
a linear volume plus one copy.
|
||||||
|
|
||||||
Specifying the optional argument \fB\-\-nosync\fP will cause the creation
|
Specifying the optional argument \fB\-\-nosync\fP will cause the creation
|
||||||
of the mirror to skip the initial resynchronization. Any data written
|
of the mirror LV to skip the initial resynchronization. Any data written
|
||||||
afterwards will be mirrored, but the original contents will not be
|
afterwards will be mirrored, but the original contents will not be copied.
|
||||||
copied. This is useful for skipping a potentially long and resource
|
|
||||||
intensive initial sync of an empty device.
|
This is useful for skipping a potentially long and resource intensive initial
|
||||||
|
sync of an empty mirrored RaidLV.
|
||||||
|
|
||||||
There are two implementations of mirroring which can be used and correspond
|
There are two implementations of mirroring which can be used and correspond
|
||||||
to the "\fIraid1\fP" and "\fImirror\fP" segment types.
|
to the "\fIraid1\fP" and "\fImirror\fP" segment types.
|
||||||
@ -440,7 +441,21 @@ Without this option a default name of "lvol#" will be generated where
|
|||||||
.HP
|
.HP
|
||||||
.BR \-\-nosync
|
.BR \-\-nosync
|
||||||
.br
|
.br
|
||||||
Causes the creation of the mirror to skip the initial resynchronization.
|
Causes the creation of mirror, raid1, raid4, raid5 and raid10 to skip the
|
||||||
|
initial resynchronization. In case of mirror, raid1 and raid10, any data
|
||||||
|
written afterwards will be mirrored, but the original contents will not be
|
||||||
|
copied. In case of raid4 and raid5, no parity blocks will be written,
|
||||||
|
though any data written afterwards will cause parity blocks to be stored.
|
||||||
|
.br
|
||||||
|
This is useful for skipping a potentially long and resource intensive initial
|
||||||
|
sync of an empty mirror/raid1/raid4/raid5 and raid10 LV.
|
||||||
|
.br
|
||||||
|
This option is not valid for raid6, because raid6 relies on proper parity
|
||||||
|
(P and Q Syndromes) being created during initial synchronization in order
|
||||||
|
to reconstruct proper user date in case of device failures.
|
||||||
|
|
||||||
|
raid0 and raid0_meta don't provide any data copies or parity support
|
||||||
|
and thus don't support initial resynchronization.
|
||||||
.
|
.
|
||||||
.HP
|
.HP
|
||||||
.BR \-\-noudevsync
|
.BR \-\-noudevsync
|
||||||
@ -621,12 +636,14 @@ to the command.
|
|||||||
.br
|
.br
|
||||||
Note the current limitation of 8 stripes total in any RaidLV including parity devices.
|
Note the current limitation of 8 stripes total in any RaidLV including parity devices.
|
||||||
|
|
||||||
|
See the \fB\-\-nosync\fP option to optionally avoid initial syncrhonization of RaidLVs.
|
||||||
|
|
||||||
Two implementations of basic striping are available in the kernel.
|
Two implementations of basic striping are available in the kernel.
|
||||||
The original device-mapper implementation is the default and should
|
The original device-mapper implementation is the default and should
|
||||||
normally be used. The alternative implementation using MD, available
|
normally be used. The alternative implementation using MD, available
|
||||||
since version 1.7 of the RAID device-mapper kernel target (kernel
|
since version 1.7 of the RAID device-mapper kernel target (kernel
|
||||||
version 4.2) is provided to facilitate the development of new RAID
|
version 4.2) is provided to facilitate the development of new RAID
|
||||||
features. It may be accessed with \fB--type raid0\fP, but is best
|
features. It may be accessed with \fB--type raid0[_meta]\fP, but is best
|
||||||
avoided at present because of assorted restrictions on resizing and converting
|
avoided at present because of assorted restrictions on resizing and converting
|
||||||
such devices.
|
such devices.
|
||||||
.HP
|
.HP
|
||||||
|
85
test/shell/lvcreate-raid-nosync.sh
Normal file
85
test/shell/lvcreate-raid-nosync.sh
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Copyright (C) 2016 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
SKIP_WITH_LVMLOCKD=1
|
||||||
|
SKIP_WITH_LVMPOLLD=1
|
||||||
|
|
||||||
|
. lib/inittest
|
||||||
|
|
||||||
|
aux have_raid 1 7 0 || skip
|
||||||
|
|
||||||
|
aux prepare_vg 6
|
||||||
|
|
||||||
|
|
||||||
|
# Delay 1st leg so that rebuilding status characters
|
||||||
|
# can be read before resync finished too quick.
|
||||||
|
aux delay_dev "$dev1" 0 1
|
||||||
|
|
||||||
|
# raid0/raid0_meta don't support resynchronization
|
||||||
|
for r in raid0 raid0_meta
|
||||||
|
do
|
||||||
|
lvcreate --yes --type raid0 -i 3 -l 1 -n $lv1 $vg
|
||||||
|
aux check_status_chars $vg $lv1 "AAA"
|
||||||
|
lvremove --yes $vg/$lv1
|
||||||
|
done
|
||||||
|
|
||||||
|
# raid1 supports resynchronization
|
||||||
|
lvcreate --yes --type raid1 -m 2 -l 1 -n $lv1 $vg
|
||||||
|
aux check_status_chars $vg $lv1 "aaa"
|
||||||
|
aux wait_for_sync $vg $lv1
|
||||||
|
aux check_status_chars $vg $lv1 "AAA"
|
||||||
|
lvremove --yes $vg/$lv1
|
||||||
|
|
||||||
|
# raid1 supports --nosync
|
||||||
|
lvcreate --yes --type raid1 --nosync -m 2 -l 1 -n $lv1 $vg
|
||||||
|
aux check_status_chars $vg $lv1 "AAA"
|
||||||
|
lvremove --yes $vg/$lv1
|
||||||
|
|
||||||
|
for r in raid4 raid5
|
||||||
|
do
|
||||||
|
# raid4/5 support resynchronization
|
||||||
|
lvcreate --yes --type $r -i 3 -l 1 -n $lv1 $vg
|
||||||
|
aux check_status_chars $vg $lv1 "aaaa"
|
||||||
|
aux wait_for_sync $vg $lv1
|
||||||
|
aux check_status_chars $vg $lv1 "AAAA"
|
||||||
|
lvremove --yes $vg/$lv1
|
||||||
|
|
||||||
|
# raid4/5 support --nosync
|
||||||
|
lvcreate --yes --type $r --nosync -i 3 -l 1 -n $lv1 $vg
|
||||||
|
aux check_status_chars $vg $lv1 "AAAA"
|
||||||
|
lvremove --yes $vg/$lv1
|
||||||
|
done
|
||||||
|
|
||||||
|
# raid6 supports resynchronization
|
||||||
|
lvcreate --yes --type raid6 -i 3 -l 1 -n $lv1 $vg
|
||||||
|
aux check_status_chars $vg $lv1 "aaaaa"
|
||||||
|
aux wait_for_sync $vg $lv1
|
||||||
|
aux check_status_chars $vg $lv1 "AAAAA"
|
||||||
|
lvremove --yes $vg/$lv1
|
||||||
|
|
||||||
|
# raid6 rejects --nosync; it has to initialize P- and Q-Syndromes
|
||||||
|
not lvcreate --yes --type raid6 --nosync -i 3 -l 1 -n $lv1 $vg
|
||||||
|
|
||||||
|
# raid10 supports resynchronization
|
||||||
|
lvcreate --yes --type raid10 -m 1 -i 3 -l 1 -n $lv1 $vg
|
||||||
|
aux check_status_chars $vg $lv1 "aaaaaa"
|
||||||
|
aux wait_for_sync $vg $lv1
|
||||||
|
aux check_status_chars $vg $lv1 "AAAAAA"
|
||||||
|
aux wait_for_sync $vg $lv1
|
||||||
|
lvremove --yes $vg/$lv1
|
||||||
|
|
||||||
|
# raid10 supports --nosync
|
||||||
|
lvcreate --yes --type raid10 --nosync -m 1 -i 3 -l 1 -n $lv1 $vg
|
||||||
|
aux check_status_chars $vg $lv1 "AAAAAA"
|
||||||
|
aux wait_for_sync $vg $lv1
|
||||||
|
lvremove --yes $vg/$lv1
|
||||||
|
|
||||||
|
vgremove -ff $vg
|
@ -562,7 +562,10 @@ static int _read_mirror_and_raid_params(struct cmd_context *cmd,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
lp->nosync = arg_is_set(cmd, nosync_ARG);
|
if ((lp->nosync = arg_is_set(cmd, nosync_ARG)) && seg_is_any_raid6(lp)) {
|
||||||
|
log_error("nosync option prohibited on RAID6");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(lp->region_size = arg_uint_value(cmd, regionsize_ARG, 0)) &&
|
if (!(lp->region_size = arg_uint_value(cmd, regionsize_ARG, 0)) &&
|
||||||
((lp->region_size = get_default_region_size(cmd)) <= 0)) {
|
((lp->region_size = get_default_region_size(cmd)) <= 0)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user