[Ovirt-devel] [PATCH][node REPOST] Improve performance of multipath translations
Mike Burns
mburns at redhat.com
Wed Mar 17 19:53:31 UTC 2010
Cleanup the translations of /dev/sdX to /dev/mapper and
vice-versa.
Signed-off-by: Mike Burns <mburns at redhat.com>
---
scripts/ovirt-config-storage | 59 +++++++++++++++++++++++++----------------
scripts/ovirt-functions | 22 +++++++++++++++
2 files changed, 58 insertions(+), 23 deletions(-)
diff --git a/scripts/ovirt-config-storage b/scripts/ovirt-config-storage
index 6525847..539f58c 100755
--- a/scripts/ovirt-config-storage
+++ b/scripts/ovirt-config-storage
@@ -38,13 +38,12 @@ swap_min_size=5
get_sd_name() {
local id=$1
local device_var=$2
- for device in $(ls /sys/block)
- do
- if [[ $id = $(cat /sys/block/$device/dev) ]]; then
- eval $device_var=$device
- return
- fi
- done
+ local device_sys=$(grep -H "^$id$" /sys/block/*/dev | cut -d: -f1)
+
+ if [ -n "$device_sys" ]; then
+ eval $device_var=$(basename $(dirname $device_sys))
+ return
+ fi
eval $device_var=1
}
@@ -83,10 +82,23 @@ translate_multipath_device() {
local dev=$1
local mpath_var=$2
+ if [ -z "$dev" ]; then
+ if [ -n "$mpath_var" ]; then
+ eval $mpath_var=
+ fi
+ return
+ fi
+ if [[ "$dev" =~ "/dev/mapper" ]]; then
+ eval $mpath_var=$dev
+ return
+ fi
+
local basedev=$(basename $dev)
- local mpath_device=$(multipath -ll $dev |grep -n . | \
- grep "^1:" |awk '{print $1}' | sed 's/^1:/\/dev\/mapper\//g')
+ local dm_dev=/dev/$(multipath -ll $dev | egrep dm-[0-9]+ | sed -r 's/^.& (dm-[0-9]+) .*$/\1/')
+
+ local mpath_device=
+ get_dm_device $dm_dev $mpath_device
if [ -z "$mpath_device" ]; then
mpath_device=$dev
@@ -152,12 +164,12 @@ check_partition_sizes()
printf "\n"
if [ "$OVIRT_ISCSI_ENABLED" == "y" ]; then
- get_drive_size $BOOTDRIVE BOOTDRIVESPACE
+ get_drive_size "$BOOTDRIVE" BOOTDRIVESPACE
drive_list="BOOT"
BOOT_NEED_SIZE=$BOOT_SIZE
else
- get_drive_size $ROOTDRIVE ROOTDRIVESPACE
- get_drive_size $HOSTVGDRIVE HOSTVGDRIVESPACE
+ get_drive_size "$ROOTDRIVE" ROOTDRIVESPACE
+ get_drive_size "$HOSTVGDRIVE" HOSTVGDRIVESPACE
ROOT_NEED_SIZE=$(echo "scale=0; $ROOT_SIZE * 2"| bc -l)
HOSTVG_NEED_SIZE=$(echo "scale=0;" \
"$SWAP_SIZE + $CONFIG_SIZE + $LOGGING_SIZE + $min_data_size" | bc -l)
@@ -224,12 +236,13 @@ manual_input()
while true; do
read -rp "Enter disk device path: " manual_device
if [ -z "$device" ]; then
+ echo "Aborting."
return 1
fi
- translate_multipath_device $manual_device manual_device
- eval $return_var="$manual_device"
+ translate_multipath_device "$manual_device" manual_device
if [ -n "$manual_device" ]; then
if [ -b "$(readlink -f $device)" ]; then
+ eval $return_var="$manual_device"
return 0
fi
else
@@ -321,7 +334,7 @@ get_dev_name()
# There are two or more; make the user choose.
# display description for each disk
for d in $devices; do
- get_drive_size $d >&2
+ get_drive_size "$d" >&2
done
local choices="$devices Abort"
select device in $choices "Manual Selection"
@@ -340,12 +353,12 @@ do_configure()
if [ "$OVIRT_ISCSI_ENABLED" == "y" ]; then
printf "\n\nPlease select the disk to use for the Boot partition.\n\n"
BOOTDRIVE=$(get_dev_name) || return 0
- get_drive_size $BOOTDRIVE BOOTDRIVESPACE
+ get_drive_size "$BOOTDRIVE" BOOTDRIVESPACE
echo $BOOTDRIVE
else
printf "\n\nPlease select the disk to use for the Root.\n\n"
ROOTDRIVE=$(get_dev_name) || return 0
- get_drive_size $ROOTDRIVE ROOTDRIVESPACE
+ get_drive_size "$ROOTDRIVE" ROOTDRIVESPACE
printf "\n\nPlease select the disk to use for the HostVG.\n\n"
HOSTVGDRIVE=$(get_dev_name) || return 0
@@ -367,7 +380,7 @@ do_configure()
done
fi
$skipped && printf "Installation cannot proceed with existing HostVG.\n" && return 0
- get_drive_size $HOSTVGDRIVE HOSTVGDRIVESPACE
+ get_drive_size "$HOSTVGDRIVE" HOSTVGDRIVESPACE
echo $HOSTVGDRIVESPACE
fi
printf "\n\nPlease configure storage partitions.\n\n"
@@ -482,8 +495,8 @@ do_review()
The selected disk will be repartitioned as follows:
================================================
- Root Drive: $(get_drive_size $ROOTDRIVE)
- HostVG Drive: $(get_drive_size $HOSTVGDRIVE)
+ Root Drive: $(get_drive_size "$ROOTDRIVE")
+ HostVG Drive: $(get_drive_size "$HOSTVGDRIVE")
Swap partition size: $SWAP_SIZE MB
Installation partition size: $ROOT_SIZE * 2 MB
Configuration partition size: $CONFIG_SIZE MB
@@ -496,7 +509,7 @@ EOF
The selected disk will be repartitioned as follows:
================================================
- Boot Drive: $(get_drive_size $BOOTDRIVE)
+ Boot Drive: $(get_drive_size "$BOOTDRIVE")
Boot partition size: $BOOT_SIZE
EOF
@@ -917,10 +930,10 @@ DATA_SIZE=${OVIRT_VOL_DATA_SIZE:-$default_data_size}
if [ -n "$OVIRT_INIT" ]; then
# if present, use the drive selected with 'ovirt_init' boot parameter
# setting these the same until kernel cmdline argument implemented
- translate_multipath_device $OVIRT_INIT DRIVE
+ translate_multipath_device "$OVIRT_INIT" DRIVE
ROOTDRIVE=$DRIVE
HOSTVGDRIVE=$DRIVE
- get_drive_size $ROOTDRIVE ROOTDRIVESPACE
+ get_drive_size "$ROOTDRIVE" ROOTDRIVESPACE
fi
# if the node is Fedora then use GPT, otherwise use MBR
diff --git a/scripts/ovirt-functions b/scripts/ovirt-functions
index 6839614..5661bee 100644
--- a/scripts/ovirt-functions
+++ b/scripts/ovirt-functions
@@ -765,6 +765,28 @@ test_ntp_configuration () {
}
+get_dm_device ()
+{
+ local device=$1
+ local return_var=$2
+ major=$(stat -c '%t' $(readlink -f $device))
+ minor=$(stat -c '%T' $(readlink -f $device))
+ local dm_device=
+ local rc=1
+ for dm in /dev/mapper/*; do
+ if [ $major = $(stat -c '%t' $dm) -a \
+ $minor = $(stat -c '%T' $dm) ]; then
+ local dm_device=$dm
+ rc=0
+ break
+ fi
+ done
+
+ eval $return_var=$dm_device
+
+ return $rc
+}
+
# execute a function if called as a script, e.g.
# ovirt-functions ovirt_store_config /etc/hosts
--
1.6.6.1
More information about the ovirt-devel
mailing list