8d910d10f8
tgtd returns execution control and backgrounds itself almost immediately and before it has made it's listening socket available. This can cause a race condition as the tgtd socket is not available when tgtadm is run, resulting in an error: failed to send request hdr to tgt daemon Add a function to check if the socket is available before moving on to calling tgtadm, and a wait_for helper function we can use. We'll check for the socket every 0.5 seconds, for up to 5 seconds. I'm seeing this issue on almost every deploy using a ramdisk built from Fedora 20. I'm not sure if something has changed in tgtd, but this behavior is documented since Fedora 18 at least. In the systemd script for tgtd, there is actually "sleep 5" to work around the problem. See Also: https://bugzilla.redhat.com/show_bug.cgi?id=848942 Change-Id: Iffa9fc63393309ca653d592dff17316ecbea3e09
268 lines
4.6 KiB
Plaintext
Executable File
268 lines
4.6 KiB
Plaintext
Executable File
# Copyright (c) 2012 NTT DOCOMO, INC.
|
|
# Copyright 2012 Hewlett-Packard Development Company, L.P.
|
|
#
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
function get_kernel_parameter() {
|
|
local name=$1
|
|
for i in `cat /proc/cmdline`; do
|
|
case "$i" in
|
|
${name}=*)
|
|
echo "${i#${name}=}"
|
|
return 0
|
|
;;
|
|
${name})
|
|
echo ""
|
|
return 0
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
done
|
|
echo ""
|
|
return 1
|
|
}
|
|
|
|
function string_contains() {
|
|
local string=$1
|
|
local word=$2
|
|
if [ "$string" != "${string/$word/}" ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
function load_modules_by_udev() {
|
|
depmod
|
|
udevadm trigger --action=add
|
|
udevadm settle
|
|
}
|
|
|
|
function strip_dev() {
|
|
echo "$1" | sed -e 's:^/dev/::'
|
|
}
|
|
|
|
function prepend_dev() {
|
|
case "$1" in
|
|
/dev/*)
|
|
echo "$1"
|
|
;;
|
|
*)
|
|
echo "/dev/$1"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
function whole_disk_name() {
|
|
local dev=`prepend_dev "$1"`
|
|
case "$dev" in
|
|
/dev/sd*|/dev/hd*|/dev/vd*)
|
|
echo "$dev" | sed -e 's/[0-9]*$//'
|
|
;;
|
|
/dev/cciss/*)
|
|
echo "$dev" | sed -e 's/p[0-9]*$//'
|
|
;;
|
|
*)
|
|
echo ""
|
|
return 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
function partition_name() {
|
|
local dev=`prepend_dev "$1"`
|
|
local part=$2
|
|
case "$dev" in
|
|
/dev/sd*|/dev/hd*|/dev/vd*)
|
|
echo "${dev}${part}"
|
|
;;
|
|
/dev/cciss/*)
|
|
echo "${dev}p${part}"
|
|
;;
|
|
*)
|
|
echo ""
|
|
return 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
function find_interface() {
|
|
local mac=$1
|
|
eth=`ifconfig -a | grep -i "$mac" | awk {' print $1 '} | head -n 1`
|
|
if [ -n "$eth" ]; then
|
|
echo "$eth"
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
function set_mac() {
|
|
local dev=$1
|
|
local mac=$2
|
|
ip link set "$dev" address "$mac"
|
|
}
|
|
|
|
function swap_ifname() {
|
|
local dev=$1
|
|
local dev2=$2
|
|
if [ "$dev" = "$dev2" ]; then
|
|
return
|
|
fi
|
|
if ip link show "$dev2" >/dev/null; then
|
|
# dev2 exists
|
|
# swap device name
|
|
ip link set "$dev" name "_$dev"
|
|
ip link set "$dev2" name "$dev"
|
|
ip link set "_$dev" name "$dev2"
|
|
else
|
|
ip link set "$dev" name "$dev2"
|
|
fi
|
|
}
|
|
|
|
function partition_exists() {
|
|
local dev=$1
|
|
dev=`strip_dev "$dev"`
|
|
if tail -n +3 /proc/partitions | grep "$dev" >/dev/null; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
function find_disk() {
|
|
local disks=$1
|
|
local dev
|
|
|
|
# find device
|
|
local OLD_IFS=$IFS
|
|
IFS=,
|
|
for i in $disks; do
|
|
dev=`whole_disk_name "$i"`
|
|
if partition_exists "$dev"; then
|
|
dev=`prepend_dev "$dev"`
|
|
break
|
|
fi
|
|
dev=""
|
|
done
|
|
IFS=$OLD_IFS
|
|
|
|
if [ -z "$dev" ]; then
|
|
return 1
|
|
fi
|
|
echo "$dev"
|
|
return 0
|
|
}
|
|
|
|
function check_tgtd_socket() {
|
|
echo -n "waiting for tgtd socket..."
|
|
if [ -e /var/run/tgtd.ipc_abstract_namespace.0 ]; then
|
|
echo "found"
|
|
return 0
|
|
else
|
|
echo "not found"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
wait_for(){
|
|
LOOPS=$1
|
|
SLEEPTIME=$2
|
|
shift ; shift
|
|
i=0
|
|
while [ $i -lt $LOOPS ] ; do
|
|
i=$((i + 1))
|
|
eval "$@" && return 0 || true
|
|
sleep $SLEEPTIME
|
|
done
|
|
return 1
|
|
}
|
|
|
|
function start_iscsi_target() {
|
|
local iqn=$1
|
|
local dev=$2
|
|
local cli=$3
|
|
|
|
# used by tgtd
|
|
mkdir -p /var/run
|
|
|
|
tgtd
|
|
wait_for 10 0.5 check_tgtd_socket
|
|
|
|
tgtadm --lld iscsi --mode target --op new --tid 1 --targetname "$iqn"
|
|
tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 --backing-store "$dev"
|
|
tgtadm --lld iscsi --mode target --op bind --tid 1 --initiator-address "$cli"
|
|
}
|
|
|
|
function stop_iscsi_target() {
|
|
tgtadm --lld iscsi --mode logicalunit --op delete --tid 1 --lun 1
|
|
tgtadm --lld iscsi --mode target --op delete --tid 1
|
|
killall tgtd
|
|
}
|
|
|
|
function troubleshoot() {
|
|
if [ "$TROUBLESHOOT" != 1 ]; then
|
|
_DO_TROUBLESHOOT=""
|
|
_t=0
|
|
echo -n "Troubleshooting required, press t to launch shell."
|
|
while [ $_t -lt 10 ]; do
|
|
read -n 1 -t 1 _DO_TROUBLESHOOT
|
|
_t=$(($_t + 1))
|
|
if [ "$_DO_TROUBLESHOOT" == "t" ]; then
|
|
export TROUBLESHOOT=1
|
|
break
|
|
fi
|
|
echo -n "."
|
|
done
|
|
echo ""
|
|
fi
|
|
if [ "$TROUBLESHOOT" == 1 ]; then
|
|
echo "Starting troubleshooting shell."
|
|
bash
|
|
fi
|
|
}
|
|
|
|
function safe_url_encode() {
|
|
local str=$1
|
|
local out=""
|
|
|
|
for (( i=0; i<${#str}; i++ )); do
|
|
c=${str:$i:1}
|
|
case $c in
|
|
[a-zA-Z0-9.-_] )
|
|
out+="$c"
|
|
;;
|
|
' ' )
|
|
out+="+"
|
|
;;
|
|
*)
|
|
#skip it
|
|
;;
|
|
esac
|
|
done
|
|
echo "$out"
|
|
|
|
}
|
|
|
|
function err_msg() {
|
|
message=$1
|
|
if [ -z "$FIRST_ERR_MSG" ]; then
|
|
FIRST_ERR_MSG=$(safe_url_encode "$message")
|
|
fi
|
|
echo "$message"
|
|
}
|
|
|