genfio: Don't use cat EOF for small prints
[fio.git] / tools / genfio
index 3599450663e83951dda78a1697e81b43f38678e8..0bc24cb1d475e43d413b50c3c488cd6ae14c6865 100755 (executable)
@@ -27,11 +27,12 @@ OUTFILE=
 DISKS=
 RUNTIME=300
 ETA=0
-MODES="read,write,randread,randwrite"
+MODES="write,randwrite,read,randread"
 SHORT_HOSTNAME=
 CACHED_IO="FALSE"
 PREFIX=""
 PREFIX_FILENAME=""
+IODEPTH=1
 
 show_help() {
        PROG=$(basename $0)
@@ -48,6 +49,8 @@ show_help() {
 -p                             : Run parallel test
                                        one test after anoter but all disks at the same time
                                        Enabled by default
+-D iodepth                     : Run with the specified iodepth
+                                       Default is 32
 -d disk1[,disk2,disk3,..]      : Run the tests on the selected disks
                                        Separated each disk with a comma
                                        Disk name shall be "sdxx", /dev/ shall NOT be used here
@@ -58,54 +61,56 @@ show_help() {
                                        Separated each blocksize with a comma
                                        Default is 4k
 -m mode1,[mode2,mode3, ...]     : Define the fio IO profile to use like read, write, randread, randwrite
-                                       Default is "read,write,randread,randwrite"
+                                       Default is "write,randwrite,read,randread"
 -x prefix                      : Add a prefix to the fio filename
                                        Useful to let a context associated with the file
                                        If the prefix features a / (slash), prefix will be considered as a directory
+-A cmd_to_run                  : System command to run after each job (exec_postrun in fio)
+-B cmd_to_run                  : System command to run before each job (exec_prerun in fio)
 
 Example:
 
 $PROG -d sdb,sdc,sdd,sde -a -b 4k,128k,1m -r 100 -a -x dellr720-day2/
 
        Will generate an fio file that will run
-               - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 4k with read,write,randread,randwrite tests
+               - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 4k with write,randwrite,read,randread tests
                        ETA ~ 4 tests * 4 disks * 100 seconds
-               - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 128k with read,write,randread,randwrite tests
+               - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 128k with write,randwrite,read,randread tests
                        ETA ~ 4 tests * 4 disks * 100 seconds
-               - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 1m with read,write,randread,randwrite tests
+               - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 1m with write,randwrite,read,randread tests
                        ETA ~ 4 tests * 4 disks * 100 seconds
-               - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 4k with read,write,randread,randwrite tests
+               - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 4k with write,randwrite,read,randread tests
                        ETA ~ 4 tests * 100 seconds
-               - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 128k with read,write,randread,randwrite tests
+               - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 128k with write,randwrite,read,randread tests
                        ETA ~ 4 tests * 100 seconds
-               - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 1m with read,write,randread,randwrite tests
+               - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 1m with write,randwrite,read,randread tests
                        ETA ~ 4 tests * 100 seconds
 
-Generating dellr720-day2/localhost-4k,128k,1m-all-read,write,randread,randwrite-sdb,sdc,sdd,sde.fio
+Generating dellr720-day2/localhost-4k,128k,1m-all-write,randwrite,read,randread-sdb,sdc,sdd,sde.fio
 Estimated Time = 6000 seconds : 1 hour 40 minutes
 EOF
 }
 
-gen_template() {
-cat >$TEMPLATE << EOF
-[global]
-ioengine=libaio
-invalidate=1
-ramp_time=5
-EOF
+finish_template() {
+echo "iodepth=$IODEPTH" >> $TEMPLATE
 
 if [ "$RUNTIME" != "0" ]; then
-cat >>$TEMPLATE << EOF
-runtime=$RUNTIME
-EOF
+       echo "runtime=$RUNTIME" >> $TEMPLATE
+       echo "time_based" >> $TEMPLATE
 fi
 
 if [ "$CACHED_IO" = "FALSE" ]; then
-cat >>$TEMPLATE << EOF
-direct=1
-EOF
+       echo "direct=1" >> $TEMPLATE
 fi
+}
 
+gen_template() {
+cat >$TEMPLATE << EOF
+[global]
+ioengine=libaio
+invalidate=1
+ramp_time=5
+EOF
 }
 
 gen_seq_suite() {
@@ -180,7 +185,7 @@ esac
 }
 
 parse_cmdline() {
-while getopts "hacpsd:b:r:m:x:" opt; do
+while getopts "hacpsd:b:r:m:x:D:A:B:" opt; do
   case $opt in
     h)
        show_help
@@ -224,9 +229,18 @@ while getopts "hacpsd:b:r:m:x:" opt; do
     d)
        DISKS=$OPTARG
       ;;
+    D)
+       IODEPTH=$OPTARG
+      ;;
     a)
        SEQ=2
       ;;
+    B)
+       echo "exec_prerun=$OPTARG" >> $TEMPLATE
+      ;;
+    A)
+       echo "exec_postrun=$OPTARG" >> $TEMPLATE
+      ;;
     \?)
       echo "Invalid option: -$OPTARG" >&2
       ;;
@@ -260,10 +274,45 @@ fi
 
 }
 
+check_mode_order() {
+FOUND_WRITE="NO"
+CAUSE="You are reading data before writing them          "
+
+# If no write occurs, let's show a different message
+echo $MODES | grep -q "write"
+if [ "$?" -ne 0 ]; then
+       CAUSE="You are reading data while never wrote them before"
+fi
+
+for mode in $(echo $MODES | tr "," " "); do
+       echo $mode | grep -q write
+       if [ "$?" -eq 0 ]; then
+               FOUND_WRITE="YES"
+       fi
+       echo $mode | grep -q "read"
+       if [ "$?" -eq 0 ]; then
+               if [ "$FOUND_WRITE" = "NO" ]; then
+                       echo "###############################################################"
+                       echo "# Warning : $CAUSE#"
+                       echo "# On some storage devices, this could lead to invalid results #"
+                       echo "#                                                             #"
+                       echo "# Press Ctrl-C to adjust pattern order if you have doubts     #"
+                       echo "# Or Wait 5 seconds before the file will be created           #"
+                       echo "###############################################################"
+                       sleep 5
+                       # No need to try showing the message more than one time
+                       return
+               fi
+       fi
+done
+}
+
 
 ########## MAIN
-parse_cmdline $@
 gen_template
+parse_cmdline $@
+finish_template
+check_mode_order
 
 echo "Generating $OUTFILE"
 cp -f $TEMPLATE $OUTFILE