robustness
[distro-setup] / mount-latest-subvol
index aa35efa5720bbb9573b44939719a7baec8dd74a2..5cb226c5676b9539ea96ebab8241b5ccc6ebbec4 100644 (file)
@@ -35,28 +35,13 @@ EOF
 }
 
 
-errcatch() {
-  set -E; shopt -s extdebug
-  _err-trap() {
-    err=$?
-    exec >&2
-    set +x
-    echo "${BASH_SOURCE[1]}:${BASH_LINENO[0]}:in \`$BASH_COMMAND' returned $err"
-    bash-trace 2
-    echo "$0: exiting with code $err"
-    exit $err
-  }
-  trap _err-trap ERR
-  set -o pipefail
-}
-bash-trace() {
-  local -i argc_index=0 frame i start=${1:-1} max_indent=8 indent
+err-bash-trace() {
+  local -i argc_index=0 frame i start=${1:-0} max_indent=8 indent
   local source
   local extdebug=false
   if [[ $(shopt -p extdebug) == *-s* ]]; then
     extdebug=true
   fi
-
   for ((frame=0; frame < ${#FUNCNAME[@]}-1; frame++)); do
     argc=${BASH_ARGC[frame]}
     argc_index+=$argc
@@ -64,7 +49,7 @@ bash-trace() {
     if (( ${#BASH_SOURCE[@]} > 1 )); then
       source="${BASH_SOURCE[frame+1]}:${BASH_LINENO[frame]}:"
     fi
-    indent=$((frame-start+1))
+    indent=$((frame-start + 1))
     indent=$((indent < max_indent ? indent : max_indent))
     printf "%${indent}s↳%sin \`%s" '' "$source" "${FUNCNAME[frame]}"
     if $extdebug; then
@@ -74,8 +59,25 @@ bash-trace() {
     fi
     echo \'
   done
+  return 0
 }
-errcatch
+err-catch() {
+  set -E; shopt -s extdebug
+  _err-trap() {
+    err=$?
+    exec >&2
+    set +x
+    echo "${BASH_SOURCE[1]}:${BASH_LINENO[0]}: \`$BASH_COMMAND' returned $err"
+    err-bash-trace 2
+    set -e # err trap does not work within an error trap
+    "${_errcatch_cleanup[@]:-:}" # note :-: is to be compatible with set -u
+    echo "$0: exiting with code $err"
+    exit $err
+  }
+  trap _err-trap ERR
+  set -o pipefail
+}
+err-catch
 
 tu() {
   while read -r line; do
@@ -299,6 +301,7 @@ for vol in q a o i; do
     fi
   done
 
+  # if we unmounted some but not all, restore them and move on
   if ! $umount_ret; then
     for dir in ${unmounted[@]}; do
       mnt $dir
@@ -306,6 +309,7 @@ for vol in q a o i; do
     continue
   fi
 
+  #### begin dealing with leaf vols ####
   # todo: decipher /mnt/root, like we do in check-subvol-stale
   cd /mnt/root
   if [[ -e $vol ]]; then
@@ -315,6 +319,8 @@ for vol in q a o i; do
 
     ### begin check if leaf is different, delete it if not ###
     if [[ -e /a/opt/btrfs-snapshots-diff/btrfs-snapshots-diff.py ]]; then
+      source /a/bin/distro-functions/src/package-manager-abstractions
+      pi python-jmespath # dependency
       parentid=$(btrfs sub show $leaf | awk '$1 == "Parent" && $2 == "UUID:" {print $3}')
       bsubs=(/mnt/root/btrbk/$vol.*)
       bsub=
@@ -328,7 +334,7 @@ for vol in q a o i; do
       if [[ $bsub ]]; then
         tmp=$(mktemp)
         # in testing, same subvol is 136 bytes. allow some overhead
-        btrfs send --no-data -p $bsub $leaf | head -c 1000 > $tmp
+        btrfs send --no-data -p $bsub $leaf | head -c 1000 > $tmp || [[ $? == 141 ]]
         if (( $(stat -c%s $tmp) < 1000)); then
           # example output for an empty diff:
           # Found a valid Btrfs stream header, version 1
@@ -356,6 +362,8 @@ for vol in q a o i; do
     done
     ## end expire leaf vols ##
   fi
+  #### end dealing with leaf vols ####
+
   # Note, we make a few assumptions in this script, like
   # $d was not a different subvol id than $vol, and
   # things otherwise didn't get mounted very strangely.
@@ -365,6 +373,7 @@ for vol in q a o i; do
   done
   stale_dir=/nocow/btrfs-stale
   rm -f $stale_dir/$d
+
 done
 
 ### disabled