Skip to content

Double quote variables to prevent globbing and word splitting #17235

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 1, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 68 additions & 68 deletions tests/zfs-tests/tests/perf/perf.shlib
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
# Copyright (c) 2016, Intel Corporation.
#

. $STF_SUITE/include/libtest.shlib
. "$STF_SUITE"/include/libtest.shlib

# Defaults common to all the tests in the regression group
export PERF_RUNTIME=${PERF_RUNTIME:-'180'}
Expand Down Expand Up @@ -46,12 +46,12 @@ function get_suffix
typeset sync=$2
typeset iosize=$3

typeset sync_str=$(get_sync_str $sync)
typeset sync_str=$(get_sync_str "$sync")
typeset filesystems=$(get_nfilesystems)

typeset suffix="$sync_str.$iosize-ios"
suffix="$suffix.$threads-threads.$filesystems-filesystems"
echo $suffix
echo "$suffix"
}

function do_fio_run_impl
Expand All @@ -65,12 +65,12 @@ function do_fio_run_impl
typeset sync=$6
typeset iosize=$7

typeset sync_str=$(get_sync_str $sync)
typeset sync_str=$(get_sync_str "$sync")
log_note "Running with $threads $sync_str threads, $iosize ios"

if [[ -n $threads_per_fs && $threads_per_fs -ne 0 ]]; then
log_must test $do_recreate
verify_threads_per_fs $threads $threads_per_fs
log_must test "$do_recreate"
verify_threads_per_fs "$threads" "$threads_per_fs"
fi

if $do_recreate; then
Expand Down Expand Up @@ -105,7 +105,7 @@ function do_fio_run_impl
# the default filesystem (e.g. against a clone).
#
export DIRECTORY=$(get_directory)
log_note "DIRECTORY: " $DIRECTORY
log_note "DIRECTORY: $DIRECTORY"

export RUNTIME=$PERF_RUNTIME
export RANDSEED=$PERF_RANDSEED
Expand All @@ -122,33 +122,33 @@ function do_fio_run_impl
# disable client cache for reads.
if [[ $NFS -eq 1 ]]; then
export DIRECT=1
do_setup_nfs $script
do_setup_nfs "$script"
else
export DIRECT=0
fi

# This will be part of the output filename.
typeset suffix=$(get_suffix $threads $sync $iosize)
typeset suffix=$(get_suffix "$threads" "$sync" "$iosize")

# Start the data collection
do_collect_scripts $suffix
do_collect_scripts "$suffix"

# Define output file
typeset logbase="$(get_perf_output_dir)/$(basename \
$SUDO_COMMAND)"
"$SUDO_COMMAND")"
typeset outfile="$logbase.fio.$suffix"

# Start the load
if [[ $NFS -eq 1 ]]; then
log_must ssh -t $NFS_USER@$NFS_CLIENT "
log_must ssh -t "$NFS_USER@$NFS_CLIENT" "
fio --output-format=${PERF_FIO_FORMAT} \
--output /tmp/fio.out /tmp/test.fio
"
log_must scp $NFS_USER@$NFS_CLIENT:/tmp/fio.out $outfile
log_must ssh -t $NFS_USER@$NFS_CLIENT "sudo -S umount $NFS_MOUNT"
log_must scp "$NFS_USER@$NFS_CLIENT":/tmp/fio.out "$outfile"
log_must ssh -t "$NFS_USER@$NFS_CLIENT" "sudo -S umount $NFS_MOUNT"
else
log_must fio --output-format=${PERF_FIO_FORMAT} \
--output $outfile $FIO_SCRIPTS/$script
log_must fio --output-format="${PERF_FIO_FORMAT}" \
--output "$outfile" "$FIO_SCRIPTS/$script"
fi
}

Expand Down Expand Up @@ -176,13 +176,13 @@ function do_fio_run
for sync in $PERF_SYNC_TYPES; do
for iosize in $PERF_IOSIZES; do
do_fio_run_impl \
$script \
$do_recreate \
$clear_cache \
$threads \
$threads_per_fs \
$sync \
$iosize
"$script" \
"$do_recreate" \
"$clear_cache" \
"$threads" \
"$threads_per_fs" \
"$sync" \
"$iosize"
done
done
done
Expand All @@ -195,12 +195,12 @@ function do_fio_run
function do_setup_nfs
{
typeset script=$1
zfs set sharenfs=on $TESTFS
log_must chmod -R 777 /$TESTFS
zfs set sharenfs=on "$TESTFS"
log_must chmod -R 777 /"$TESTFS"

ssh -t $NFS_USER@$NFS_CLIENT "mkdir -m 777 -p $NFS_MOUNT"
ssh -t $NFS_USER@$NFS_CLIENT "sudo -S umount $NFS_MOUNT"
log_must ssh -t $NFS_USER@$NFS_CLIENT "
ssh -t "$NFS_USER@$NFS_CLIENT" "mkdir -m 777 -p $NFS_MOUNT"
ssh -t "$NFS_USER@$NFS_CLIENT" "sudo -S umount $NFS_MOUNT"
log_must ssh -t "$NFS_USER@$NFS_CLIENT" "
sudo -S mount $NFS_OPTIONS $NFS_SERVER:/$TESTFS $NFS_MOUNT
"
#
Expand All @@ -211,9 +211,9 @@ function do_setup_nfs
export jobnum='$jobnum'
while read line; do
eval echo "$line"
done < $FIO_SCRIPTS/$script > /tmp/test.fio
done < "$FIO_SCRIPTS/$script" > /tmp/test.fio
log_must sed -i -e "s%directory.*%directory=$NFS_MOUNT%" /tmp/test.fio
log_must scp /tmp/test.fio $NFS_USER@$NFS_CLIENT:/tmp
log_must scp /tmp/test.fio "$NFS_USER@$NFS_CLIENT":/tmp
log_must rm /tmp/test.fio
}

Expand All @@ -233,17 +233,17 @@ function do_collect_scripts
typeset oIFS=$IFS
IFS=','
for item in $PERF_COLLECT_SCRIPTS; do
collect_scripts+=($(echo $item | sed 's/^ *//g'))
collect_scripts+=($(echo "$item" | sed 's/^ *//g'))
done
IFS=$oIFS

typeset idx=0
while [[ $idx -lt "${#collect_scripts[@]}" ]]; do
typeset logbase="$(get_perf_output_dir)/$(basename \
$SUDO_COMMAND)"
"$SUDO_COMMAND")"
typeset outfile="$logbase.${collect_scripts[$idx + 1]}.$suffix"

timeout $PERF_RUNTIME ${collect_scripts[$idx]} >$outfile 2>&1 &
timeout "$PERF_RUNTIME" "${collect_scripts[$idx]}" >"$outfile" 2>&1 &
((idx += 2))
done

Expand All @@ -256,9 +256,9 @@ function do_collect_scripts
function get_perf_output_dir
{
typeset dir="$PWD/perf_data"
[[ -d $dir ]] || mkdir -p $dir
[[ -d $dir ]] || mkdir -p "$dir"

echo $dir
echo "$dir"
}

function apply_zinject_delays
Expand All @@ -270,7 +270,7 @@ function apply_zinject_delays

for disk in $DISKS; do
log_must zinject \
-d $disk -D ${ZINJECT_DELAYS[$idx]} $PERFPOOL
-d "$disk" -D "${ZINJECT_DELAYS[$idx]}" "$PERFPOOL"
done

((idx += 1))
Expand Down Expand Up @@ -302,16 +302,16 @@ function recreate_perf_pool
# This function handles the case where the pool already exists,
# and will destroy the previous pool and recreate a new pool.
#
create_pool $PERFPOOL $DISKS
create_pool "$PERFPOOL" "$DISKS"
}

function verify_threads_per_fs
{
typeset threads=$1
typeset threads_per_fs=$2

log_must test -n $threads
log_must test -n $threads_per_fs
log_must test -n "$threads"
log_must test -n "$threads_per_fs"

#
# A value of "0" is treated as a "special value", and it is
Expand All @@ -325,7 +325,7 @@ function verify_threads_per_fs
# than or equal to zero; since we just verified the value isn't
# 0 above, then it must be greater than zero here.
#
log_must test $threads_per_fs -ge 0
log_must test "$threads_per_fs" -ge 0

#
# This restriction can be lifted later if needed, but for now,
Expand All @@ -341,9 +341,9 @@ function populate_perf_filesystems
typeset nfilesystems=${1:-1}

export TESTFS=""
for i in $(seq 1 $nfilesystems); do
for i in $(seq 1 "$nfilesystems"); do
typeset dataset="$PERFPOOL/fs$i"
create_dataset $dataset $PERF_FS_OPTS
create_dataset "$dataset" "$PERF_FS_OPTS"
if [[ -z "$TESTFS" ]]; then
TESTFS="$dataset"
else
Expand All @@ -354,13 +354,13 @@ function populate_perf_filesystems

function get_nfilesystems
{
typeset filesystems=( $TESTFS )
typeset filesystems=($TESTFS)
echo ${#filesystems[@]}
}

function get_directory
{
typeset filesystems=( $TESTFS )
typeset filesystems=($TESTFS)
typeset directory=

typeset idx=0
Expand All @@ -376,7 +376,7 @@ function get_directory
((idx += 1))
done

echo $directory
echo "$directory"
}

function get_min_arc_size
Expand Down Expand Up @@ -447,43 +447,43 @@ function get_dbuf_cache_size
dbuf_cache_size=$(($(get_arc_target) / 2**dbuf_cache_shift))
fi || log_fail "get_dbuf_cache_size failed"

echo $dbuf_cache_size
echo "$dbuf_cache_size"
}

# Create a file with some information about how this system is configured.
function get_system_config
{
typeset config=$PERF_DATA_DIR/$1

echo "{" >>$config
echo "{" >>"$config"
if is_linux; then
echo " \"ncpus\": \"$(lscpu | awk '/^CPU\(s\)/ {print $2; exit}')\"," >>$config
echo " \"ncpus\": \"$(lscpu | awk '/^CPU\(s\)/ {print $2; exit}')\"," >>"$config"
echo " \"physmem\": \"$(free -b | \
awk '$1 == "Mem:" { print $2 }')\"," >>$config
echo " \"c_max\": \"$(get_max_arc_size)\"," >>$config
echo " \"hostname\": \"$(uname -n)\"," >>$config
echo " \"kernel version\": \"$(uname -sr)\"," >>$config
awk '$1 == "Mem:" { print $2 }')\"," >>"$config"
echo " \"c_max\": \"$(get_max_arc_size)\"," >>"$config"
echo " \"hostname\": \"$(uname -n)\"," >>"$config"
echo " \"kernel version\": \"$(uname -sr)\"," >>"$config"
else
dtrace -qn 'BEGIN{
printf(" \"ncpus\": %d,\n", `ncpus);
printf(" \"physmem\": %u,\n", `physmem * `_pagesize);
printf(" \"c_max\": %u,\n", `arc_stats.arcstat_c_max.value.ui64);
printf(" \"kmem_flags\": \"0x%x\",", `kmem_flags);
exit(0)}' >>$config
echo " \"hostname\": \"$(uname -n)\"," >>$config
echo " \"kernel version\": \"$(uname -v)\"," >>$config
exit(0)}' >>"$config"
echo " \"hostname\": \"$(uname -n)\"," >>"$config"
echo " \"kernel version\": \"$(uname -v)\"," >>"$config"
fi
if is_linux; then
lsblk -dino NAME,SIZE | awk 'BEGIN {
printf(" \"disks\": {\n"); first = 1}
{disk = $1} {size = $2;
if (first != 1) {printf(",\n")} else {first = 0}
printf(" \"%s\": \"%s\"", disk, size)}
END {printf("\n },\n")}' >>$config
END {printf("\n },\n")}' >>"$config"

zfs_tunables="/sys/module/zfs/parameters"

printf " \"tunables\": {\n" >>$config
printf " \"tunables\": {\n" >>"$config"
for tunable in \
zfs_arc_max \
zfs_arc_sys_free \
Expand All @@ -500,28 +500,28 @@ function get_system_config
do
if [ "$tunable" != "zfs_arc_max" ]
then
printf ",\n" >>$config
printf ",\n" >>"$config"
fi
printf " \"$tunable\": \"$(<$zfs_tunables/$tunable)\"" \
>>$config
>>"$config"
done
printf "\n }\n" >>$config
printf "\n }\n" >>"$config"
else
iostat -En | awk 'BEGIN {
printf(" \"disks\": {\n"); first = 1}
/^c/ {disk = $1}
/^Size: [^0]/ {size = $2;
if (first != 1) {printf(",\n")} else {first = 0}
printf(" \"%s\": \"%s\"", disk, size)}
END {printf("\n },\n")}' >>$config
END {printf("\n },\n")}' >>"$config"

sed -n 's/^set \(.*\)[ ]=[ ]\(.*\)/\1=\2/p' /etc/system | \
awk -F= 'BEGIN {printf(" \"system\": {\n"); first = 1}
{if (first != 1) {printf(",\n")} else {first = 0};
printf(" \"%s\": %s", $1, $2)}
END {printf("\n }\n")}' >>$config
END {printf("\n }\n")}' >>"$config"
fi
echo "}" >>$config
echo "}" >>"$config"
}

#
Expand All @@ -535,33 +535,33 @@ function pool_to_lun_list

case "$UNAME" in
Linux)
ctds=$(zpool list -HLv $pool | \
ctds=$(zpool list -HLv "$pool" | \
awk '/sd[a-z]*|loop[0-9]*|dm-[0-9]*/ {print $1}')

for ctd in $ctds; do
lun_list="$lun_list$ctd:"
done
;;
FreeBSD)
lun_list+=$(zpool list -HLv $pool | \
lun_list+=$(zpool list -HLv "$pool" | \
awk '/a?da[0-9]+|md[0-9]+|mfid[0-9]+|nda[0-9]+|nvd[0-9]+|vtbd[0-9]+/
{ printf "%s:", $1 }')
;;
*)
ctds=$(zpool list -v $pool |
ctds=$(zpool list -v "$pool" |
awk '/c[0-9]*t[0-9a-fA-F]*d[0-9]*/ {print $1}')

for ctd in $ctds; do
# Get the device name as it appears in /etc/path_to_inst
devname=$(readlink -f /dev/dsk/${ctd}s0 | sed -n 's/\/devices\([^:]*\):.*/\1/p')
devname=$(readlink -f /dev/dsk/"${ctd}"s0 | sed -n 's/\/devices\([^:]*\):.*/\1/p')
# Add a string composed of the driver name and instance
# number to the list for comparison with dev_statname.
lun=$(sed 's/"//g' /etc/path_to_inst | awk -v dn="$devname" '$0 ~ dn {print $3$2}')
lun_list="$lun_list$lun:"
done
;;
esac
echo $lun_list
echo "$lun_list"
}

function print_perf_settings
Expand Down
Loading