#!/usr/bin/env bash

flush_caches() {
  sync
  echo 3 > /proc/sys/vm/drop_caches
}

create_temp_repo() {
  rm -rf $1/tmp
  flush_caches
  $SVNADMIN create $1/tmp --compatible-version=$2
}

set_base() {
  rm /files
  ln -s $1/repos/bench/ /files
  chmod 777 /files
}

prepare_op() {
  rm -rf /run/shm/tmp
  flush_caches

  killall "svnserve" -9 2> /dev/null
  killall "lt-svnserve" -9 2> /dev/null
  /etc/init.d/apache2 stop
  killall "apache2" -9 2> /dev/null
  sleep 2

  cp /etc/apache2/subversion.$1.conf /etc/apache2/subversion.conf
  cp /home/stefan/.subversion/config.$1 /root/.subversion/config

  case $1 in
    slow)
      OPTIONS=""
      ;;
    medium)
      OPTIONS="-M 256"
      ;;
    fast)
      OPTIONS="-M 1024 -c 0 --client-speed 1000 --cache-revprops yes --block-read yes --min-threads=16 --max-threads=16"
      ;;
  esac

  /home/stefan/develop/1.9.0/subversion/svnserve/svnserve $OPTIONS -Tdr /files
  /etc/init.d/apache2 start
  sleep 2
}

BASE_LIST="/mnt/hdds /mnt/ssds /run/shm"
REPO_LIST="ruby-f6-nonpacked ruby-f7-nonpacked ruby-f6-packed ruby-f7-packed bsd-f6-packed bsd-f7-nonpacked bsd-f6-nonpacked bsd-f7-packed"
PREFIX_LIST="http://localhost/svn svn://localhost file:///files"
SVNADMIN=/home/stefan/develop/1.9.0/subversion/svnadmin/svnadmin
SVN=/home/stefan/develop/1.9.0/subversion/svn/svn
TIMEFORMAT=$'%3R\t%3U\t%3S'
ME=`basename $0`
LOG=${ME%.sh}.log

echo "Repo sizes in kbytes and nodes" >> $LOG
for repo in $REPO_LIST
do
  echo "
$repo " >> $LOG
  REPO=/run/shm/repos/bench/$repo
  du $REPO -s | sed "s/\([0-9]*\).*/\1/" >> $LOG
  find $REPO | wc -l >> $LOG
done

echo "

Dump
" >> $LOG
for base in $BASE_LIST
do
  for repo in $REPO_LIST
  do
    REPOPATH=$base/repos/bench/$repo

    flush_caches
    printf "$base\t$repo\tslow\t" >> $LOG
    (time $SVNADMIN dump $REPOPATH -q -r0:5000 2>/dev/null > /dev/null) 2>>$LOG

    flush_caches
    printf "$base\t$repo\tmedium\t" >> $LOG
    (time $SVNADMIN dump $REPOPATH -q -r0:5000 -M 256 2>/dev/null > /dev/null) 2>>$LOG

    flush_caches
    printf "$base\t$repo\tfast\t" >> $LOG
    (time $SVNADMIN dump $REPOPATH -q -r0:5000 -M 1024 2>/dev/null > /dev/null) 2>>$LOG
  done
done

echo "

Load Ruby
" >> $LOG
$SVNADMIN dump /run/shm/repos/bench/ruby-f7-packed -r0:5000 -M 4096 2>/dev/null > /run/shm/dump
for base in $BASE_LIST
do
  for ver in 1.8 1.9
  do
    printf "$base\t$ver\tslow\t" >> $LOG
    create_temp_repo $base $ver
    (time $SVNADMIN load $base/tmp -q < /run/shm/dump) 2>>$LOG   

    printf "$base\t$ver\tmedium\t" >> $LOG
    create_temp_repo $base $ver
    (time $SVNADMIN load $base/tmp -q -M 256 < /run/shm/dump) 2>>$LOG   

    printf "$base\t$ver\tfast\t" >> $LOG
    create_temp_repo $base $ver
    (time eatmydata $SVNADMIN load $base/tmp -q -M 1024 < /run/shm/dump) 2>>$LOG   
  done
done

echo "

Load BSD
" >> $LOG
$SVNADMIN dump /run/shm/repos/bench/bsd-f7-packed -r0:5000 -M 4096 2>/dev/null > /run/shm/dump
for base in $BASE_LIST
do
  for ver in 1.8 1.9
  do
    printf "$base\t$ver\tslow\t" >> $LOG
    create_temp_repo $base $ver
    (time $SVNADMIN load $base/tmp -q < /run/shm/dump) 2>>$LOG   

    printf "$base\t$ver\tmedium\t" >> $LOG
    create_temp_repo $base $ver
    (time $SVNADMIN load $base/tmp -q -M 256 < /run/shm/dump) 2>>$LOG   

    printf "$base\t$ver\tfast\t" >> $LOG
    create_temp_repo $base $ver
    (time eatmydata $SVNADMIN load $base/tmp -q -M 1024 < /run/shm/dump) 2>>$LOG   
  done

  rm -rf $base/tmp
done
rm /run/shm/dump

echo "

Export
" >> $LOG
for base in $BASE_LIST
do
  set_base $base

  for repo in $REPO_LIST
  do
    for prefix in $PREFIX_LIST
    do
      if [[ $repo == *ruby* ]]
      then
        URL=$prefix/$repo/trunk
      else
        URL=$prefix/$repo/head
      fi

      for variant in slow medium fast
      do
        printf "$base\t$repo\t$prefix\t$variant\t" >> $LOG
        prepare_op $variant
        (time $SVN export $URL -q 2>/dev/null /run/shm/tmp) 2>>$LOG   
      done
    done
  done
done

echo "

Log
" >> $LOG
for base in $BASE_LIST
do
  set_base $base

  for repo in $REPO_LIST
  do
    for prefix in $PREFIX_LIST
    do
      URL=$prefix/$repo
      for variant in slow medium fast
      do
        printf "$base\t$repo\t$prefix\t$variant\t" >> $LOG
        prepare_op $variant
        (time $SVN log $URL --limit 20000 2> /dev/null > /dev/null) 2>>$LOG   
      done
    done
  done
done

