misc.sh revision 185029
1229997Sken# $FreeBSD: head/tools/regression/zfs/misc.sh 185029 2008-11-17 20:49:29Z pjd $ 2229997Sken 3288348Smavntest=1 4229997Skenos=`uname -s` 5229997Sken 6229997Skenecho ${dir} | egrep '^/' >/dev/null 2>&1 7229997Skenif [ $? -eq 0 ]; then 8229997Sken maindir="${dir}/../.." 9229997Skenelse 10229997Sken maindir="`pwd`/${dir}/../.." 11229997Skenfi 12229997Sken 13229997Sken# Set up correct command names and switches 14229997Skenif [ -z "${LUSTRE}" ]; then 15229997Sken ZPOOL="zpool" 16229997Sken ZFS="zfs" 17229997Sken ZDB="zdb" 18229997Sken zpool_f_flag="-f" 19229997Skenelse 20229997Sken ZPOOL="lzpool" 21229997Sken ZFS="lzfs" 22229997Sken ZDB="lzdb" 23229997Sken zpool_f_flag="-F" 24229997Sken no_mountpoint=1 25229997Skenfi 26229997Sken 27229997Sken# Use correct arguments to cmd line programs 28229997Skenstat --version 2>/dev/null | grep GNU >/dev/null 29229997Skenif [ $? -eq 0 ]; then 30229997Sken GNU_STAT="yes" 31229997Skenfi 32229997Skenif [ "${os}" = "SunOS" ]; then 33229997Sken import_flags="-d /dev/lofi" 34229997Sken mount_t_flag="-F" 35229997Skenelse 36229997Sken mount_t_flag="-t" 37229997Skenfi 38229997Sken 39229997Skendie() 40229997Sken{ 41229997Sken echo "${1}" > /dev/stderr 42229997Sken exit 1 43229997Sken} 44229997Sken 45229997Skencalcsum() 46229997Sken{ 47229997Sken dd if="${1}" bs=1M 2>/dev/null | openssl md5 48229997Sken} 49229997Sken 50229997Skencreate_file() 51229997Sken{ 52229997Sken name="${1}" 53288348Smav size="${2}" 54229997Sken 55229997Sken dd if=/dev/urandom of=${name} bs=${size} count=1 >/dev/null 2>&1 56229997Sken sync 57288348Smav} 58229997Sken 59229997Skenexpect() 60229997Sken{ 61229997Sken eorig="${1}" 62229997Sken eexp=`echo "${eorig}" | egrep -v '^[ ]*$' | sed 's/^[ ][ ]*//g;s/[ ][ ]*$//g;s/[ ][ ]*/ /g;s/$/%EoL%/' | xargs` 63229997Sken shift 64229997Sken gorig=`sh -c "$*" 2>&1` 65229997Sken got=`echo "${gorig}" | egrep -v '^[ ]*$' | sed 's/^[ ][ ]*//g;s/[ ][ ]*$//g;s/[ ][ ]*/ /g;s/$/%EoL%/' | xargs` 66229997Sken echo "${got}" | egrep "${eexp}" >/dev/null 67229997Sken if [ $? -eq 0 ]; then 68229997Sken echo "ok ${ntest} ${add_msg}" 69229997Sken else 70229997Sken echo "not ok ${ntest} ${add_msg}" 71229997Sken echo "# ----- expected from: $*" 72264274Smav echo "${eorig}" | sed 's/^/# /' 73288348Smav echo "# ----- got:" 74288348Smav echo "${gorig}" | sed 's/^/# /' 75264274Smav echo "# ----- end" 76272911Smav fi 77272911Smav ntest=`expr $ntest + 1` 78229997Sken} 79229997Sken 80229997Skenexpect_ok() 81288348Smav{ 82288348Smav out=`$* 2>&1` 83229997Sken ec=$? 84229997Sken if [ $ec -eq 0 ]; then 85229997Sken echo "ok ${ntest} ${add_msg}" 86264274Smav echo "# ----- expected success from: $*" 87272911Smav if [ ! -z "${out}" ]; then 88288348Smav echo "# ----- output (exit code=${ec}):" 89287499Smav echo "${out}" | sed 's/^/# /' 90229997Sken echo "# ----- end" 91229997Sken fi 92287499Smav else 93287499Smav echo "not ok ${ntest} ${add_msg}" 94287499Smav echo "# ----- expected success from: $*" 95287499Smav echo "# ----- output (exit code=${ec}):" 96287499Smav echo "${out}" | sed 's/^/# /' 97287499Smav echo "# ----- end" 98229997Sken fi 99229997Sken ntest=`expr $ntest + 1` 100229997Sken} 101229997Sken 102229997Skenexpect_fl() 103229997Sken{ 104229997Sken out=`$* 2>&1` 105229997Sken ec=$? 106229997Sken if [ $ec -ne 0 ]; then 107229997Sken echo "ok ${ntest} ${add_msg}" 108229997Sken echo "# ----- expected failure from: $*" 109229997Sken if [ ! -z "${out}" ]; then 110229997Sken echo "# ----- output (exit code=${ec}):" 111229997Sken echo "${out}" | sed 's/^/# /' 112229997Sken echo "# ----- end" 113229997Sken fi 114229997Sken else 115229997Sken echo "not ok ${ntest} ${add_msg}" 116229997Sken echo "# ----- expected failure from: $*" 117229997Sken echo "# ----- output (exit code=${ec}):" 118229997Sken echo "${out}" | sed 's/^/# /' 119229997Sken echo "# ----- end" 120229997Sken fi 121229997Sken ntest=`expr $ntest + 1` 122229997Sken} 123229997Sken 124229997Skenquick_exit() 125229997Sken{ 126229997Sken echo "1..1" 127229997Sken echo "ok 1" 128229997Sken exit 0 129229997Sken} 130229997Sken 131229997Sken# Set up a scratch tmpfs directory (Linux only) 132229997Skensetup_tmpfs() 133229997Sken{ 134229997Sken cmd="mktemp -d /tmp/zfs-regression.XXXXXXXXXX" 135229997Sken TMPDIR=`${cmd}` || die "failed: ${cmd}" 136229997Sken cmd="mount -t tmpfs none ${TMPDIR}" 137229997Sken ${cmd} || die "failed: ${cmd}" 138229997Sken} 139229997Sken 140229997Sken# Clean up the tmpfs directory (Linux only) 141229997Skencleanup_tmpfs() 142229997Sken{ 143229997Sken if [ -n "${TMPDIR}" ]; then 144229997Sken cmd="umount ${TMPDIR} && rmdir ${TMPDIR}" 145229997Sken eval "${cmd}" || die "failed: ${cmd}" 146229997Sken fi 147229997Sken} 148229997Sken 149229997Sken# Truncate a file 150229997Skentruncate_cmd() 151229997Sken{ 152229997Sken size="${1}" 153264191Smav file="${2}" 154264191Smav 155275920Smav cmd="dd if=/dev/null of=${file} bs=1 count=0 seek=${size}" 156264191Smav ${cmd} > /dev/null 2>&1 || die "failed: ${cmd}" 157275920Smav} 158275920Smav 159275920Smav# Create a memory-backed block device 160275920Smavcreate_memdisk() 161272734Smav{ 162272734Smav size="${1}" 163275920Smav devname="${2}" 164275920Smav 165229997Sken if [ "${os}" = "FreeBSD" ]; then 166229997Sken if [ -n "${devname}" ]; then 167229997Sken devparam="-u ${devname}" 168229997Sken fi 169229997Sken cmd="mdconfig -a -t swap -s ${size} ${devparam} 2>/dev/null" 170229997Sken DISKNAME=`${cmd}` || die "failed: ${cmd}" 171229997Sken if [ -n "${devname}" ]; then 172229997Sken DISKNAME="${devname}" 173229997Sken fi 174229997Sken FDISKNAME="/dev/${DISKNAME}" 175229997Sken elif [ "${os}" = "SunOS" ]; then 176229997Sken cmd="mktemp /tmp/zfstest.XXXXXXXXXX" 177229997Sken fname=`${cmd}` || die "failed: ${cmd}" 178229997Sken 179229997Sken truncate_cmd "${size}" "${fname}" 180229997Sken 181229997Sken if [ -n "${devname}" ]; then 182229997Sken cmd="lofiadm -a ${fname} ${devname}" 183229997Sken ${cmd} || die "failed: ${cmd}" 184229997Sken DISKNAME="${devname}" 185229997Sken else 186229997Sken cmd="lofiadm -a ${fname}" 187229997Sken DISKNAME=`${cmd}` || die "failed: ${cmd}" 188229997Sken fi 189229997Sken FDISKNAME="${DISKNAME}" 190229997Sken elif [ "${os}" = "Linux" ]; then 191229997Sken if [ -z "${TMPDIR_DISKS}" ]; then 192229997Sken setup_tmpfs 193229997Sken TMPDIR_DISKS="${TMPDIR}" 194229997Sken fi 195229997Sken 196229997Sken cmd="mktemp ${TMPDIR_DISKS}/disk.XXXXXXXXXX" 197229997Sken fname=`${cmd}` || die "failed: ${cmd}" 198229997Sken 199229997Sken truncate_cmd "${size}" "${fname}" 200229997Sken 201229997Sken if [ -n "${devname}" ]; then 202229997Sken devname=`echo ${devname} | cut -c 9-` 203229997Sken cmd="losetup /dev/${devname} ${fname} 2>&1" 204287499Smav eval ${cmd} || die "failed: ${cmd}" 205229997Sken DISKNAME="${devname}" 206229997Sken else 207229997Sken cmd="losetup -s -f ${fname} 2>&1" 208264191Smav diskname=`eval ${cmd}` 209264191Smav 210275865Smav if [ "${diskname}" = "losetup: could not find any free loop device" ]; then 211275865Smav # If there are no free loopback devices, create one more 212272734Smav max=`echo /dev/loop* | awk 'BEGIN { RS=" "; FS="loop" } {if ($2 > max) max = $2} END {print max}'` 213275920Smav max=$((max + 1)) 214229997Sken cmd="mknod /dev/loop${max} b 7 ${max}" 215229997Sken ${cmd} || die "failed: ${cmd}" 216229997Sken 217229997Sken cmd="losetup -s -f ${fname}" 218229997Sken diskname=`${cmd}` || die "failed: ${cmd}" 219229997Sken fi 220229997Sken DISKNAME=`eval echo ${diskname} | sed 's/^\/dev\///'` 221229997Sken fi 222268280Smav ln /dev/${DISKNAME} /dev/zfstest_${DISKNAME} 223229997Sken DISKNAME="zfstest_${DISKNAME}" 224229997Sken FDISKNAME="/dev/${DISKNAME}" 225229997Sken else 226229997Sken die "Sorry, your OS is not supported" 227229997Sken fi 228229997Sken} 229229997Sken 230229997Sken# Destroy a memory-backed block device 231229997Skendestroy_memdisk() 232229997Sken{ 233229997Sken disk="${1}" 234229997Sken 235229997Sken if [ "${os}" = "FreeBSD" ]; then 236229997Sken cmd="mdconfig -d -u ${disk}" 237229997Sken ${cmd} || die "failed: ${cmd}" 238274154Smav elif [ "${os}" = "SunOS" ]; then 239229997Sken cmd="lofiadm ${disk}" 240229997Sken fname=`${cmd}` || die "failed: ${cmd}" 241229997Sken 242229997Sken cmd="lofiadm -d ${disk}" 243229997Sken ${cmd} || die "failed: ${cmd}" 244229997Sken 245229997Sken cmd="rm ${fname}" 246229997Sken ${cmd} || die "failed: ${cmd}" 247229997Sken elif [ "${os}" = "Linux" ]; then 248229997Sken cmd="rm /dev/${disk}" 249229997Sken ${cmd} || die "failed: ${cmd}" 250274154Smav disk=`echo ${disk} | cut -c 9-` 251229997Sken 252229997Sken cmd="losetup /dev/${disk} | awk '{print substr(\$3, 2, length(\$3)-2)}'" 253229997Sken fname=`eval ${cmd}` || die "failed: ${cmd}" 254229997Sken 255229997Sken cmd="losetup -d /dev/${disk}" 256229997Sken ${cmd} || die "failed: ${cmd}" 257229997Sken 258229997Sken cmd="rm ${fname}" 259229997Sken ${cmd} || die "failed: ${cmd}" 260229997Sken else 261229997Sken die "Sorry, your OS is not supported" 262229997Sken fi 263229997Sken} 264229997Sken 265229997Skendisks_create() 266229997Sken{ 267229997Sken if [ -z "${ndisks}" ]; then 268229997Sken start=0 269229997Sken else 270229997Sken start=${ndisks} 271229997Sken fi 272229997Sken ndisks=$((start+$1)) 273229997Sken n=$((ndisks-$start)) 274229997Sken if [ -z "${2}" ]; then 275229997Sken size="96M" 276229997Sken else 277229997Sken size="${2}" 278229997Sken fi 279229997Sken for i in `nums $n $start`; do 280229997Sken create_memdisk ${size} 281229997Sken eval disk${i}="${DISKNAME}" 282229997Sken eval fdisk${i}="${FDISKNAME}" 283229997Sken done 284229997Sken} 285229997Sken 286229997Skendisks_destroy() 287229997Sken{ 288229997Sken for i in `nums $ndisks 0`; do 289229997Sken eval disk=\$disk${i} 290229997Sken if [ ! -z "${disk}" ]; then 291229997Sken destroy_memdisk ${disk} 292288348Smav fi 293229997Sken done 294288348Smav [ -n "${TMPDIR_DISKS}" ] && TMPDIR="${TMPDIR_DISKS}" cleanup_tmpfs 295288348Smav return 0 296288348Smav} 297229997Sken 298229997Skendisk_create() 299287621Smav{ 300287621Smav diskno=${1} 301287621Smav eval disk=\$disk${diskno} 302287621Smav if [ ! -z ${disk} ]; then 303287621Smav die "disk${diskno} is already set" 304287621Smav fi 305288348Smav dname=${2} 306232604Strasz if [ -z "${3}" ]; then 307232604Strasz size="96M" 308232604Strasz else 309229997Sken size="${3}" 310229997Sken fi 311229997Sken create_memdisk ${size} ${dname} 312229997Sken [ "${DISKNAME}" = "${dname}" ] || die "${DISKNAME} != ${dname}" 313229997Sken eval disk${diskno}="${DISKNAME}" 314229997Sken eval fdisk${diskno}="${FDISKNAME}" 315} 316 317disk_destroy() 318{ 319 eval disk=\$disk${1} 320 destroy_memdisk ${disk} 321 eval disk${1}="" 322} 323 324files_create() 325{ 326 if [ -z "${nfiles}" ]; then 327 start=0 328 else 329 start=${nfiles} 330 fi 331 nfiles=$((start+$1)) 332 n=$((nfiles-$start)) 333 if [ -z "${2}" ]; then 334 size="96M" 335 else 336 size="${2}" 337 fi 338 for i in `nums $n $start`; do 339 if [ "${os}" = "Linux" ]; then 340 if [ -z "${TMPDIR_FILES}" ]; then 341 setup_tmpfs 342 TMPDIR_FILES="${TMPDIR}" 343 fi 344 file=`mktemp ${TMPDIR_FILES}/zfstest.XXXXXXXX` 345 else 346 file=`mktemp /tmp/zfstest.XXXXXXXX` 347 fi 348 truncate_cmd ${size} ${file} 349 eval file${i}=${file} 350 done 351} 352 353files_destroy() 354{ 355 for i in `nums $nfiles 0`; do 356 eval file=\$file${i} 357 rm -f ${file} 358 done 359 nfiles=0 360 [ -n "${TMPDIR_FILES}" ] && TMPDIR="${TMPDIR_FILES}" cleanup_tmpfs 361 return 0 362} 363 364name_create() 365{ 366 echo "zfstest_`dd if=/dev/urandom bs=1k count=1 2>/dev/null | openssl md5 | cut -b -8`" 367} 368 369names_create() 370{ 371 nnames=$1 372 for i in `nums $nnames 0`; do 373 eval name${i}=`name_create` 374 done 375} 376 377is_mountpoint() 378{ 379 dir="${1}" 380 if [ ! -d "${dir}" ]; then 381 return 1 382 fi 383 if [ -n "${GNU_STAT}" ]; then 384 statcmd="stat -c" 385 else 386 statcmd="stat -f" 387 fi 388 if [ "`${statcmd} '%d' ${dir} 2>/dev/null`" -eq "`${statcmd} '%d' ${dir}/.. 2>/dev/null`" ]; then 389 return 1 390 fi 391 return 0 392} 393 394nums() 395{ 396 which jot >/dev/null 2>&1 397 if [ $? -eq 0 ]; then 398 jot ${1} ${2} 399 return $? 400 fi 401 402 start="${2}" 403 [ -z "${start}" ] && start="1"; 404 end=$((${1}+${start}-1)) 405 406 which seq >/dev/null 2>&1 407 if [ $? -eq 0 ]; then 408 seq ${start} ${end} 409 return $? 410 fi 411 412 i=1 413 while :; do 414 echo $i 415 if [ $i -eq ${1} ]; then 416 break 417 fi 418 i=$((i+1)) 419 done 420} 421 422wait_for_resilver() 423{ 424 for i in `nums 64`; do 425 ${ZPOOL} status ${1} | grep replacing >/dev/null 426 if [ $? -ne 0 ]; then 427 break 428 fi 429 sleep 1 430 done 431} 432 433get_guid() 434{ 435 ${ZDB} -l ${1} | grep -B1 ${1} | grep guid | head -n1 | awk 'BEGIN {FS="="} {print $2}' 436} 437