#!/bin/bash

set -x

# The script must be finished if any command is finished with error.
# mariabackup is expected to be finished with error if it detects corrupted
# pages.
set -e

# Workdir contains rr source and binaries, data and backup dirs, backup log
# and rr traces.
WORK_DIR=/dev/shm/MDEV-21109
DATA_DIR=$WORK_DIR/data
BACKUP_DIR=$WORK_DIR/backup
BACKUP_LOG=$WORK_DIR/backup.log
RR_DIR=$WORK_DIR/rr
RR_BIN_DIR=$RR_DIR/bin
RR_TRACE_DIR=$WORK_DIR/rr-trace
RR_BRANCH=5.3.0

# The directory where MariaDB is installed
MARIADB_DIR=/dev/shm/mariadb-10.3.23-CentOS7
# Config file
MARIADB_CNF=/dev/shm/my.cnf
# Mysqldump file
DUMP=/dev/shm/dump.sql

# Run backup and restart the sever every 20 minutes
SLEEP_TIME=1200

# set environment for rr
export LD_LIBRARY_PATH=$RR_BIN_DIR/lib64:$LD_LIBRARY_PATH
export _RR_TRACE_DIR=$RR_TRACE_DIR
# this is necessary for rr
sudo sysctl kernel.perf_event_paranoid=1
# rr prefix to start recording
RR="$RR_BIN_DIR/bin/rr record -h "

# mysqld command to import mysqldump
MYSQLD_FOR_IMPORT="bin/mysqld --defaults-file=$MARIADB_CNF --datadir=$DATA_DIR"
# mysqld command to start the server under the load
MYSQLD=$MYSQLD_FOR_IMPORT
# mariabackup command
MARIABACKUP="bin/mariabackup --defaults-file=$MARIADB_CNF --backup --user=root --target-dir=$BACKUP_DIR"

rm -rf $DATA_DIR $BACKUP_DIR $BACKUP_LOG $RR_TRACE_DIR ${RR_TRACE_DIR}.prev

if [[ ! -x $RR_BIN_DIR/bin/rr ]]
then

  echo ================ Install prerequisites
  sudo yum install -y centos-release-scl
  sudo yum install -y devtoolset-8
  sudo yum install -y git cmake3 make gdb libgcc libgcc.i686 \
    glibc-devel glibc-devel.i686 libstdc++-devel libstdc++-devel.i686 \
    python36 python36-pexpect man-pages capnproto capnproto-libs capnproto-devel

  echo ==================== Build and install rr
  mkdir -p $RR_DIR
  cd $RR_DIR
  git clone https://github.com/mozilla/rr.git --branch=$RR_BRANCH ./src
  mkdir build
  cd build
  scl enable devtoolset-8 -- cmake3 ../src -DBUILD_TESTS=NO -DCMAKE_INSTALL_PREFIX=../bin
  scl enable devtoolset-8 -- make -j install

fi

echo ====================== Initialize datadir and import data
cd $MARIADB_DIR
scripts/mysql_install_db --defaults-file=$MARIADB_CNF --datadir=$DATA_DIR
$RR $MYSQLD_FOR_IMPORT &
while ! ./bin/mysqladmin --defaults-file=$MARIADB_CNF ping --silent; do sleep 1; done
bin/mysql -uroot < $DUMP

echo ==================== Check data just after it was imported
$RR $MARIABACKUP 2>&1 | tee $BACKUP_LOG

echo ==================== Shutdown the server and cleanup after initialization
bin/mysqladmin --defaults-file=$MARIADB_CNF -uroot shutdown
rm -rf $BACKUP_DIR $BACKUP_LOG
# Save the previous rr trace dir in the case of table damaging during shutdown
mv $RR_TRACE_DIR ${RR_TRACE_DIR}.prev

echo ===================== Main loop
i=0
while true
do
  echo ================= Iteration $i
  i=$((i+1))
  echo ------------------ Start server under the load
  # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  # >
  # > Add commands here to start slave or other commands to emulate workload
  # >
  # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  $RR $MYSQLD &
  while ! ./bin/mysqladmin --defaults-file=$MARIADB_CNF ping --silent; do sleep 1; done
  echo ------------------ Wait for $SLEEP_TIME seconds
  sleep $SLEEP_TIME
  echo ------------------ Backup
  $RR $MARIABACKUP 2>&1 | tee $BACKUP_LOG
  echo ------------------ Stop server and cleanup
  bin/mysqladmin --defaults-file=$MARIADB_CNF -uroot shutdown
  rm -rf $BACKUP_DIR $BACKUP_LOG
  rm -rf ${RR_TRACE_DIR}.prev
  # Save the previous rr trace dir in the case if tables are damaged during shutdown
  mv $RR_TRACE_DIR ${RR_TRACE_DIR}.prev
done
