#!/bin/bash
#Need an argument for the test file
create_my_cnf()
{
  my_cnf=$1.cnf
  if [[ "$2" == "simple" ]]
  then
    echo "!include include/default_my.cnf" > ${my_cnf}
  else
    echo "!include suite/rpl/rpl_1slave_base.cnf" > ${my_cnf}
  fi

cat >> ${my_cnf} <<EOF
[mysqld]
max-connections = 3000
key-buffer-size = 200M
back-log = 1500
query-cache-type = 0

# files
innodb-file-per-table
innodb-open-files = 4000
table-open-cache = 2048
table-open-cache-instances = 16

# buffers
innodb-log-buffer-size = 64M
join-buffer-size = 32K
sort-buffer-size = 32K

# tune
innodb-checksums = 0
innodb-doublewrite = 0
innodb-support-xa = 1
innodb-thread-concurrency = 0
innodb-flush-log-at-trx-commit = 2
#innodb-flush-method = O_DIRECT
innodb-max-dirty-pages-pct = 75
innodb-use-native-aio = 0
innodb-stats-persistent = 1
# from 6 to 96
innodb-spin-wait-delay = 24

# perf special
innodb-adaptive-flushing = ON
innodb-flush-neighbors = 1
innodb-read-io-threads = 16
innodb-write-io-threads = 16
innodb-io-capacity = 200
innodb-purge-threads = 1
innodb-adaptive-hash-index =  ON

# Monitoring
innodb-monitor-enable = '%'
performance-schema = ON
performance-schema-instrument = '%=on'

[mysqld.1]
innodb-buffer-pool-size = 2G
innodb-buffer-pool-instances = 2
innodb-log-file-size = 512M
innodb-log-files-in-group = 2
sync-binlog = 0
binlog-max-flush-queue-time=0

[mysqld.2]
sync-master-info = 0
sync-relay-log = 0
sync-relay-log-info = 0
#slave-parallel-workers = 100
EOF
}

# $1 is the name of the test. e.g t/my_test
# $2 is the type of the test {simple|rpl|semisync}
create_test()
{
  cat > $1.test <<EOF
--source include/have_innodb.inc
--source include/have_log_bin.inc
EOF

  if [[ "${2}" == "rpl" || "${2}" == "semisync" ]]
  then
    cat >> $1.test <<EOF
--source include/master-slave.inc
#--source include/rpl_connection_slave.inc
#--source include/stop_slave_sql.inc
#--source include/rpl_connection_master.inc
EOF
    if [[ "${2}" == "semisync" ]]
    then
      cat >> $1.test <<EOF
--source include/install_semisync.inc
EOF

      cat >> $1-master.opt <<EOF
\$SEMISYNC_PLUGIN_OPT
EOF

      cat > $1-slave.opt <<EOF
\$SEMISYNC_PLUGIN_OPT
EOF
    fi
  fi

  cat >> $1.test <<EOF
CREATE DATABASE my_test;
--sleep 3600
EOF

  create_my_cnf $1 $2
}

#Need an argument for the test file
run_test_case()
{
  rm -fr var/mysqld.1/data/my_test
  ./mtr $1.test --testcase-timeout=3600 --mem &

  while [[ ! -d var/mysqld.1/data/my_test ]]
  do
    sleep 1
  done
}

shutdown_servers()
{
  if [[ -d var/run ]]
  then
    cd var/run
    for pid in `cat *.pid`
    do
      kill ${pid}
      while [[ -d /proc/${pid} ]]
      do
	sleep 1
      done
    done
    cd -
  fi
}

create_SQLs()
{
  cat > var/create.sql <<EOF
CREATE TABLE t1(c1 CHAR(46) PRIMARY KEY, c2 INT) ENGINE=InnoDB;
EOF

  cat > var/query.sql <<EOF
INSERT INTO t1 VALUES(uuid(), 1);
EOF
}

run_mysqlslap_select()
{
  args="-S var/tmp/mysqld.1.sock -u root"
  #args="${args} --create=var/create.sql --query=var/query.sql"
  #--number-char-cols=1
  args="${args} --number-int-cols=2 --auto-generate-sql --engine=blackhole"
  args="${args} --auto-generate-sql-guid-primary"
  args="${args} --auto-generate-sql-unique-write-number=32000"
  args="${args} --auto-generate-sql-write-number=32000"
  #args="${args} --auto-generate-sql-load-type=write"
  args="${args} --auto-generate-sql-load-type=key"
  #args="${args} --auto-generate-sql-write-number=32000"
  args="${args} --auto-generate-sql-unique-query-number=32000"
  args="${args} -i 5"
  args="${args} --number-of-queries=32000"
  args="${args} -c 2,4,8,16,32"
  echo mysqlslap ${args}
  ../client/mysqlslap $args
}

run_mysqlslap_insert()
{
  args="-S var/tmp/mysqld.1.sock -u root"
  #args="${args} --create=var/create.sql --query=var/query.sql"
  #--number-char-cols=1
  #args="${args} --number-int-cols=2"
  args="${args} --auto-generate-sql --engine=innodb"
  #args="${args} --auto-generate-sql-add-autoincrement"
  #args="${args} --auto-generate-sql-unique-write-number=32000"
  #args="${args} --auto-generate-sql-write-number=32000"
  args="${args} --auto-generate-sql-load-type=write"
  #args="${args} --auto-generate-sql-load-type=key"
  #args="${args} --auto-generate-sql-unique-query-number=320000"
  #args="${args} --number-char-cols=10"
  #args="${args} -i 3"
  args="${args} --number-of-queries=50000"
  #args="${args} -c 2,4,8,16,32"
  args="${args} -c 100"
  echo mysqlslap ${args}
  ../client/mysqlslap $args
}

run_sysbench()
{
  args="--mysql-socket=var/tmp/mysqld.1.sock --mysql-user=root --db-ps-mode=auto"
  args="${args} --test=oltp --oltp-test-mode=nontrx "
  args="${args} --mysql-db=my_test --mysql-table-engine=innodb"
  args="${args} --oltp-user-delay-max=50"
  args="${args} --oltp-table-size=0"
  args="${args} --oltp-nontrx-mode=insert"
  args="${args} --max-time=60 --max-requests=320000"

  for num in 32 64 128
  do
    sysbench ${args} prepare | tee -a var/log/sysbench.log
    sysbench ${args} --num-threads=${num} run | tee -a var/log/sysbench.log
    sysbench ${args} cleanup | tee -a var/log/sysbench.log
  done
}
TESTCASE=t/my_performance_test
for type in rpl semisync simple
do
  if [[ "$1" == "${type}" ]]
  then
    rm ${TESTCASE}*
    create_test ${TESTCASE} ${type}
    TEST_CREATED='yes'
    break
  fi
done


if [[ "XX${TEST_CREATED}" != "XXyes" ]]
then
  echo "Type $1 is not supported"
  exit
fi

shutdown_servers
run_test_case ${TESTCASE}

create_SQLs
run_mysqlslap_insert
exit;
LD_LIBRARY_PATH=../libmysql:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH
run_sysbench


