1c60587f663d2b800bdae254e86da84b4cfd070e8Bruce Cran#!/usr/bin/env bash
2afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#
3afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#  Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
4afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#  Author: Erwan Velu  <erwan@enovance.com>
5afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#
6afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#  The license below covers all files distributed with fio unless otherwise
7afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#  noted in the file itself.
8afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#
9afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#  This program is free software; you can redistribute it and/or modify
10afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#  it under the terms of the GNU General Public License version 2 as
11afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#  published by the Free Software Foundation.
12afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#
13afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#  This program is distributed in the hope that it will be useful,
14afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#  but WITHOUT ANY WARRANTY; without even the implied warranty of
15afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#  GNU General Public License for more details.
17afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#
18afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#  You should have received a copy of the GNU General Public License
19afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#  along with this program; if not, write to the Free Software
20afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
22afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluBLK_SIZE=
23afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluBLOCK_SIZE=4k
24afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluSEQ=-1
25afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluTEMPLATE=/tmp/template.fio
26afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluOUTFILE=
27afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluDISKS=
28bed59bab819823dffe270435b65ed8feafb52148Erwan VeluPRINTABLE_DISKS=
29afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluRUNTIME=300
30afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluETA=0
3160238f0e7c8bb689f31e3871a661741f2c5fd583Erwan VeluMODES="write,randwrite,read,randread"
32afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluSHORT_HOSTNAME=
3376c7c63e131a5f0068932c78b57eef51bc691810Erwan VeluCACHED_IO="FALSE"
34a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan VeluPREFIX=""
35a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan VeluPREFIX_FILENAME=""
367d1ca6cfa8c1440ddc095faf7f4e6c8716629838Erwan VeluIODEPTH=1
37afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
38afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velushow_help() {
39afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	PROG=$(basename $0)
40afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	echo "usage of $PROG:"
41afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	cat << EOF
42afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu-h				: Show this help & exit
4376c7c63e131a5f0068932c78b57eef51bc691810Erwan Velu-c				: Enable cached-based IOs
44e1c6f2e1ed79734328949dc91aa7ce84281e8112Erwan Velu					Disabled by default
45afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu-a				: Run sequential test then parallel one
46e1c6f2e1ed79734328949dc91aa7ce84281e8112Erwan Velu					Disabled by default
47afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu-s				: Run sequential test (default value)
48afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu					one test after another then one disk after another
49e1c6f2e1ed79734328949dc91aa7ce84281e8112Erwan Velu					Disabled by default
50afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu-p				: Run parallel test
51afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu					one test after anoter but all disks at the same time
52e1c6f2e1ed79734328949dc91aa7ce84281e8112Erwan Velu					Enabled by default
537d1ca6cfa8c1440ddc095faf7f4e6c8716629838Erwan Velu-D iodepth			: Run with the specified iodepth
5480139d2d3f91957854fb6872c34954d641af0e83Erwan Velu					Default is $IODEPTH
55afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu-d disk1[,disk2,disk3,..]	: Run the tests on the selected disks
56afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu					Separated each disk with a comma
57e1c6f2e1ed79734328949dc91aa7ce84281e8112Erwan Velu-r seconds			: Time in seconds per benchmark
5872fe3ef10c1911b6f9ec84af99ba6f97112e216bErwan Velu					0 means till the end of the device
5980139d2d3f91957854fb6872c34954d641af0e83Erwan Velu					Default is $RUNTIME seconds
60afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu-b blocksize[,blocksize1, ...]  : The blocksizes to test under fio format (4k, 1m, ...)
61afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu					Separated each blocksize with a comma
6280139d2d3f91957854fb6872c34954d641af0e83Erwan Velu					Default is $BLOCK_SIZE
63afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu-m mode1,[mode2,mode3, ...]     : Define the fio IO profile to use like read, write, randread, randwrite
6480139d2d3f91957854fb6872c34954d641af0e83Erwan Velu					Default is "$MODES"
65a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu-x prefix			: Add a prefix to the fio filename
66a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu					Useful to let a context associated with the file
67a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu					If the prefix features a / (slash), prefix will be considered as a directory
68ca14375039856a8cb189a19c3381d88fe046d13dErwan Velu-A cmd_to_run			: System command to run after each job (exec_postrun in fio)
69ca14375039856a8cb189a19c3381d88fe046d13dErwan Velu-B cmd_to_run			: System command to run before each job (exec_prerun in fio)
70afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
71afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluExample:
72afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
73bed59bab819823dffe270435b65ed8feafb52148Erwan Velu$PROG -d /dev/sdb,/dev/sdc,/dev/sdd,/dev/sde -a -b 4k,128k,1m -r 100 -a -x dellr720-day2/
74afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
75afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	Will generate an fio file that will run
7660238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu		- a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 4k with write,randwrite,read,randread tests
77afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu			ETA ~ 4 tests * 4 disks * 100 seconds
7860238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu		- a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 128k with write,randwrite,read,randread tests
79afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu			ETA ~ 4 tests * 4 disks * 100 seconds
8060238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu		- a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 1m with write,randwrite,read,randread tests
81afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu			ETA ~ 4 tests * 4 disks * 100 seconds
8260238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu		- a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 4k with write,randwrite,read,randread tests
83afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu			ETA ~ 4 tests * 100 seconds
8460238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu		- a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 128k with write,randwrite,read,randread tests
85afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu			ETA ~ 4 tests * 100 seconds
8660238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu		- a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 1m with write,randwrite,read,randread tests
87afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu			ETA ~ 4 tests * 100 seconds
88afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
8960238f0e7c8bb689f31e3871a661741f2c5fd583Erwan VeluGenerating dellr720-day2/localhost-4k,128k,1m-all-write,randwrite,read,randread-sdb,sdc,sdd,sde.fio
90afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluEstimated Time = 6000 seconds : 1 hour 40 minutes
91afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluEOF
92afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu}
93afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
94fdc0f3b646e417497849d4398029f780b0e5262fErwan Velufinish_template() {
95ea0542d939342be73ac2b7f42c68f37273f98412Erwan Veluecho "iodepth=$IODEPTH" >> $TEMPLATE
96afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
9772fe3ef10c1911b6f9ec84af99ba6f97112e216bErwan Veluif [ "$RUNTIME" != "0" ]; then
98ea0542d939342be73ac2b7f42c68f37273f98412Erwan Velu	echo "runtime=$RUNTIME" >> $TEMPLATE
99ea0542d939342be73ac2b7f42c68f37273f98412Erwan Velu	echo "time_based" >> $TEMPLATE
10072fe3ef10c1911b6f9ec84af99ba6f97112e216bErwan Velufi
10172fe3ef10c1911b6f9ec84af99ba6f97112e216bErwan Velu
10276c7c63e131a5f0068932c78b57eef51bc691810Erwan Veluif [ "$CACHED_IO" = "FALSE" ]; then
103ea0542d939342be73ac2b7f42c68f37273f98412Erwan Velu	echo "direct=1" >> $TEMPLATE
10476c7c63e131a5f0068932c78b57eef51bc691810Erwan Velufi
105fdc0f3b646e417497849d4398029f780b0e5262fErwan Velu}
10676c7c63e131a5f0068932c78b57eef51bc691810Erwan Velu
107bed59bab819823dffe270435b65ed8feafb52148Erwan Velu
108bed59bab819823dffe270435b65ed8feafb52148Erwan Veludiskname_to_printable() {
109bed59bab819823dffe270435b65ed8feafb52148Erwan VeluCOUNT=0
110bed59bab819823dffe270435b65ed8feafb52148Erwan Velufor disk in $(echo $@ | tr "," " "); do
111bed59bab819823dffe270435b65ed8feafb52148Erwan Velu	R=$(basename $disk | sed 's|/|_|g')
112bed59bab819823dffe270435b65ed8feafb52148Erwan Velu	COUNT=$(($COUNT + 1))
113bed59bab819823dffe270435b65ed8feafb52148Erwan Velu	if [ $COUNT -eq 1 ]; then
114bed59bab819823dffe270435b65ed8feafb52148Erwan Velu		P="$R"
115bed59bab819823dffe270435b65ed8feafb52148Erwan Velu	else
116bed59bab819823dffe270435b65ed8feafb52148Erwan Velu		P="$P,$R"
117bed59bab819823dffe270435b65ed8feafb52148Erwan Velu	fi
118bed59bab819823dffe270435b65ed8feafb52148Erwan Veludone
119bed59bab819823dffe270435b65ed8feafb52148Erwan Veluecho $P
120bed59bab819823dffe270435b65ed8feafb52148Erwan Velu}
121bed59bab819823dffe270435b65ed8feafb52148Erwan Velu
122fdc0f3b646e417497849d4398029f780b0e5262fErwan Velugen_template() {
123fdc0f3b646e417497849d4398029f780b0e5262fErwan Velucat >$TEMPLATE << EOF
124fdc0f3b646e417497849d4398029f780b0e5262fErwan Velu[global]
125fdc0f3b646e417497849d4398029f780b0e5262fErwan Veluioengine=libaio
126fdc0f3b646e417497849d4398029f780b0e5262fErwan Veluinvalidate=1
127fdc0f3b646e417497849d4398029f780b0e5262fErwan Veluramp_time=5
128fdc0f3b646e417497849d4398029f780b0e5262fErwan VeluEOF
129afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu}
130afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
131afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velugen_seq_suite() {
132afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluTYPE=$1
133bed59bab819823dffe270435b65ed8feafb52148Erwan Veludisk=$2
134bed59bab819823dffe270435b65ed8feafb52148Erwan VeluPRINTABLE_DISK=$(diskname_to_printable $disk)
135afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velucat >> $OUTFILE << EOF
136bed59bab819823dffe270435b65ed8feafb52148Erwan Velu[$TYPE-$PRINTABLE_DISK-$BLK_SIZE-seq]
137afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velustonewall
138afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velubs=$BLK_SIZE
139bed59bab819823dffe270435b65ed8feafb52148Erwan Velufilename=$disk
140afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velurw=$TYPE
141bed59bab819823dffe270435b65ed8feafb52148Erwan Veluwrite_bw_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$PRINTABLE_DISK-$TYPE-seq.results
142bed59bab819823dffe270435b65ed8feafb52148Erwan Veluwrite_iops_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$PRINTABLE_DISK-$TYPE-seq.results
143afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluEOF
144afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluETA=$(($ETA + $RUNTIME))
145afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu}
146afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
147afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velugen_seq_fio() {
148afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velufor disk in $(echo $DISKS | tr "," " "); do
149afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	for mode in $(echo $MODES | tr "," " "); do
150bed59bab819823dffe270435b65ed8feafb52148Erwan Velu		gen_seq_suite "$mode" "$disk"
151afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	done
152afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Veludone
153afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu}
154afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
155afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
156afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velugen_para_suite() {
157afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluTYPE=$1
158afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluNEED_WALL=$2
159afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluD=0
160afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velufor disk in $(echo $DISKS | tr "," " "); do
161bed59bab819823dffe270435b65ed8feafb52148Erwan Velu    PRINTABLE_DISK=$(diskname_to_printable $disk)
162afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu    cat >> $OUTFILE << EOF
163bed59bab819823dffe270435b65ed8feafb52148Erwan Velu[$TYPE-$PRINTABLE_DISK-$BLK_SIZE-para]
164afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velubs=$BLK_SIZE
165afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluEOF
166afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
167afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Veluif [ "$D" = 0 ]; then
168afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu    echo "stonewall" >> $OUTFILE
169afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu    D=1
170afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velufi
171afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
172afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velucat >> $OUTFILE << EOF
173bed59bab819823dffe270435b65ed8feafb52148Erwan Velufilename=$disk
174afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velurw=$TYPE
175bed59bab819823dffe270435b65ed8feafb52148Erwan Veluwrite_bw_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$PRINTABLE_DISK-$TYPE-para.results
176bed59bab819823dffe270435b65ed8feafb52148Erwan Veluwrite_iops_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$PRINTABLE_DISK-$TYPE-para.results
177afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluEOF
178afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Veludone
179afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
180afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluETA=$(($ETA + $RUNTIME))
181afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Veluecho >> $OUTFILE
182afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu}
183afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
184afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velugen_para_fio() {
185afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velufor mode in $(echo $MODES | tr "," " "); do
186afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	gen_para_suite "$mode"
187afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Veludone
188afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu}
189afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
190afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velugen_fio() {
191afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velucase $SEQ in
192afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	2)
193afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu		gen_seq_fio
194afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu		gen_para_fio
195afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	;;
196afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	1)
197afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu		gen_seq_fio
198afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	;;
199afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	0)
200afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu		gen_para_fio
201afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	;;
202afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Veluesac
203afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu}
204afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
205afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Veluparse_cmdline() {
206ca14375039856a8cb189a19c3381d88fe046d13dErwan Veluwhile getopts "hacpsd:b:r:m:x:D:A:B:" opt; do
207afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu  case $opt in
208afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu    h)
209afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	show_help
210afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	exit 0
211afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	;;
212afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu    b)
213afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	BLOCK_SIZE=$OPTARG
214afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	;;
21576c7c63e131a5f0068932c78b57eef51bc691810Erwan Velu    c)
21676c7c63e131a5f0068932c78b57eef51bc691810Erwan Velu	CACHED_IO="TRUE"
21776c7c63e131a5f0068932c78b57eef51bc691810Erwan Velu	;;
218afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu    s)
219afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	if [ "$SEQ" = "-1" ]; then
220afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu		SEQ=1
221afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	fi
222afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu      ;;
223a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu    x)
224a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu	PREFIX=$OPTARG
225a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu	echo "$PREFIX" | grep -q "/"
226a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu	if [ "$?" -eq 0 ]; then
227a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu		mkdir -p $PREFIX
228a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu		# No need to keep the prefix for the log files
229a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu		# we do have a directory for that
230a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu		PREFIX_FILENAME=""
231a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu	else
232a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu		# We need to keep the prefix for the log files
233a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu		PREFIX_FILENAME=$PREFIX
234a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu	fi
235a74198375fe2120fa670e2164cc5b92a06c7dbf0Erwan Velu	;;
236afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu    r)
237afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	RUNTIME=$OPTARG
238afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu      ;;
239afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu    p)
240afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	if [ "$SEQ" = "-1" ]; then
241afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu		SEQ=0
242afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	fi
243afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu      ;;
244afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu    m)
245afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu        MODES=$OPTARG;
246afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu      ;;
247afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu    d)
248afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu 	DISKS=$OPTARG
249bed59bab819823dffe270435b65ed8feafb52148Erwan Velu	PRINTABLE_DISKS=$(diskname_to_printable "$DISKS")
250afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu      ;;
2517d1ca6cfa8c1440ddc095faf7f4e6c8716629838Erwan Velu    D)
2527d1ca6cfa8c1440ddc095faf7f4e6c8716629838Erwan Velu	IODEPTH=$OPTARG
2537d1ca6cfa8c1440ddc095faf7f4e6c8716629838Erwan Velu      ;;
254afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu    a)
255afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	SEQ=2
256afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu      ;;
257ca14375039856a8cb189a19c3381d88fe046d13dErwan Velu    B)
258ca14375039856a8cb189a19c3381d88fe046d13dErwan Velu	echo "exec_prerun=$OPTARG" >> $TEMPLATE
259ca14375039856a8cb189a19c3381d88fe046d13dErwan Velu      ;;
260ca14375039856a8cb189a19c3381d88fe046d13dErwan Velu    A)
261ca14375039856a8cb189a19c3381d88fe046d13dErwan Velu	echo "exec_postrun=$OPTARG" >> $TEMPLATE
262ca14375039856a8cb189a19c3381d88fe046d13dErwan Velu      ;;
263afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu    \?)
264afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu      echo "Invalid option: -$OPTARG" >&2
265afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu      ;;
266afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu  esac
267afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Veludone
268afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
269afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Veluif [ "$SEQ" = "-1" ]; then
270afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	SEQ=0
271afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velufi
272afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
273afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluSHORT_HOSTNAME=$(hostname -s)
274afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velucase $SEQ in
275afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	2)
276bed59bab819823dffe270435b65ed8feafb52148Erwan Velu		OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-all-$MODES-$PRINTABLE_DISKS.fio
277afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	;;
278afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
279afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	1)
280bed59bab819823dffe270435b65ed8feafb52148Erwan Velu		OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-sequential-$MODES-$PRINTABLE_DISKS.fio
281afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	;;
282afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	0)
283bed59bab819823dffe270435b65ed8feafb52148Erwan Velu		OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-parallel-$MODES-$PRINTABLE_DISKS.fio
284afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	;;
285afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Veluesac
286afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
287afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Veluif [ -z "$DISKS" ]; then
288afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	echo "Missing DISKS !"
289e1c6f2e1ed79734328949dc91aa7ce84281e8112Erwan Velu	echo "Please read the help !"
290e1c6f2e1ed79734328949dc91aa7ce84281e8112Erwan Velu	show_help
291afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	exit 1
292afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velufi
293afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
294afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu}
295afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
29660238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velucheck_mode_order() {
29760238f0e7c8bb689f31e3871a661741f2c5fd583Erwan VeluFOUND_WRITE="NO"
29860238f0e7c8bb689f31e3871a661741f2c5fd583Erwan VeluCAUSE="You are reading data before writing them          "
29960238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu
30060238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu# If no write occurs, let's show a different message
30160238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Veluecho $MODES | grep -q "write"
30260238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Veluif [ "$?" -ne 0 ]; then
30360238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu	CAUSE="You are reading data while never wrote them before"
30460238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velufi
30560238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu
30660238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velufor mode in $(echo $MODES | tr "," " "); do
30760238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu	echo $mode | grep -q write
30860238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu	if [ "$?" -eq 0 ]; then
30960238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu		FOUND_WRITE="YES"
31060238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu	fi
31160238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu	echo $mode | grep -q "read"
31260238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu	if [ "$?" -eq 0 ]; then
31360238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu		if [ "$FOUND_WRITE" = "NO" ]; then
31460238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu			echo "###############################################################"
31560238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu			echo "# Warning : $CAUSE#"
31660238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu			echo "# On some storage devices, this could lead to invalid results #"
31760238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu			echo "#                                                             #"
31860238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu			echo "# Press Ctrl-C to adjust pattern order if you have doubts     #"
31960238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu			echo "# Or Wait 5 seconds before the file will be created           #"
32060238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu			echo "###############################################################"
32160238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu			sleep 5
32260238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu			# No need to try showing the message more than one time
32360238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu			return
32460238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu		fi
32560238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu	fi
32660238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Veludone
32760238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu}
32860238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velu
329afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
330afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu########## MAIN
331fdc0f3b646e417497849d4398029f780b0e5262fErwan Velugen_template
3323b73c537d03dd981ab1fa0aaae7892b8ff125114Erwan Veluparse_cmdline "$@"
333fdc0f3b646e417497849d4398029f780b0e5262fErwan Velufinish_template
33460238f0e7c8bb689f31e3871a661741f2c5fd583Erwan Velucheck_mode_order
335afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
336afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Veluecho "Generating $OUTFILE"
337afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velucp -f $TEMPLATE $OUTFILE
338afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Veluecho >> $OUTFILE
339afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu
340afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velufor BLK_SIZE in $(echo $BLOCK_SIZE | tr "," " "); do
341afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Velu	gen_fio
342afbbd646716a9e046bd6805f17214689d15a6ba6Erwan Veludone
343afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluETA_H=$(($ETA / 3600))
344afbbd646716a9e046bd6805f17214689d15a6ba6Erwan VeluETA_M=$((($ETA - ($ETA_H*3600)) / 60))
345af360e392d3c9f6a299596adfcfef8de2f198ad2Erwan Veluif [ "$ETA" = "0" ]; then
34672fe3ef10c1911b6f9ec84af99ba6f97112e216bErwan Velu	echo "Cannot estimate ETA as RUNTIME=0"
34772fe3ef10c1911b6f9ec84af99ba6f97112e216bErwan Veluelse
34872fe3ef10c1911b6f9ec84af99ba6f97112e216bErwan Velu	echo "Estimated Time = $ETA seconds : $ETA_H hour $ETA_M minutes"
34972fe3ef10c1911b6f9ec84af99ba6f97112e216bErwan Velufi
350