#!/bin/bash

cvmfs_test_name="Using cvmfs_config fuser to find processes accessing a repository"
cvmfs_test_suites="quick"

cleanup() {
  sudo rm -f started
  sudo cvmfs_config killall
}

cvmfs_run_test() {
  logfile=$1

  echo "*** mount repository"
  cvmfs_mount grid.cern.ch || return 1

  echo "*** start background process accessing it and check that it is being used"
  set -m # enables job control handling
  (cd /cvmfs/grid.cern.ch; sleep 10000) &
  backpid="$!"
  pids="`sudo cvmfs_config fuser grid.cern.ch`"
  kill -15 -$backpid
  wait $backpid 2>/dev/null || true
  [[ " $pids " == *" $backpid "* ]] || return 10
  pids="`sudo cvmfs_config fuser grid.cern.ch`"
  [ -z "$pids" ] || return 11

  echo "*** start unshared background process accessing it, and check that"
  sudo unshare -m sh -c \
    "cd /cvmfs/grid.cern.ch && cut -d' ' -f4 /proc/self/stat > $PWD/started && /bin/sleep 10000" &
  sudopid=$!
  trap cleanup EXIT HUP INT TERM || return $?
  while [ ! -f started ]; do
    sleep 1
  done
  backpid="$(cat started)"

  echo "*** unshared background process started, unmounting system-wide mount point"
  cvmfs_umount grid.cern.ch
  # can't get error code from background proc before wait, so instead do
  #   kill -0 on it to see if it is still running
  if ! sudo kill -0 $backpid; then
    sudo wait $backpid || true
    echo "*** could not unshare"
    return 30
  fi

  echo "*** stopping shared background process"
  pids="`sudo cvmfs_config fuser grid.cern.ch`"
  sudo kill -15 $backpid
  sudo kill -15 -$sudopid
  sudo wait $backpid 2>/dev/null || true
  echo "*** pids: $pids, backpid: $backpid"
  [[ " $pids " == *" $backpid "* ]] || return 20
  echo "*** checking once more, where it should be completely unmounted"
  ! sudo cvmfs_config fuser grid.cern.ch || return 21

  # Bring back repository in a clean state in case anything failed
  cleanup
  return 0
}

