[Tarantool-patches] [PATCH 2/2] install: local benchmarks installation scripts

Oleg Koshovetc okoshovetc at tarantool.org
Tue Dec 8 14:38:16 MSK 2020


All of the following can be accessed on github

https://github.com/tarantool/bench-run/pull/14

The 'install' command was added to ttbench. It clones benchmarks and
installs them localy so the developers do not have to do it themselves.
Also added the -s flag that suppresses all the output on any command
---
  benches/cbench/install.sh     |   8 ++
  benches/common.sh             |  18 +++-
  benches/linkbench/install.sh  |   8 ++
  benches/linkbench/run.sh      |   6 +-
  benches/nosqlbench/install.sh |   8 ++
  benches/sysbench/install.sh   |   8 ++
  benches/tpcc/install.sh       |   8 ++
  benches/tpch/install.sh       |   5 +
  benches/ycsb/install.sh       |   6 ++
  config.sh                     |  38 ++++---
  ttbench                       | 232 
++++++++++++++++++++++++++++++++++--------
  11 files changed, 290 insertions(+), 55 deletions(-)
  create mode 100755 benches/cbench/install.sh
  create mode 100755 benches/linkbench/install.sh
  create mode 100755 benches/nosqlbench/install.sh
  create mode 100755 benches/sysbench/install.sh
  create mode 100755 benches/tpcc/install.sh
  create mode 100755 benches/tpch/install.sh
  create mode 100755 benches/ycsb/install.sh

diff --git a/benches/cbench/install.sh b/benches/cbench/install.sh
new file mode 100755
index 0000000..39046a0
--- /dev/null
+++ b/benches/cbench/install.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+git clone https://github.com/tarantool/cbench.git "$PWD"
+
+cmake . -DCMAKE_BUILD_TYPE=RelWithDebInfo
+make -j
diff --git a/benches/common.sh b/benches/common.sh
index 1116cc9..abc99d7 100644
--- a/benches/common.sh
+++ b/benches/common.sh
@@ -65,7 +65,9 @@ function kill_tarantool {
  }

  function error {
-    echo "ERROR:" "$@"
+    local _caller
+    _caller=( $(caller 0) )
+    echo "${_caller[2]} line=${_caller[0]} fn=${_caller[1]} ERROR:" "$@"
      exit 100
  }

@@ -97,7 +99,7 @@ function wait_for_tarantool_runnning {
      local tt=0

      while [ "$tt" -lt "$t" ]; do
-        if echo 'if type(box.cfg) ~= "function" then return 
box.info().status end' | tarantoolctl connect "$creds" 2>/dev/null | 
grep -q 'running'; then
+        if echo 'if type(box.cfg) ~= "function" then return 
box.info().status end' | "$TARANTOOLCTL_EXECUTABLE" connect "$creds" 
2>/dev/null | grep -q 'running'; then
              return 0
          fi

@@ -107,3 +109,15 @@ function wait_for_tarantool_runnning {

      return 1
  }
+
+function is_directory_empty {
+    local d="$1"
+
+    [ ! -d "$d" ] && error "no such directory '$d'"
+
+    if find "$d/" -maxdepth 1 -mindepth 1 | grep -q .; then
+        return 1
+    else
+        return 0
+    fi
+}
diff --git a/benches/linkbench/install.sh b/benches/linkbench/install.sh
new file mode 100755
index 0000000..2aa5386
--- /dev/null
+++ b/benches/linkbench/install.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+git clone https://github.com/tarantool/linkbench.git -b update-fixes "$PWD"
+
+luarocks install 
https://raw.githubusercontent.com/tarantool/gperftools/master/rockspecs/gperftools-scm-1.rockspec 
\
+    --tree .rocks --lua-version 5.1
diff --git a/benches/linkbench/run.sh b/benches/linkbench/run.sh
index c5f493e..739c46e 100755
--- a/benches/linkbench/run.sh
+++ b/benches/linkbench/run.sh
@@ -18,7 +18,11 @@ make -C src/tarantool -B
  tfile=src/tarantool/app.lua

  stop_and_clean_tarantool
-maybe_under_numactl "${numaopts[@]}" -- tarantool "$tfile" 1>/dev/null 
2>/dev/null &
+
+lua_path_prefix="$PWD/.rocks/share/lua/5.1"
+
+export LUA_PATH="$lua_path_prefix/?.lua;$lua_path_prefix/?/init.lua"
+maybe_under_numactl "${numaopts[@]}" -- tarantool "$tfile" 
1>ttserver.log 2>&1 &

  cfgfile=config/LinkConfigTarantool.properties
  sed "s/^maxid1 = .*/maxid1 = $LINKBENCH_WORKLOAD_SIZE/g" -i 
config/FBWorkload.properties
diff --git a/benches/nosqlbench/install.sh b/benches/nosqlbench/install.sh
new file mode 100755
index 0000000..5659613
--- /dev/null
+++ b/benches/nosqlbench/install.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+git clone --recursive https://github.com/tarantool/nosqlbench.git "$PWD"
+git submodule foreach --recursive
+cmake .
+make -j
diff --git a/benches/sysbench/install.sh b/benches/sysbench/install.sh
new file mode 100755
index 0000000..9678254
--- /dev/null
+++ b/benches/sysbench/install.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+git clone https://github.com/tarantool/sysbench.git "$PWD"
+./autogen.sh
+./configure --with-tarantool --without-mysql
+make -j
diff --git a/benches/tpcc/install.sh b/benches/tpcc/install.sh
new file mode 100755
index 0000000..d6e827e
--- /dev/null
+++ b/benches/tpcc/install.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+git clone https://github.com/tarantool/tpcc.git "$PWD"
+cd src
+make -j
+cd ..
diff --git a/benches/tpch/install.sh b/benches/tpch/install.sh
new file mode 100755
index 0000000..2ee1e14
--- /dev/null
+++ b/benches/tpch/install.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+git clone https://github.com/tarantool/tpch.git "$PWD"
diff --git a/benches/ycsb/install.sh b/benches/ycsb/install.sh
new file mode 100755
index 0000000..5c536ea
--- /dev/null
+++ b/benches/ycsb/install.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+git clone https://github.com/tarantool/YCSB.git "$PWD"
+mvn clean package
diff --git a/config.sh b/config.sh
index 93d3fc5..bd6f558 100644
--- a/config.sh
+++ b/config.sh
@@ -1,41 +1,55 @@
  # path to tarantool executable
  export TARANTOOL_EXECUTABLE=tarantool

+# path to tarantoolctl executable
+export TARANTOOLCTL_EXECUTABLE=tarantoolctl
+
  # location of tests to be run
+# all the tests will be copied and run in this directory
  export BENCH_WORKDIR="$PWD/.benchdir"

-# cbench parameters
  export CBENCH_DIR="$HOME/work/cbench/"
+export LINKBENCH_DIR="$HOME/work/linkbench/"
+export NOSQLBENCH_DIR="$HOME/work/nosqlbench/"
+export SYSBENCH_DIR="$HOME/work/sysbench/"
+export TPCC_DIR="$HOME/work/tpcc/"
+export TPCH_DIR="$HOME/work/tpch/"
+export YCSB_DIR="$HOME/work/ycsb/"
+
+# ----------------- BENCHMARK PARAMS -----------------
+# Fill free to delete all the params as long as all
+# the benchmarks have their own defaults set in run.sh
+
+# cbench parameters
  export CBENCH_VINYL_WORKLOAD=50
  export CBENCH_MEMTX_WORKLOAD=10000

  # linkbench parameters
-export LINKBENCH_DIR="$HOME/work/linkbench/"
  export LINKBENCH_REQUESTERS=1
  export LINKBENCH_REQUESTS=1000
  export LINKBENCH_WORKLOAD_SIZE=1000

-# linkbench parameters
-export NOSQLBENCH_DIR="$HOME/work/nosqlbench/"
+# nosqlbench parameters
+export NOSQLBENCH_TIMELIMIT=20000
+export NOSQLBENCH_BATCHCOUNT=10
+export NOSQLBENCH_RPS=20000

-# linkbench parameters
-export SYSBENCH_DIR="$HOME/work/sysbench/"
+# sysbench parameters
  export SYSBENCH_RUNS=1
  export SYSBENCH_TIME=5

  # tpcc parameters
-export TPCC_DIR="$HOME/work/tpcc/"
  export TPCC_TIME=20
  export TPCC_WARMUPTIME=5
  export TPCC_WAREHOUSES=15
-export TPCC_FROMSNAPSHOT="/tmp/00000000000000033515.snap"
+## possible to start tpcc benchmark from snapshot wich I higly recommend
+## as tpcc_load takes a good portion of time to load the data
+# export TPCC_FROMSNAPSHOT="/tmp/00000000000000033515.snap"

-# tpcc parameters
-export TPCH_DIR="$HOME/work/tpch/"
+# tpch parameters
  export TPCH_SKIP_SQLITE=1

-# tpcc parameters
-export YCSB_DIR="$HOME/work/ycsb/"
+# ycsb parameters
  export YCSB_OPERATIONCOUNT=1000
  export YCSB_RECORDCOUNT=1000
  export YCSB_RUNS=1
diff --git a/ttbench b/ttbench
index ac656f5..b856820 100755
--- a/ttbench
+++ b/ttbench
@@ -4,72 +4,174 @@ set -euo pipefail

  TTBENCH_CONFIG=config.sh
  TTBENCH_BENCHES=all
+TTBENCH_SILENT=
+TTBENCH_FORCE=
  TTBENCH_COMMAND=
  TTBENCH_BENCHDIR=benches

-function error {
-    echo "ERROR:" "$@"
-    exit 100
-}
+TTBENCH_ENV_OVERRIDES=()
+
+source "$TTBENCH_BENCHDIR/common.sh"

  function print_help {
      grep '^\s*# HELP' "$0" | sed 's/^\s*# HELP\s//g'
  }

-function list_benchmarks {
+function maybe_silently {
+    if [ -z "$TTBENCH_SILENT" ]; then
+        "$@"
+    else
+        "$@" 1>/dev/null 2>/dev/null
+    fi
+}
+
+function list_all_benchmarks {
      for d in $TTBENCH_BENCHDIR/*; do
          sed "s#$TTBENCH_BENCHDIR/##" <<< "$d"
      done | grep -v common.sh
  }

+function list_given_benchmarks {
+    if [ "$TTBENCH_BENCHES" == all ]; then
+        for b in $(list_all_benchmarks); do
+            echo "$b"
+        done
+    else
+        IFS=, read -ra benchlist <<< "$TTBENCH_BENCHES"
+        for b in "${benchlist[@]}"; do
+            if [ ! -d "$TTBENCH_BENCHDIR/$b" ]; then
+                error "Unknown benchmark='$b', please run '$0 
list-benchmarks'"
+            fi
+        done
+
+        for b in "${benchlist[@]}"; do
+            echo "$b"
+        done
+    fi
+}
+
+function get_bench_dir {
+    local bench="$1"
+    if benchdir=$(env | grep "${bench^^}_DIR" | sed 's/^.*=//'); then
+        echo "$benchdir"
+    else
+        error "variable '${bench^^}_DIR' is not set in config"
+    fi
+}
+
  function run_bench {
      local bench="$1"
      local benchdir=
      local workdir="${BENCH_WORKDIR:?}/$bench/"

+    mkdir -p "$BENCH_WORKDIR"
      cp "$TTBENCH_BENCHDIR/common.sh" "${BENCH_WORKDIR}"

      export COMMON_FUNCTIONS="$BENCH_WORKDIR/common.sh"

-    if benchdir=$(env | grep "${bench^^}_DIR" | sed 's/^.*=//'); then
-        echo "Running $bench with workdir $benchdir" 1>&2
-        rm -rf "$workdir"
-        mkdir -p "$workdir"
-
-        cp -r "$TTBENCH_BENCHDIR/$bench"/* "$workdir"
-        cp -r "$benchdir"/* "$workdir"
-
-        local runner=
-        runner=$(readlink -f "$TTBENCH_BENCHDIR/$bench/run.sh")
-        pushd "$workdir" 1>/dev/null
-        "$runner"
-        popd 1>/dev/null
-    else
-        error "variable '${bench^^}_DIR' is not set in config, can't 
run benchmark"
-    fi
+    local benchdir=
+    benchdir=$(get_bench_dir "$bench")
+
+    echo "Running $bench with workdir $benchdir" 1>&2
+    rm -rf "$workdir"
+    mkdir -p "$workdir"
+
+    cp -r "$TTBENCH_BENCHDIR/$bench"/* "$workdir"
+    cp -r "$benchdir"/* "$workdir"
+
+    # some of benchmarks have external dependencies that are stored in 
.rocks directory
+    # but some of benchmark do not have them
+    cp -r "$benchdir"/.rocks "$workdir" 2>/dev/null || true
+
+    local runner=
+    runner=$(readlink -f "$TTBENCH_BENCHDIR/$bench/run.sh")
+    pushd "$workdir" 1>/dev/null
+    "$runner"
+    popd 1>/dev/null
  }

  function run_benchmarks {
      # must be set in config
-    [ -z "$BENCH_WORKDIR" ] && error "BENCH_WORKDIR is not set"
+    [ -z "$BENCH_WORKDIR" ]           && error "BENCH_WORKDIR is not set"
+    [ -z "$TARANTOOL_EXECUTABLE" ]    && error "TARANTOOL_EXECUTABLE is 
not set"
+    [ -z "$TARANTOOLCTL_EXECUTABLE" ] && error "TARANTOOLCTL_EXECUTABLE 
is not set"

-    if [ "$TTBENCH_BENCHES" == all ]; then
-        for b in $(list_benchmarks); do
-            run_bench "$b"
-        done
-    else
-        IFS=, read -ra benchlist <<< "$TTBENCH_BENCHES"
-        # local benchlist=( $(sed 's/,/ /g' <<< "$TTBENCH_BENCHES") );
-        for b in "${benchlist[@]}"; do
-            if [ ! -d "$TTBENCH_BENCHDIR/$b" ]; then
-                error "Unknown benchmark='$b', please run '$0 
list-benchmarks'"
-            fi
-        done
+    for b in $(list_given_benchmarks); do
+        run_bench "$b"
+    done
+}

-        for b in "${benchlist[@]}"; do
-            run_bench "$b"
-        done
+function install_benchmark {
+    local bench="$1"
+
+    local benchdir=
+    benchdir=$(get_bench_dir "$bench")
+
+    mkdir -p "$benchdir"
+
+    if ! is_directory_empty "$benchdir"; then
+        if [ -z "$TTBENCH_FORCE" ]; then
+            error "'$benchdir' is not empty, use --force flag to reinstall"
+        fi
+    fi
+
+    local bdir=
+    bdir=$(realpath "$benchdir")
+
+    local install_path_ok=
+
+    if [[ "$bdir" == /home/* ]]; then
+        install_path_ok=1
+    fi
+
+    if [[ "$bdir" == /opt/* ]]; then
+        install_path_ok=1
+    fi
+
+    if [[ "$bdir" == /tmp/* ]]; then
+        install_path_ok=1
+    fi
+
+    if [ -z "$install_path_ok" ]; then
+        echo "ERROR: benchmark install directory='$bdir' is"
+        echo "ERROR: neither under /home/"
+        echo "ERROR: nor under /opt/"
+        echo "ERROR: nor under /tmp/"
+        echo "ERROR: any other installation path is considered to be 
unsafe"
+        echo "ERROR: as it is required to run rm -rf on benchmark 
insall directory"
+        echo "ERROR: if you think this is an error, consider patching 
$0 yourself"
+        echo "ERROR: or installing the benchmarks manually"
+        error "unsafe install directory='$bdir' detected"
      fi
+
+    rm -rf "${bdir:?}"
+    mkdir -p "$bdir"
+
+    local install_script="$TTBENCH_BENCHDIR/$bench/install.sh"
+    [ ! -f "$install_script" ] && error
+    install_script=$(readlink -f "$TTBENCH_BENCHDIR/$bench/install.sh")
+
+    pushd "$bdir" 1>/dev/null
+    "$install_script"
+    popd 1>/dev/null
+}
+
+function run_install {
+    local benchlist
+    benchlist=( $(list_given_benchmarks) )
+
+    # running this in single loop for a side effect where get_bench_dir
+    # will raise an error if some env variables are not set
+    for b in "${benchlist[@]}"; do
+        get_bench_dir "$b"
+        if [ ! -f "$TTBENCH_BENCHDIR/$b/install.sh" ]; then
+            error "$TTBENCH_BENCHDIR/$b is missing install.sh script"
+        fi
+    done
+
+    for b in "${benchlist[@]}"; do
+        install_benchmark "$b"
+    done
  }

  # HELP ttbench - launch tarantool external benchmarks
@@ -96,6 +198,20 @@ while [[ $# -gt 0 ]]; do
              set -x
              shift;;

+        # HELP   -f, --force
+        # HELP           if used with install command, will reinstall 
benchmarks
+        # HELP
+        -f|--force)
+            TTBENCH_FORCE=1
+            shift;;
+
+        # HELP   -s, --silent
+        # HELP           suppress any output, just give an exit code
+        # HELP
+        -s|--silent)
+            TTBENCH_SILENT=1
+            shift;;
+
          # HELP   -b, --benchmarks 'bench1,bench2'
          # HELP           comma separated list of benchmarks (defauts 
to 'all')
          # HELP
@@ -104,6 +220,25 @@ while [[ $# -gt 0 ]]; do
              [ -z "$TTBENCH_BENCHES" ] && error "$option param can not 
be empty"
              shift 2;;

+        # HELP   -D, --define KEY=VALUE
+        # HELP   -DKEY=VALUE
+        # HELP           allows to define extra ENV variables
+        # HELP           or rewrite ones in config file from command line
+        # HELP
+        -D|--define|-D*)
+            case "$option" in
+                -D|--define)
+                    override="${2:-}"
+                    [ -z "$override" ] && error "$option param can not 
be empty"
+                    TTBENCH_ENV_OVERRIDES+=( "$override" )
+                    shift 2;;
+                -D*)
+                    override="${option#-D}"
+                    [ -z "$override" ] && error "$option param can not 
be empty"
+                    TTBENCH_ENV_OVERRIDES+=( "$override" )
+                    shift;;
+            esac;;
+
          # HELP   -h, --help
          # HELP           print help message
          # HELP
@@ -116,7 +251,18 @@ while [[ $# -gt 0 ]]; do
      esac
  done

-[ -f "$TTBENCH_CONFIG" ] && source "$TTBENCH_CONFIG"
+if [ -f "$TTBENCH_CONFIG" ]; then
+    source "$TTBENCH_CONFIG"
+else
+    error "config file='$TTBENCH_CONFIG' is absent"
+fi
+
+# Disgusting hack for empty arrays on bash < 4.4
+if [ 0 -ne "${#TTBENCH_ENV_OVERRIDES[@]}" ]; then
+    for override in "${TTBENCH_ENV_OVERRIDES[@]}"; do
+        export "$override"
+    done
+fi

  TTBENCH_COMMAND="${1:-}"

@@ -135,12 +281,18 @@ case "$TTBENCH_COMMAND" in
      # HELP           lists all known benchmarks
      # HELP
      ls|list-benchmarks)
-        list_benchmarks;;
+        maybe_silently list_all_benchmarks;;

      # HELP   run
      # HELP           run benchmarks specified by --benchmarks flag
+    # HELP
      run)
-        run_benchmarks;;
+        maybe_silently run_benchmarks;;
+
+    # HELP   install
+    # HELP           install benchmarks specified by --benchmarks flag
+    install)
+        maybe_silently run_install;;

      *)
          print_help
-- 
2.7.4




More information about the Tarantool-patches mailing list