Whamcloud - gitweb
LU-17744 ldiskfs: mballoc stats fixes
[fs/lustre-release.git] / lustre / tests / rundbench
1 #!/bin/bash
2
3 set -o errexit
4 set -o pipefail
5
6 MOUNT=${MOUNT:-/mnt/lustre}
7 DIR=${DIR:-$MOUNT/$HOSTNAME}
8 SCRIPT=$(realpath "$0")
9 LUSTRE=${LUSTRE:-$(dirname "$SCRIPT")/..}
10 . $LUSTRE/tests/test-framework.sh
11
12 CHROOT="no"
13 PREFIX="on"
14 LIBS71=()
15 DBENCHPID=""
16
17 usage() {
18         cat <<-EOF
19         Usage: $SCRIPT [-C] [-D DIR] [dbench options]
20         -C use chroot instead of change directory
21         -D DIR use DIR as work directory
22         EOF
23
24         exit 1
25 }
26
27 clean_dbench() {
28         local rc=$?
29
30         trap '' ERR HUP INT TERM EXIT
31
32         if (( rc > 128 )); then
33                 local signal=$((rc - 128))
34                 echo "dbench killed by signal $signal"
35                 rc=0
36         fi
37
38         echo "stopping dbench $PREFIX $DIR at $(date) with return code $rc"
39
40         if [[ -n "$DBENCHPID" ]]; then
41                 if ps -h -p "$DBENCHPID" && kill "$DBENCHPID"; then
42                         echo "killed dbench main pid $DBENCHPID"
43                 fi
44         fi
45
46         if [[ -d "$DIR" ]]; then
47                 echo "clean dbench files $PREFIX $DIR"
48                 pushd "$DIR"
49                 rm -frv clients client.txt dbench "${LIBS71[@]}"
50                 popd
51         fi
52
53         if (( rc == 0 )); then
54                 echo "dbench successfully finished"
55         else
56                 echo "dbench exit with error $rc"
57         fi
58
59         exit $rc
60 }
61
62 trap clean_dbench ERR HUP INT TERM EXIT
63
64 if [[ -n "$DBENCH_LIB" ]]; then
65         PATH=${DBENCH_LIB}:${PATH}
66 fi
67
68 while getopts "CD:" OPT; do
69         case "$OPT" in
70                 D) test -d "$OPTARG" && DIR="$OPTARG" ;;
71                 C) CHROOT="yes" ;;
72                 \?) usage ;;
73         esac
74 done
75
76 shift $((OPTIND - 1))
77
78 echo "looking for dbench program"
79 if ! type -P dbench; then
80         if [[ -z "$MISSING_DBENCH_OK" ]]; then
81                 error "dbench is not installed"
82         fi
83
84         skip_env "dbench is not installed"
85
86         exit 0
87 fi
88
89 if [[ ! -d "$DIR" ]]; then
90         echo "creating output directory $DIR"
91         mkdir -pv "$DIR"
92 fi
93
94 if ! cd "$DIR"; then
95         error "failed to change directory to $DIR"
96 fi
97
98 if [[ -n "$DBENCH_SRC" && -s "$DBENCH_SRC" ]]; then
99         echo "use dbench client file $DBENCH_SRC"
100         cp -v "$DBENCH_SRC" client.txt
101 else
102         CLIENT_DIRS=(/usr/share/dbench /usr/local/share /usr/lib/dbench)
103         CLIENT_FILES=(client.txt client_plain.txt dbench_client)
104
105         if [[ -n "$DBENCH_LIB" ]]; then
106                 CLIENT_DIRS=("$DBENCH_LIB" "${CLIENT_DIRS[@]}")
107         fi
108
109         for CLIENT_DIR in "${CLIENT_DIRS[@]}"; do
110                 for CLIENT_FILE in "${CLIENT_FILES[@]}"; do
111                         CLIENT_PATH="$CLIENT_DIR/$CLIENT_FILE"
112                         if [[ -s "$CLIENT_PATH" ]]; then
113                                 echo "found dbench client file $CLIENT_PATH"
114                                 cp -v "$CLIENT_PATH" client.txt
115                                 break 2
116                         fi
117                 done
118         done
119 fi
120
121 if [[ ! -s client.txt ]]; then
122         skip_env "no dbench client file found" \
123                 "DBENCH_LIB=$DBENCH_LIB DBENCH_SRC=$DBENCH_SRC"
124         exit 0
125 fi
126
127 if [[ "$CHROOT" == "yes" ]]; then
128         echo "copying required dbench files to chroot directory $DIR"
129         cp -v "$(type -P dbench)" dbench
130         LIBS71=($(ldd dbench | awk '
131                 {
132                         if (NF == 2 && $1 ~ /^[/]/)
133                                 lib = $1
134                         else if (NF == 4 && $3 ~ /^[/]/)
135                                 lib = $3
136                         else
137                                 next
138                         print(substr(lib, 2))
139                 }
140         '))
141         if (( ${#LIBS71[@]} == 0 )); then
142                 error "failed to get required dbench libraries"
143         fi
144         if ! tar -C / -chf - "${LIBS71[@]}" | tar -xvf -; then
145                 error "failed to copy libs ${LIBS71[*]} to $DIR"
146         fi
147         RUN="chroot $DIR"
148         PREFIX="in"
149         PATH=.:/:$PATH
150 fi
151
152 export PATH
153 echo "running 'dbench $*' $PREFIX $DIR at $(date)"
154 $RUN dbench -c client.txt "$@" &
155 DBENCHPID=$!
156 echo "waiting for dbench pid $DBENCHPID"
157 wait $DBENCHPID