#!/bin/bash

cvmfs_test_name="Reload during overcommitted asetup"

reload_cvmfs() {
  while [ ! -f stop-reload ]; do
    sudo cvmfs_config reload -c
    sleep 15
  done
}

asetup17X() {
  local pidsfile=$1
  for iterations in 1 2 3 4 5; do
    local i=0
    for v in /cvmfs/atlas.cern.ch/repo/sw/software/x86_64-slc6-gcc48-opt/20*; do
      versions[$i]=`basename $v`
      i=$(($i+1))
    done
    local num_versions=$i

    local idx=$(($RANDOM % $num_versions))
    local this_version=${versions[$idx]}

    echo "*** asetup for version $this_version"
    sh -c "source /cvmfs/atlas.cern.ch/repo/sw/software/x86_64-slc6-gcc48-opt/${this_version}/cmtsite/asetup.sh ${this_version},notest --cmtconfig x86_64-slc6-gcc48-opt"
    local retval=$?
    if [ $retval -ne 0 ]; then
      return $retval
    fi
  done
  return 0
}

cvmfs_run_test() {
  logfile=$1

  local num_cpus=$(cat /proc/cpuinfo | grep ^processor | wc -l)
  local num_asetup=$((2*$num_cpus))

  # mount atlas repository
  cvmfs_mount atlas.cern.ch "CVMFS_KCACHE_TIMEOUT=5" "CVMFS_AUTO_UPDATE=false" || return 1

  pidsfile=`mktemp` || return 6

  # do some concurrent asetup calls
  echo "*** running with $num_asetup parallel tasks"
  for i in $(seq 1 $num_asetup); do
    asetup17X $pidsfile &
    echo $! >> $pidsfile
  done

  echo "*** reload the catalog every now and than"
  reload_cvmfs &
  reload_pid=$!

  echo "*** trap to kill the detached processes"
  trap "kill -9 $(cat $pidsfile | tr '\n' " ") $reload_pid > /dev/null 2>&1; rm -f $pidsfile; exit" HUP INT TERM

  echo "*** wait for the asetup runs to succeed"
  wait $(cat $pidsfile | tr '\n' " ")
  local retval=$?
  rm -f $pidsfile

  echo "*** stop the reload cycle, it seemed to work fine..."
  touch stop-reload
  wait $reload_pid

  if [ $retval -ne 0 ]; then
    echo "asetup failed with return code: $retval"
    return 6
  fi

  local num_forget=$(sudo cvmfs_talk -i atlas.cern.ch internal affairs | \
    grep ^cvmfs.n_fs_forget | cut -f2 -d\|)
  echo "*** number of forget(): $num_forget"
  [ x"$num_forget" != x"" ] || return 11
  if [ $num_forget -gt 50000 ]; then
    return 10
  fi

  return 0
}

