#!/bin/sh
#
# Copyright (C) 2000-2022 Kern Sibbald
# License: BSD 2-Clause; see file LICENSE-FOSS
#
# Test aligned data volumes with ZFS deduplication
# 
# The test will run 3 concurrent jobs over 100,000 files
# of all size between 1 and 100,000 bytes.
# 
# This test will create a ZFS pool named
#  tank, and that you have also created tank/volumes
#
TestName="aligned-multi-test"
JobName=NightlySave
. scripts/functions

if test x$FORCE_CLOUD = xyes ; then
   echo "\n=== Test $TestName skipped not compatible with Cloud  ==="
   exit 0
fi

scripts/cleanup
scripts/copy-test-confs
cp scripts/aligned-bacula-sd.conf $conf/bacula-sd.conf

# install the aligned volume plugin
#make -C build/src/plugins/sd install-aligned-plugin >/dev/null

echo "${cwd}/build" >${cwd}/tmp/file-list

which zfs >/dev/null 2>&1
if [ $? -eq 0 ] ; then
  zfs=1
else
  zfs=0
fi

tank=$cwd/tank

# many files...
sed -i 's/Max Run Time/#Max Run Time/' $conf/bacula-dir.conf

# If we are running with zfs, setup a pool,
#  otherwise just use defaults
if [ $zfs -eq 1 ]; then
  cp bin/bacula-sd.conf tmp/1
  sed "s%Archive Device = .*$%Archive Device = $tank/volumes%g" tmp/1 >bin/bacula-sd.conf

  # Delete any previous zfs pool
  sudo zfs unmount tank/volumes
  sudo zfs unmount tank
  sudo zfs destroy -fR tank/volumes
  sudo zfs destroy -fR tank
  sudo zfs destroy -r tank
  sudo zpool destroy -f tank
  sudo rm -rf $tank/volumes
  sudo rm -rf $tank
  #
  # Create zfs pool
  dd if=/dev/zero of=$tmp/disk1 seek=10000000 count=1
  dd if=/dev/zero of=$tmp/disk2 seek=10000000 count=1

  sudo zpool create tank $tmp/disk1 $tmp/disk2
  sudo zfs create tank/volumes
  #sudo zfs recordsize=64k tank # default is 128K
  sudo zfs set mountpoint=$tank tank
  sudo zfs set atime=off tank
  sudo zfs set compress=on tank
  sudo zfs set dedup=on tank
  sudo zdb -dd tank
  sudo chown -R $USER $tank

fi

# Add many different file size to the backup
echo "$tmp/files"  >>${cwd}/tmp/file-list
$bperl -e "create_many_files_size('$tmp/files', 100000)"

start_test

cat <<END_OF_DATA >${cwd}/tmp/bconcmds
@output /dev/null
messages
@$out ${cwd}/tmp/log1.out
label storage=File volume=Vol1
update volume=Vol1 maxvolbytes=500M
label storage=File volume=Vol2
update volume=Vol2 maxvolbytes=497M
label storage=File volume=Vol3
END_OF_DATA

# do label
run_bacula

if [ $zfs -eq 1 ] ; then
  sudo zdb -DD tank
  sudo zdb -b tank
  sudo zpool list tank
fi

cat <<END_OF_DATA >${cwd}/tmp/bconcmds
@output /dev/null
messages
@$out ${cwd}/tmp/log1.out
run job=$JobName level=Full yes
@sleep 3
run job=$JobName level=Full yes
@sleep 3
run job=$JobName level=Full yes
wait
list volumes
messages
END_OF_DATA

for i in 1 2 3 4 5; do
  echo "Running job $i"
  run_bconsole
  if [ $zfs -eq 1 ] ; then
    sudo zdb -DD tank
    sudo zdb -b tank
    sudo zpool list tank
    ls -l $tank/volumes/Vol*
    du -h $tank/volumes/Vol1.add
  else
    ls -l tmp/Vol*
    du -h tmp/Vol1.add
  fi
done

cat <<END_OF_DATA >${cwd}/tmp/bconcmds
@# 
@# now do a restore
@#
@$out ${cwd}/tmp/log2.out
@# setdebug level=0 fd
restore where=${cwd}/tmp/bacula-restores storage=File
5
mark *
done
yes
wait
messages
quit
END_OF_DATA

run_bconsole

if [ $zfs -eq 1 ] ; then
  sudo zdb -DD tank
  sudo zdb -b tank
  sudo zpool list tank
  ls -l $tank/volumes/Vol*
  du -h $tank/volumes/Vol1.add
else
  ls -l tmp/Vol*
  du -h tmp/Vol1.add
fi

sleep 2
check_for_zombie_jobs storage=File 
stop_bacula

check_two_logs
check_restore_diff
end_test
