master - tests: fix raid rebuild tests to work with older target versions
by Heinz Mauelshagen
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=cb4892dd6067da...
Commit: cb4892dd6067da84833d261ffc19fba4f7086fb0
Parent: 38a6a39daa2967970da0017ac96e40af1c7fbc7b
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Thu Sep 22 23:18:14 2016 +0200
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Thu Sep 22 23:18:14 2016 +0200
tests: fix raid rebuild tests to work with older target versions
Pre 1.9 dm-raid targets status output was racy, which caused
the device status chars to be unreliable _during_ synchronization.
This shows paritcularly with tiny test devices used.
Enhance lvchange-rebuild-raid.sh to not check status
chars _during_ synchronization. Just check afterwards.
---
WHATS_NEW | 1 +
test/shell/lvchange-rebuild-raid.sh | 42 ++++++++++++++++++++++++----------
2 files changed, 30 insertions(+), 13 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index aedacee..6a178e6 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.166 -
=====================================
+ Fix lvchange-rebuild-raid.sh to cope with older target versions.
Use dm_config_parse_without_dup_node_check() to speedup metadata reading.
Fix lvconvert --repair regression
Fix reported origin lv field for cache volumes. (2.02.133)
diff --git a/test/shell/lvchange-rebuild-raid.sh b/test/shell/lvchange-rebuild-raid.sh
index f15c5ef..40d8bc4 100644
--- a/test/shell/lvchange-rebuild-raid.sh
+++ b/test/shell/lvchange-rebuild-raid.sh
@@ -18,7 +18,7 @@ aux have_raid 1 3 2 || skip
aux prepare_vg 8
-# Delay 1st leg so that rebuilding status characters can be read
+# Delay legs so that rebuilding status characters can be read
for d in $(< DEVICES)
do
aux delay_dev "$d" 0 15 $(get first_extent_sector "$d")
@@ -37,92 +37,108 @@ aux wait_for_sync $vg $lv1
not lvchange --yes --rebuild "$dev1" --rebuild "$dev2" $vg/$lv1
not check raid_leg_status $vg $lv1 "aAaAAAAA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
-# Rebuild 1st and 3nd device from different mirror groups is fine.
+# Rebuild 1st and 3rd device from different mirror groups is fine.
lvchange --yes --rebuild "$dev1" --rebuild "$dev3" $vg/$lv1
-check raid_leg_status $vg $lv1 "aAaAAAAA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "aAaAAAAA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
# Rebuild devices 1, 3, 6 from different mirror groups is fine.
lvchange --yes --rebuild "$dev1" --rebuild "$dev3" --rebuild "$dev6" $vg/$lv1
-check raid_leg_status $vg $lv1 "aAaAAaAA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "aAaAAaAA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
# Rebuild devices 1, 3, 5 and 6 with 5+6 being
# being a whole mirror group needs to be rejected.
not lvchange --yes --rebuild "$dev1" --rebuild "$dev3" --rebuild "$dev6" --rebuild "$dev5" $vg/$lv1
not check raid_leg_status $vg $lv1 "aAaAaaAA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
# Rebuild devices 1, 3, 5 and 7 from different mirror groups is fine.
lvchange --yes --rebuild "$dev1" --rebuild "$dev3" --rebuild "$dev5" --rebuild "$dev7" $vg/$lv1
-check raid_leg_status $vg $lv1 "aAaAaAaA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "aAaAaAaA"
aux wait_for_sync $vg $lv1
# Rebuild devices 2, 4, 6 and 8 from different mirror groups is fine.
lvchange --yes --rebuild "$dev2" --rebuild "$dev4" --rebuild "$dev6" --rebuild "$dev8" $vg/$lv1
-check raid_leg_status $vg $lv1 "AaAaAaAa"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "AaAaAaAa"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
##############################################
# Create an 8-legged raid1 and rebuild selected PVs
lvremove --yes $vg/$lv1
lvcreate --yes --type raid1 -m 7 -l 2 -n $lv1 $vg
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
# Rebuilding all raid1 legs needs to be rejected.
not lvchange --yes --rebuild "$dev1" --rebuild "$dev2" --rebuild "$dev3" --rebuild "$dev4" \
--rebuild "$dev5" --rebuild "$dev6" --rebuild "$dev7" --rebuild "$dev8" $vg/$lv1
not check raid_leg_status $vg $lv1 "aaaaaaaa"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
# Rebuilding all but the raid1 master leg is fine.
lvchange --yes --rebuild "$dev2" --rebuild "$dev3" --rebuild "$dev4" \
--rebuild "$dev5" --rebuild "$dev6" --rebuild "$dev7" --rebuild "$dev8" $vg/$lv1
-check raid_leg_status $vg $lv1 "Aaaaaaaa"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "Aaaaaaaa"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
# Rebuilding the raid1 master leg is fine.
lvchange --yes --rebuild "$dev1" $vg/$lv1
-check raid_leg_status $vg $lv1 "aAAAAAAA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "aAAAAAAA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
# Rebuild legs on devices 2, 4, 6 and 8 is fine.
lvchange --yes --rebuild "$dev2" --rebuild "$dev4" --rebuild "$dev6" --rebuild "$dev8" $vg/$lv1
-check raid_leg_status $vg $lv1 "AaAaAaAa"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "AaAaAaAa"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
##############################################
# Create an 6-legged raid6 and rebuild selected PVs
lvremove --yes $vg/$lv1
lvcreate --yes --type raid6 -i 4 -l 2 -n $lv1 $vg
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAA"
# Rebuilding all raid6 stripes needs to be rejected.
not lvchange --yes --rebuild "$dev1" --rebuild "$dev2" --rebuild "$dev3" \
--rebuild "$dev4" --rebuild "$dev5" --rebuild "$dev6" $vg/$lv1
not check raid_leg_status $vg $lv1 "aaaaaa"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAA"
# Rebuilding more than 2 raid6 stripes needs to be rejected.
not lvchange --yes --rebuild "$dev2" --rebuild "$dev4" --rebuild "$dev6" $vg/$lv1
not check raid_leg_status $vg $lv1 "AaAaAa"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAA"
# Rebuilding any 1 raid6 stripe is fine.
lvchange --yes --rebuild "$dev2" $vg/$lv1
-check raid_leg_status $vg $lv1 "AaAAAA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "AaAAAA"
aux wait_for_sync $vg $lv1
lvchange --yes --rebuild "$dev5" $vg/$lv1
-check raid_leg_status $vg $lv1 "AAAAaA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "AAAAaA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAA"
# Rebuilding any 2 raid6 stripes is fine.
lvchange --yes --rebuild "$dev2" --rebuild "$dev4" $vg/$lv1
-check raid_leg_status $vg $lv1 "AaAaAA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "AaAaAA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAA"
lvchange --yes --rebuild "$dev1" --rebuild "$dev5" $vg/$lv1
-check raid_leg_status $vg $lv1 "aAAAaA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "aAAAaA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAA"
vgremove -ff $vg
7 years, 2 months
master - tests: fix raid rebuild tests to work with older target versions
by Heinz Mauelshagen
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=0cb8f392178eed...
Commit: 0cb8f392178eed9695a57cc7d9c0e684386db445
Parent: 38a6a39daa2967970da0017ac96e40af1c7fbc7b
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Thu Sep 22 23:10:13 2016 +0200
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Thu Sep 22 23:10:13 2016 +0200
tests: fix raid rebuild tests to work with older target versions
Pre 1.9 dm-raid targets status output was racy, which caused
the device status chars to be unreliable _during_ synchronization.
This shows paritcularly with tiny test devices used.
Enhance lvchange-rebuild-raid.sh to not check status
chars _during_ synchronization. Just check afterwards.
---
WHATS_NEW | 1 +
test/shell/lvchange-rebuild-raid.sh | 42 ++++++++++++++++++++++++----------
2 files changed, 30 insertions(+), 13 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index aedacee..6a178e6 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.166 -
=====================================
+ Fix lvchange-rebuild-raid.sh to cope with older target versions.
Use dm_config_parse_without_dup_node_check() to speedup metadata reading.
Fix lvconvert --repair regression
Fix reported origin lv field for cache volumes. (2.02.133)
diff --git a/test/shell/lvchange-rebuild-raid.sh b/test/shell/lvchange-rebuild-raid.sh
index f15c5ef..40d8bc4 100644
--- a/test/shell/lvchange-rebuild-raid.sh
+++ b/test/shell/lvchange-rebuild-raid.sh
@@ -18,7 +18,7 @@ aux have_raid 1 3 2 || skip
aux prepare_vg 8
-# Delay 1st leg so that rebuilding status characters can be read
+# Delay legs so that rebuilding status characters can be read
for d in $(< DEVICES)
do
aux delay_dev "$d" 0 15 $(get first_extent_sector "$d")
@@ -37,92 +37,108 @@ aux wait_for_sync $vg $lv1
not lvchange --yes --rebuild "$dev1" --rebuild "$dev2" $vg/$lv1
not check raid_leg_status $vg $lv1 "aAaAAAAA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
-# Rebuild 1st and 3nd device from different mirror groups is fine.
+# Rebuild 1st and 3rd device from different mirror groups is fine.
lvchange --yes --rebuild "$dev1" --rebuild "$dev3" $vg/$lv1
-check raid_leg_status $vg $lv1 "aAaAAAAA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "aAaAAAAA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
# Rebuild devices 1, 3, 6 from different mirror groups is fine.
lvchange --yes --rebuild "$dev1" --rebuild "$dev3" --rebuild "$dev6" $vg/$lv1
-check raid_leg_status $vg $lv1 "aAaAAaAA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "aAaAAaAA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
# Rebuild devices 1, 3, 5 and 6 with 5+6 being
# being a whole mirror group needs to be rejected.
not lvchange --yes --rebuild "$dev1" --rebuild "$dev3" --rebuild "$dev6" --rebuild "$dev5" $vg/$lv1
not check raid_leg_status $vg $lv1 "aAaAaaAA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
# Rebuild devices 1, 3, 5 and 7 from different mirror groups is fine.
lvchange --yes --rebuild "$dev1" --rebuild "$dev3" --rebuild "$dev5" --rebuild "$dev7" $vg/$lv1
-check raid_leg_status $vg $lv1 "aAaAaAaA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "aAaAaAaA"
aux wait_for_sync $vg $lv1
# Rebuild devices 2, 4, 6 and 8 from different mirror groups is fine.
lvchange --yes --rebuild "$dev2" --rebuild "$dev4" --rebuild "$dev6" --rebuild "$dev8" $vg/$lv1
-check raid_leg_status $vg $lv1 "AaAaAaAa"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "AaAaAaAa"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
##############################################
# Create an 8-legged raid1 and rebuild selected PVs
lvremove --yes $vg/$lv1
lvcreate --yes --type raid1 -m 7 -l 2 -n $lv1 $vg
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
# Rebuilding all raid1 legs needs to be rejected.
not lvchange --yes --rebuild "$dev1" --rebuild "$dev2" --rebuild "$dev3" --rebuild "$dev4" \
--rebuild "$dev5" --rebuild "$dev6" --rebuild "$dev7" --rebuild "$dev8" $vg/$lv1
not check raid_leg_status $vg $lv1 "aaaaaaaa"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
# Rebuilding all but the raid1 master leg is fine.
lvchange --yes --rebuild "$dev2" --rebuild "$dev3" --rebuild "$dev4" \
--rebuild "$dev5" --rebuild "$dev6" --rebuild "$dev7" --rebuild "$dev8" $vg/$lv1
-check raid_leg_status $vg $lv1 "Aaaaaaaa"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "Aaaaaaaa"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
# Rebuilding the raid1 master leg is fine.
lvchange --yes --rebuild "$dev1" $vg/$lv1
-check raid_leg_status $vg $lv1 "aAAAAAAA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "aAAAAAAA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
# Rebuild legs on devices 2, 4, 6 and 8 is fine.
lvchange --yes --rebuild "$dev2" --rebuild "$dev4" --rebuild "$dev6" --rebuild "$dev8" $vg/$lv1
-check raid_leg_status $vg $lv1 "AaAaAaAa"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "AaAaAaAa"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAAAA"
##############################################
# Create an 6-legged raid6 and rebuild selected PVs
lvremove --yes $vg/$lv1
lvcreate --yes --type raid6 -i 4 -l 2 -n $lv1 $vg
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAA"
# Rebuilding all raid6 stripes needs to be rejected.
not lvchange --yes --rebuild "$dev1" --rebuild "$dev2" --rebuild "$dev3" \
--rebuild "$dev4" --rebuild "$dev5" --rebuild "$dev6" $vg/$lv1
not check raid_leg_status $vg $lv1 "aaaaaa"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAA"
# Rebuilding more than 2 raid6 stripes needs to be rejected.
not lvchange --yes --rebuild "$dev2" --rebuild "$dev4" --rebuild "$dev6" $vg/$lv1
not check raid_leg_status $vg $lv1 "AaAaAa"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAA"
# Rebuilding any 1 raid6 stripe is fine.
lvchange --yes --rebuild "$dev2" $vg/$lv1
-check raid_leg_status $vg $lv1 "AaAAAA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "AaAAAA"
aux wait_for_sync $vg $lv1
lvchange --yes --rebuild "$dev5" $vg/$lv1
-check raid_leg_status $vg $lv1 "AAAAaA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "AAAAaA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAA"
# Rebuilding any 2 raid6 stripes is fine.
lvchange --yes --rebuild "$dev2" --rebuild "$dev4" $vg/$lv1
-check raid_leg_status $vg $lv1 "AaAaAA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "AaAaAA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAA"
lvchange --yes --rebuild "$dev1" --rebuild "$dev5" $vg/$lv1
-check raid_leg_status $vg $lv1 "aAAAaA"
+aux have_raid 1 8 && check raid_leg_status $vg $lv1 "aAAAaA"
aux wait_for_sync $vg $lv1
+check raid_leg_status $vg $lv1 "AAAAAA"
vgremove -ff $vg
7 years, 2 months
master - tests: fix raid repair tests to work with older target versions
by Heinz Mauelshagen
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=5282450520c40a...
Commit: 5282450520c40a8d2431ab60ccc80dcaffc9c05d
Parent: 38a6a39daa2967970da0017ac96e40af1c7fbc7b
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Thu Sep 22 17:28:20 2016 +0200
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Thu Sep 22 17:28:20 2016 +0200
tests: fix raid repair tests to work with older target versions
Pre 1.8 dm-raid targets status output was racy, which caused
the device status chars to be unreliable _during_ synchronization.
This shows paritcularly with tiny test devices used.
Enhance lvconvert-repair-raid.sh to not check status
chars _during_ synchronization. Just check afterwards.
---
WHATS_NEW | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index aedacee..e22e606 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.166 -
=====================================
+ Fix lvconvert-repair-raid.sh to cope with older target versions.
Use dm_config_parse_without_dup_node_check() to speedup metadata reading.
Fix lvconvert --repair regression
Fix reported origin lv field for cache volumes. (2.02.133)
7 years, 2 months
master - tests: raid repair needs devices in-sync
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=38a6a39daa2967...
Commit: 38a6a39daa2967970da0017ac96e40af1c7fbc7b
Parent: eb6b2a11e3548f7598c726787494be2c3ea4dca1
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Sep 22 15:46:18 2016 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Sep 22 15:46:18 2016 +0200
tests: raid repair needs devices in-sync
Though I'm not quite sure why we push this limit on user,
current --repair logic requires user to wait outside of command.
TODO: I'm not quite sure this repair logic is 'the most wanted'.
---
test/shell/lvconvert-cache-raid.sh | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/test/shell/lvconvert-cache-raid.sh b/test/shell/lvconvert-cache-raid.sh
index ebb9f79..3807493 100644
--- a/test/shell/lvconvert-cache-raid.sh
+++ b/test/shell/lvconvert-cache-raid.sh
@@ -60,7 +60,10 @@ lvconvert --yes --type cache-pool --poolmetadata $vg/cpool_meta $vg/cpool
lvcreate -n corigin --type cache --cachepool $vg/cpool -l 10
lvchange --syncaction repair $vg/cpool_cmeta
+aux wait_for_sync $vg cpool_cmeta
+
lvchange --syncaction repair $vg/cpool_cdata
+aux wait_for_sync $vg cpool_cdata
lvconvert --repair -y $vg/cpool_cmeta
lvconvert --repair -y $vg/cpool_cdata
7 years, 2 months
master - tests: check for TRIM support
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=eb6b2a11e3548f...
Commit: eb6b2a11e3548f7598c726787494be2c3ea4dca1
Parent: f1cad4c7103ac0edc0b724217b50d062326deb43
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Sep 22 15:37:52 2016 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Sep 22 15:37:52 2016 +0200
tests: check for TRIM support
passdown can really work only on discardable device.
Skip 'status' test when PV does no support discard.
---
test/shell/lvchange-thin.sh | 23 +++++++++++++++--------
1 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/test/shell/lvchange-thin.sh b/test/shell/lvchange-thin.sh
index f943401..b5a6a86 100644
--- a/test/shell/lvchange-thin.sh
+++ b/test/shell/lvchange-thin.sh
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2013 Red Hat, Inc. All rights reserved.
+# Copyright (C) 2013-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
@@ -25,24 +25,31 @@ vgcreate -s 128k $vg2 "$dev3"
lvcreate -L10M -T $vg/pool
+# When PV does not support discard
+# tests for checking thin-pool discard passdown are skipped
+pvmajor=$(get pv_field "$dev1" major)
+pvminor=$(get pv_field "$dev1" minor)
+test "$(< /sys/dev/block/$pvmajor\:$pvminor/queue/discard_granularity)" -ne "0" || \
+ no_discard=1
+
#
# Check change operations on a thin-pool without any thin LV
#
# discards_ARG (default is passdown)
-check grep_dmsetup status $vg-pool " discard_passdown" || {
+test -n "$no_discard" || check grep_dmsetup status $vg-pool " discard_passdown" || {
# trace device layout
grep -r "" /sys/block/*
die "Device was expected to support passdown"
}
-lvchange -vvvv --discards nopassdown $vg/pool
+lvchange --discards nopassdown $vg/pool
check grep_dmsetup table $vg-pool " no_discard_passdown"
-check grep_dmsetup status $vg-pool " no_discard_passdown"
+test -n "$no_discard" || check grep_dmsetup status $vg-pool " no_discard_passdown"
lvchange --discards passdown $vg/pool
check grep_dmsetup table $vg-pool -v "passdown"
-check grep_dmsetup status $vg-pool " discard_passdown"
-
+test -n "$no_discard" || check grep_dmsetup status $vg-pool " discard_passdown"
+exit
# zero_ARG (default is 'yes')
check grep_dmsetup table $vg-pool -v "zeroing"
lvchange --zero n $vg/pool
@@ -112,10 +119,10 @@ lvchange --deltag foo $vg/pool
# discards_ARG
lvchange --discards nopassdown $vg/pool
check grep_dmsetup table $vg-pool-tpool " no_discard_passdown"
-check grep_dmsetup status $vg-pool-tpool " no_discard_passdown"
+test -n "$no_discard" || check grep_dmsetup status $vg-pool-tpool " no_discard_passdown"
lvchange --discards passdown $vg/pool
check grep_dmsetup table $vg-pool-tpool -v "passdown"
-check grep_dmsetup status $vg-pool-tpool " discard_passdown"
+test -n "$no_discard" || check grep_dmsetup status $vg-pool-tpool " discard_passdown"
# zero_ARG
lvchange --zero n $vg/pool
7 years, 2 months
master - config: use config_tree_from_string_without_dup_node_check throughout code to construct metadata trees
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=f1cad4c7103ac0...
Commit: f1cad4c7103ac0edc0b724217b50d062326deb43
Parent: 045772aa30ba1c5ab9dff730ce25ca6346c7150a
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Wed Sep 21 14:59:14 2016 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Sep 21 18:18:15 2016 +0200
config: use config_tree_from_string_without_dup_node_check throughout code to construct metadata trees
---
WHATS_NEW | 1 +
daemons/lvmetad/lvmetad-core.c | 2 +-
daemons/lvmlockd/lvmlockd-core.c | 2 +-
lib/cache/lvmcache.c | 2 +-
lib/format_text/export.c | 3 ++-
libdaemon/client/daemon-client.c | 2 +-
libdaemon/server/daemon-server.c | 2 +-
7 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index f7b39b9..aedacee 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.166 -
=====================================
+ Use dm_config_parse_without_dup_node_check() to speedup metadata reading.
Fix lvconvert --repair regression
Fix reported origin lv field for cache volumes. (2.02.133)
Always specify snapshot cow LV for monitoring not internal LV. (2.02.165)
diff --git a/daemons/lvmetad/lvmetad-core.c b/daemons/lvmetad/lvmetad-core.c
index ebaca78..36a5cec 100644
--- a/daemons/lvmetad/lvmetad-core.c
+++ b/daemons/lvmetad/lvmetad-core.c
@@ -599,7 +599,7 @@ static void mark_outdated_pv(lvmetad_state *s, const char *vgid, const char *pvi
outdated_pvs = dm_hash_lookup(s->vgid_to_outdated_pvs, vgid);
if (!outdated_pvs) {
- if (!(outdated_pvs = dm_config_from_string("outdated_pvs/pv_list = []")) ||
+ if (!(outdated_pvs = config_tree_from_string_without_dup_node_check("outdated_pvs/pv_list = []")) ||
!(cft_vgid = make_text_node(outdated_pvs, "vgid", dm_pool_strdup(outdated_pvs->mem, vgid),
outdated_pvs->root, NULL)))
abort();
diff --git a/daemons/lvmlockd/lvmlockd-core.c b/daemons/lvmlockd/lvmlockd-core.c
index 8fcbdec..4d96e67 100644
--- a/daemons/lvmlockd/lvmlockd-core.c
+++ b/daemons/lvmlockd/lvmlockd-core.c
@@ -4431,7 +4431,7 @@ static void client_recv_action(struct client *cl)
return;
}
- req.cft = dm_config_from_string(req.buffer.mem);
+ req.cft = config_tree_from_string_without_dup_node_check(req.buffer.mem);
if (!req.cft) {
log_error("client recv %u config_from_string error", cl->id);
buffer_destroy(&req.buffer);
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index 6ce778d..5e402f0 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -1275,7 +1275,7 @@ struct volume_group *lvmcache_get_vg(struct cmd_context *cmd, const char *vgname
/* Build config tree from vgmetadata, if not yet cached */
if (!vginfo->cft &&
!(vginfo->cft =
- dm_config_from_string(vginfo->vgmetadata)))
+ config_tree_from_string_without_dup_node_check(vginfo->vgmetadata)))
goto_bad;
if (!(vg = import_vg_from_config_tree(vginfo->cft, fid)))
diff --git a/lib/format_text/export.c b/lib/format_text/export.c
index 810c932..1ecc362 100644
--- a/lib/format_text/export.c
+++ b/lib/format_text/export.c
@@ -22,6 +22,7 @@
#include "text_export.h"
#include "lvm-version.h"
#include "toolcontext.h"
+#include "config-util.h"
#include <stdarg.h>
#include <time.h>
@@ -1077,7 +1078,7 @@ struct dm_config_tree *export_vg_to_config_tree(struct volume_group *vg)
return_NULL;
}
- if (!(vg_cft = dm_config_from_string(buf))) {
+ if (!(vg_cft = config_tree_from_string_without_dup_node_check(buf))) {
log_error("Error parsing metadata for VG %s.", vg->name);
dm_free(buf);
return_NULL;
diff --git a/libdaemon/client/daemon-client.c b/libdaemon/client/daemon-client.c
index 413d757..5ce1fc0 100644
--- a/libdaemon/client/daemon-client.c
+++ b/libdaemon/client/daemon-client.c
@@ -120,7 +120,7 @@ daemon_reply daemon_send(daemon_handle h, daemon_request rq)
reply.error = errno;
if (buffer_read(h.socket_fd, &reply.buffer)) {
- reply.cft = dm_config_from_string(reply.buffer.mem);
+ reply.cft = config_tree_from_string_without_dup_node_check(reply.buffer.mem);
if (!reply.cft)
reply.error = EPROTO;
} else
diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c
index 0e37dfb..6af6de9 100644
--- a/libdaemon/server/daemon-server.c
+++ b/libdaemon/server/daemon-server.c
@@ -444,7 +444,7 @@ static void *_client_thread(void *state)
if (!buffer_read(ts->client.socket_fd, &req.buffer))
goto fail;
- req.cft = dm_config_from_string(req.buffer.mem);
+ req.cft = config_tree_from_string_without_dup_node_check(req.buffer.mem);
if (!req.cft)
fprintf(stderr, "error parsing request:\n %s\n", req.buffer.mem);
7 years, 2 months
master - config: add config_tree_from_string_without_dup_node_check to replace dm_config_from_string where needed
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=045772aa30ba1c...
Commit: 045772aa30ba1c5ab9dff730ce25ca6346c7150a
Parent: e40fbd08c8e3da43d07aabe58bd5549105056908
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Wed Sep 21 14:42:16 2016 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Sep 21 18:18:15 2016 +0200
config: add config_tree_from_string_without_dup_node_check to replace dm_config_from_string where needed
---
libdaemon/client/config-util.c | 15 +++++++++++++++
libdaemon/client/config-util.h | 2 ++
2 files changed, 17 insertions(+), 0 deletions(-)
diff --git a/libdaemon/client/config-util.c b/libdaemon/client/config-util.c
index e262182..93f3d0a 100644
--- a/libdaemon/client/config-util.c
+++ b/libdaemon/client/config-util.c
@@ -161,6 +161,21 @@ void chain_node(struct dm_config_node *cn,
}
+struct dm_config_tree *config_tree_from_string_without_dup_node_check(const char *config_settings)
+{
+ struct dm_config_tree *cft;
+
+ if (!(cft = dm_config_create()))
+ return_NULL;
+
+ if (!dm_config_parse_without_dup_node_check(cft, config_settings, config_settings + strlen(config_settings))) {
+ dm_config_destroy(cft);
+ return_NULL;
+ }
+
+ return cft;
+}
+
struct dm_config_node *make_config_node(struct dm_config_tree *cft,
const char *key,
struct dm_config_node *parent,
diff --git a/libdaemon/client/config-util.h b/libdaemon/client/config-util.h
index 38f36af..485161f 100644
--- a/libdaemon/client/config-util.h
+++ b/libdaemon/client/config-util.h
@@ -66,4 +66,6 @@ struct dm_config_node *config_make_nodes(struct dm_config_tree *cft,
struct dm_config_node *pre_sib,
...);
+struct dm_config_tree *config_tree_from_string_without_dup_node_check(const char *config_settings);
+
#endif /* _LVM_DAEMON_CONFIG_UTIL_H */
7 years, 2 months
master - config: parse config tree without dup node checking if it's metadata tree
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=e40fbd08c8e3da...
Commit: e40fbd08c8e3da43d07aabe58bd5549105056908
Parent: 7563e69cf13126af5889de147c092b9d2e490648
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Wed Sep 21 14:27:15 2016 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Sep 21 18:16:05 2016 +0200
config: parse config tree without dup node checking if it's metadata tree
---
lib/config/config.c | 13 +++++++++----
lib/config/config.h | 2 +-
lib/format_text/import.c | 4 ++--
tools/toollib.c | 2 +-
4 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/lib/config/config.c b/lib/config/config.c
index 820a744..6ad04e5 100644
--- a/lib/config/config.c
+++ b/lib/config/config.c
@@ -496,7 +496,7 @@ int override_config_tree_from_profile(struct cmd_context *cmd,
int config_file_read_fd(struct dm_config_tree *cft, struct device *dev,
off_t offset, size_t size, off_t offset2, size_t size2,
checksum_fn_t checksum_fn, uint32_t checksum,
- int checksum_only)
+ int checksum_only, int no_dup_node_check)
{
char *fb, *fe;
int r = 0;
@@ -547,8 +547,13 @@ int config_file_read_fd(struct dm_config_tree *cft, struct device *dev,
if (!checksum_only) {
fe = fb + size + size2;
- if (!dm_config_parse(cft, fb, fe))
- goto_out;
+ if (no_dup_node_check) {
+ if (!dm_config_parse_without_dup_node_check(cft, fb, fe))
+ goto_out;
+ } else {
+ if (!dm_config_parse(cft, fb, fe))
+ goto_out;
+ }
}
r = 1;
@@ -596,7 +601,7 @@ int config_file_read(struct dm_config_tree *cft)
}
r = config_file_read_fd(cft, cf->dev, 0, (size_t) info.st_size, 0, 0,
- (checksum_fn_t) NULL, 0, 0);
+ (checksum_fn_t) NULL, 0, 0, 0);
if (!cf->keep_open) {
if (!dev_close(cf->dev))
diff --git a/lib/config/config.h b/lib/config/config.h
index f0202b6..8a7d6c3 100644
--- a/lib/config/config.h
+++ b/lib/config/config.h
@@ -239,7 +239,7 @@ struct dm_config_tree *config_open(config_source_t source, const char *filename,
int config_file_read_fd(struct dm_config_tree *cft, struct device *dev,
off_t offset, size_t size, off_t offset2, size_t size2,
checksum_fn_t checksum_fn, uint32_t checksum,
- int skip_parse);
+ int skip_parse, int no_dup_node_check);
int config_file_read(struct dm_config_tree *cft);
struct dm_config_tree *config_file_open_and_read(const char *config_file, config_source_t source,
struct cmd_context *cmd);
diff --git a/lib/format_text/import.c b/lib/format_text/import.c
index 629884b..62dee8f 100644
--- a/lib/format_text/import.c
+++ b/lib/format_text/import.c
@@ -56,7 +56,7 @@ int text_vgsummary_import(const struct format_type *fmt,
(dev && !config_file_read_fd(cft, dev, offset, size,
offset2, size2, checksum_fn,
vgsummary->mda_checksum,
- checksum_only))) {
+ checksum_only, 1))) {
log_error("Couldn't read volume group metadata.");
goto out;
}
@@ -130,7 +130,7 @@ struct volume_group *text_vg_import_fd(struct format_instance *fid,
if ((!dev && !config_file_read(cft)) ||
(dev && !config_file_read_fd(cft, dev, offset, size,
offset2, size2, checksum_fn, checksum,
- skip_parse)))
+ skip_parse, 1)))
goto_out;
if (skip_parse) {
diff --git a/tools/toollib.c b/tools/toollib.c
index ec6f2f7..9127d85 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -1386,7 +1386,7 @@ int get_cache_params(struct cmd_context *cmd,
NULL)))
goto_out;
- if (!dm_config_parse(current, str, str + strlen(str)))
+ if (!dm_config_parse_without_dup_node_check(current, str, str + strlen(str)))
goto_out;
}
7 years, 2 months
master - libdm: add dm_config_parse_without_dup_node_check
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=7563e69cf13126...
Commit: 7563e69cf13126af5889de147c092b9d2e490648
Parent: 094488ffab4837fa14069b81a15e0a6bdaca8a73
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Wed Sep 21 14:25:24 2016 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Sep 21 18:15:18 2016 +0200
libdm: add dm_config_parse_without_dup_node_check
Introduce function for config parsing tree without checking
for duplicate nodes.
---
WHATS_NEW_DM | 1 +
libdm/.exported_symbols.DM_1_02_135 | 1 +
libdm/libdevmapper.h | 1 +
libdm/libdm-config.c | 47 +++++++++++++++++++++++------------
4 files changed, 34 insertions(+), 16 deletions(-)
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index edb1e70..7d32dff 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
Version 1.02.135 -
=====================================
+ Introduce new dm_config_parse_without_dup_node_check().
Version 1.02.134 - 7th September 2016
=====================================
diff --git a/libdm/.exported_symbols.DM_1_02_135 b/libdm/.exported_symbols.DM_1_02_135
new file mode 100644
index 0000000..dceeb4e
--- /dev/null
+++ b/libdm/.exported_symbols.DM_1_02_135
@@ -0,0 +1 @@
+dm_config_parse_without_dup_node_check
diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h
index 5790486..97c3e51 100644
--- a/libdm/libdevmapper.h
+++ b/libdm/libdevmapper.h
@@ -3333,6 +3333,7 @@ struct dm_config_tree {
struct dm_config_tree *dm_config_create(void);
struct dm_config_tree *dm_config_from_string(const char *config_settings);
int dm_config_parse(struct dm_config_tree *cft, const char *start, const char *end);
+int dm_config_parse_without_dup_node_check(struct dm_config_tree *cft, const char *start, const char *end);
void *dm_config_get_custom(struct dm_config_tree *cft);
void dm_config_set_custom(struct dm_config_tree *cft, void *custom);
diff --git a/libdm/libdm-config.c b/libdm/libdm-config.c
index dcb7c3f..90e3405 100644
--- a/libdm/libdm-config.c
+++ b/libdm/libdm-config.c
@@ -50,6 +50,7 @@ struct parser {
int line; /* line number we are on */
struct dm_pool *mem;
+ int no_dup_node_check; /* whether to disable dup node checking */
};
struct config_output {
@@ -170,7 +171,7 @@ static struct dm_config_node *_config_reverse(struct dm_config_node *head)
return middle;
}
-int dm_config_parse(struct dm_config_tree *cft, const char *start, const char *end)
+static int _do_dm_config_parse(struct dm_config_tree *cft, const char *start, const char *end, int no_dup_node_check)
{
/* TODO? if (start == end) return 1; */
@@ -183,6 +184,7 @@ int dm_config_parse(struct dm_config_tree *cft, const char *start, const char *e
p->fe = end;
p->tb = p->te = p->fb;
p->line = 1;
+ p->no_dup_node_check = no_dup_node_check;
_get_token(p, TOK_SECTION_E);
if (!(cft->root = _file(p)))
@@ -193,6 +195,16 @@ int dm_config_parse(struct dm_config_tree *cft, const char *start, const char *e
return 1;
}
+int dm_config_parse(struct dm_config_tree *cft, const char *start, const char *end)
+{
+ return _do_dm_config_parse(cft, start, end, 0);
+}
+
+int dm_config_parse_without_dup_node_check(struct dm_config_tree *cft, const char *start, const char *end)
+{
+ return _do_dm_config_parse(cft, start, end, 1);
+}
+
struct dm_config_tree *dm_config_from_string(const char *config_settings)
{
struct dm_config_tree *cft;
@@ -509,7 +521,8 @@ static struct dm_config_node *_make_node(struct dm_pool *mem,
/* when mem is not NULL, we create the path if it doesn't exist yet */
static struct dm_config_node *_find_or_make_node(struct dm_pool *mem,
struct dm_config_node *parent,
- const char *path)
+ const char *path,
+ int no_dup_node_check)
{
const char *e;
struct dm_config_node *cn = parent ? parent->child : NULL;
@@ -526,18 +539,20 @@ static struct dm_config_node *_find_or_make_node(struct dm_pool *mem,
/* hunt for the node */
cn_found = NULL;
- while (cn) {
- if (_tok_match(cn->key, path, e)) {
- /* Inefficient */
- if (!cn_found)
- cn_found = cn;
- else
- log_warn("WARNING: Ignoring duplicate"
- " config node: %s ("
- "seeking %s)", cn->key, path);
- }
+ if (!no_dup_node_check) {
+ while (cn) {
+ if (_tok_match(cn->key, path, e)) {
+ /* Inefficient */
+ if (!cn_found)
+ cn_found = cn;
+ else
+ log_warn("WARNING: Ignoring duplicate"
+ " config node: %s ("
+ "seeking %s)", cn->key, path);
+ }
- cn = cn->sib;
+ cn = cn->sib;
+ }
}
if (!cn_found && mem) {
@@ -588,7 +603,7 @@ static struct dm_config_node *_section(struct parser *p, struct dm_config_node *
return NULL;
}
- if (!(root = _find_or_make_node(p->mem, parent, str)))
+ if (!(root = _find_or_make_node(p->mem, parent, str, p->no_dup_node_check)))
return_NULL;
if (p->t == TOK_SECTION_B) {
@@ -912,7 +927,7 @@ typedef const struct dm_config_node *node_lookup_fn(const void *start, const cha
static const struct dm_config_node *_find_config_node(const void *start, const char *path) {
struct dm_config_node dummy = { .child = (void *) start };
- return _find_or_make_node(NULL, &dummy, path);
+ return _find_or_make_node(NULL, &dummy, path, 0);
}
static const struct dm_config_node *_find_first_config_node(const void *start, const char *path)
@@ -1395,7 +1410,7 @@ static int _override_path(const char *path, struct dm_config_node *node, void *b
struct dm_config_tree *cft = baton;
struct dm_config_node dummy, *target;
dummy.child = cft->root;
- if (!(target = _find_or_make_node(cft->mem, &dummy, path)))
+ if (!(target = _find_or_make_node(cft->mem, &dummy, path, 0)))
return_0;
if (!(target->v = _clone_config_value(cft->mem, node->v)))
return_0;
7 years, 2 months
master - Revert "lvconvert: fix (automatic) raid repair regression"
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=c2f65806f62a49...
Commit: c2f65806f62a49f6f3da59e721f7a1d03326c009
Parent: 094488ffab4837fa14069b81a15e0a6bdaca8a73
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Wed Sep 21 16:05:08 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Wed Sep 21 16:05:08 2016 +0100
Revert "lvconvert: fix (automatic) raid repair regression"
This reverts commit 5d455b28fce16fce20f33279fe3b1b682c57e619.
This change depends on the kernel version, so should detect
this and behave accordingly.
---
WHATS_NEW | 1 -
daemons/dmeventd/plugins/raid/dmeventd_raid.c | 42 ++--------
lib/metadata/lv.c | 6 ++
lib/metadata/raid_manip.c | 2 +-
test/shell/lvconvert-repair-raid.sh | 104 +-----------------------
tools/lvconvert.c | 18 ++++
6 files changed, 39 insertions(+), 134 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index f7b39b9..faddb9f 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,6 +1,5 @@
Version 2.02.166 -
=====================================
- Fix lvconvert --repair regression
Fix reported origin lv field for cache volumes. (2.02.133)
Always specify snapshot cow LV for monitoring not internal LV. (2.02.165)
Fix lvchange --discard|--zero for active thin-pool.
diff --git a/daemons/dmeventd/plugins/raid/dmeventd_raid.c b/daemons/dmeventd/plugins/raid/dmeventd_raid.c
index bec594a..770fbc6 100644
--- a/daemons/dmeventd/plugins/raid/dmeventd_raid.c
+++ b/daemons/dmeventd/plugins/raid/dmeventd_raid.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2016 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2005-2015 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
@@ -13,20 +13,14 @@
*/
#include "lib.h"
-#include "defaults.h"
#include "dmeventd_lvm.h"
#include "libdevmapper-event.h"
-/* Hold enough elements for the mximum number of RAID images */
-#define RAID_DEVS_ELEMS ((DEFAULT_RAID_MAX_IMAGES + 63) / 64)
-
struct dso_state {
struct dm_pool *mem;
char cmd_lvscan[512];
char cmd_lvconvert[512];
- uint64_t raid_devs[RAID_DEVS_ELEMS];
int failed;
- int warned;
};
DM_EVENT_LOG_FN("raid")
@@ -37,39 +31,20 @@ static int _process_raid_event(struct dso_state *state, char *params, const char
{
struct dm_status_raid *status;
const char *d;
- int dead = 0, r = 1;
if (!dm_get_status_raid(state->mem, params, &status)) {
log_error("Failed to process status line for %s.", device);
return 0;
}
- d = status->dev_health;
- while ((d = strchr(d, 'D'))) {
- uint32_t dev = (uint32_t)(d - status->dev_health);
-
- if (!(state->raid_devs[dev / 64] & (1 << (dev % 64))))
- log_error("Device #%u of %s array, %s, has failed.",
- dev, status->raid_type, device);
-
- state->raid_devs[dev / 64] |= (1 << (dev % 64));
- d++;
- dead = 1;
- }
-
- if (dead) {
- if (status->insync_regions < status->total_regions) {
- if (!state->warned)
- log_warn("WARNING: waiting for resynchronization to finish "
- "before initiating repair on RAID device %s", device);
-
- state->warned = 1;
- goto out; /* Not yet done syncing with accessible devices */
- }
-
+ if ((d = strchr(status->dev_health, 'D'))) {
if (state->failed)
goto out; /* already reported */
+ log_error("Device #%d of %s array, %s, has failed.",
+ (int)(d - status->dev_health),
+ status->raid_type, device);
+
state->failed = 1;
if (!dmeventd_lvm2_run_with_lock(state->cmd_lvscan))
log_warn("WARNING: Re-scan of RAID device %s failed.", device);
@@ -77,7 +52,8 @@ static int _process_raid_event(struct dso_state *state, char *params, const char
/* if repair goes OK, report success even if lvscan has failed */
if (!dmeventd_lvm2_run_with_lock(state->cmd_lvconvert)) {
log_info("Repair of RAID device %s failed.", device);
- r = 0;
+ dm_pool_free(state->mem, status);
+ return 0;
}
} else {
state->failed = 0;
@@ -88,7 +64,7 @@ static int _process_raid_event(struct dso_state *state, char *params, const char
out:
dm_pool_free(state->mem, status);
- return r;
+ return 1;
}
void process_event(struct dm_task *dmt,
diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
index 70036f9..03d52ae 100644
--- a/lib/metadata/lv.c
+++ b/lib/metadata/lv.c
@@ -1017,6 +1017,12 @@ int lv_raid_image_in_sync(const struct logical_volume *lv)
return 0;
}
+ if (!lv_raid_percent(raid_seg->lv, &percent))
+ return_0;
+
+ if (percent == DM_PERCENT_100)
+ return 1;
+
/* Find out which sub-LV this is. */
for (s = 0; s < raid_seg->area_count; s++)
if (seg_lv(raid_seg, s) == lv)
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index deb88a2..e5fdf4f 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -3658,7 +3658,7 @@ static int _lv_raid_rebuild_or_replace(struct logical_volume *lv,
return 0;
}
- if (!_raid_in_sync(lv)) {
+ if (!mirror_in_sync() && !_raid_in_sync(lv)) {
log_error("Unable to replace devices in %s/%s while it is"
" not in-sync.", lv->vg->name, lv->name);
return 0;
diff --git a/test/shell/lvconvert-repair-raid.sh b/test/shell/lvconvert-repair-raid.sh
index b51d8fe..1ef91c4 100644
--- a/test/shell/lvconvert-repair-raid.sh
+++ b/test/shell/lvconvert-repair-raid.sh
@@ -22,52 +22,11 @@ aux lvmconf 'allocation/maximise_cling = 0' \
aux prepare_vg 8
-function delay
-{
- for d in $(< DEVICES)
- do
- aux delay_dev "$d" 0 $1 $(get first_extent_sector "$d")
- done
-}
-
# It's possible small raid arrays do have problems with reporting in-sync.
# So try bigger size
-RAID_SIZE=32
-
-# Fast sync and repair afterwards
-delay 0
-
-# RAID1 dual-leg single replace after initial sync
-lvcreate --type raid1 -m 1 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2"
-aux wait_for_sync $vg $lv1
-aux disable_dev "$dev2"
-lvconvert -y --repair $vg/$lv1
-vgreduce --removemissing $vg
-aux enable_dev "$dev2"
-vgextend $vg "$dev2"
-lvremove -ff $vg/$lv1
-
-# Delayed sync to allow for repair during rebuild
-delay 50
-
-# RAID1 triple-leg single replace during initial sync
-lvcreate --type raid1 -m 2 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2" "$dev3"
-aux disable_dev "$dev2" "$dev3"
-not lvconvert -y --repair $vg/$lv1
-aux wait_for_sync $vg $lv1
-lvconvert -y --repair $vg/$lv1
-vgreduce --removemissing $vg
-aux enable_dev "$dev2" "$dev3"
-vgextend $vg "$dev2" "$dev3"
-lvremove -ff $vg/$lv1
-
-
-# Larger RAID size possible for striped RAID
RAID_SIZE=64
-# Fast sync and repair afterwards
-delay 0
-# RAID5 single replace after initial sync
+# RAID5 single replace
lvcreate --type raid5 -i 2 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2" "$dev3"
aux wait_for_sync $vg $lv1
aux disable_dev "$dev3"
@@ -75,69 +34,16 @@ lvconvert -y --repair $vg/$lv1
vgreduce --removemissing $vg
aux enable_dev "$dev3"
vgextend $vg "$dev3"
-lvremove -ff $vg/$lv1
+lvremove -ff $vg
-# Delayed sync to allow for repair during rebuild
-delay 50
-
-# RAID5 single replace during initial sync
-lvcreate --type raid5 -i 2 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2" "$dev3"
-aux disable_dev "$dev3"
-not lvconvert -y --repair $vg/$lv1
-aux wait_for_sync $vg $lv1
-lvconvert -y --repair $vg/$lv1
-vgreduce --removemissing $vg
-aux enable_dev "$dev3"
-vgextend $vg "$dev3"
-lvremove -ff $vg/$lv1
-
-# Fast sync and repair afterwards
-delay 0
-
-# RAID6 double replace after initial sync
+# RAID6 double replace
lvcreate --type raid6 -i 3 -L $RAID_SIZE -n $lv1 $vg \
"$dev1" "$dev2" "$dev3" "$dev4" "$dev5"
aux wait_for_sync $vg $lv1
aux disable_dev "$dev4" "$dev5"
lvconvert -y --repair $vg/$lv1
vgreduce --removemissing $vg
-aux enable_dev "$dev4" "$dev5"
-vgextend $vg "$dev4" "$dev5"
-lvremove -ff $vg/$lv1
-
-# Delayed sync to allow for repair during rebuild
-delay 50
-
-# RAID6 single replace after initial sync
-lvcreate --type raid6 -i 3 -L $RAID_SIZE -n $lv1 $vg \
- "$dev1" "$dev2" "$dev3" "$dev4" "$dev5"
-aux disable_dev "$dev4"
-not lvconvert -y --repair $vg/$lv1
-delay 0 # Fast sync and repair afterwards
-aux disable_dev "$dev4" # Need to disable again after changing delay
-aux wait_for_sync $vg $lv1
-lvconvert -y --repair $vg/$lv1
-vgreduce --removemissing $vg
aux enable_dev "$dev4"
-vgextend $vg "$dev4"
-lvremove -ff $vg/$lv1
-
-# Delayed sync to allow for repair during rebuild
-delay 50
-
-# RAID10 single replace after initial sync
-lvcreate --type raid10 -m 1 -i 2 -L $RAID_SIZE -n $lv1 $vg \
- "$dev1" "$dev2" "$dev3" "$dev4"
-aux disable_dev "$dev4"
-not lvconvert -y --repair $vg/$lv1
-delay 0 # Fast sync and repair afterwards
-aux disable_dev "$dev4" # Need to disable again after changing delay
-aux disable_dev "$dev1"
-aux wait_for_sync $vg $lv1
-lvconvert -y --repair $vg/$lv1
-vgreduce --removemissing $vg
-aux enable_dev "$dev4"
-vgextend $vg "$dev4"
-lvremove -ff $vg/$lv1
-
+aux enable_dev "$dev5"
+vgextend $vg "$dev4" "$dev5"
vgremove -ff $vg
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 3607247..18010d5 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -1973,6 +1973,24 @@ static int _lvconvert_raid(struct logical_volume *lv, struct lvconvert_params *l
return 0;
}
+ if (!lv_raid_percent(lv, &sync_percent)) {
+ log_error("Unable to determine sync status of %s.",
+ display_lvname(lv));
+ return 0;
+ }
+
+ if (sync_percent != DM_PERCENT_100) {
+ log_warn("WARNING: %s is not in-sync.", display_lvname(lv));
+ log_warn("WARNING: Portions of the array may be unrecoverable.");
+
+ /*
+ * The kernel will not allow a device to be replaced
+ * in an array that is not in-sync unless we override
+ * by forcing the array to be considered "in-sync".
+ */
+ init_mirror_in_sync(1);
+ }
+
_lvconvert_raid_repair_ask(cmd, lp, &replace);
if (replace) {
7 years, 2 months