From bba8160d84d20eea5d3387a2801cb402c2a3605e Mon Sep 17 00:00:00 2001 From: hygienic-books Date: Wed, 15 Mar 2023 22:23:15 +0100 Subject: [PATCH] fix(script): Do snapshots atomically (#1) --- pacman-zfs-snapshot.sh | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/pacman-zfs-snapshot.sh b/pacman-zfs-snapshot.sh index 62afa93..2ff1683 100755 --- a/pacman-zfs-snapshot.sh +++ b/pacman-zfs-snapshot.sh @@ -206,21 +206,32 @@ function trim_pkg_list_oneline () { function do_snaps () { local snap_name snap_return_code - for snappable_dataset in "${snappable_datasets[@]}"; do - snap_name="${snappable_dataset}"'@'"${snap_name_prefix}${snap_field_separator}${date_string}${snap_field_separator}"'op:'"${conf_op_suffix}${snap_field_separator}"'sev:'"${severity}${snap_field_separator}"'pkgs:'"${trimmed_pkg_list_oneline}" - if [[ "${do_dry_run}" == 'true' ]]; then - pprint 'info' 'Dry-run, pretending to run zfs snapshot '"${snap_name}" - else - zfs snapshot "${snap_name}" - snap_return_code="${?}" - if [[ "${snap_return_code}" -eq '0' ]]; then - successfully_snapped_datasets+=("${snappable_dataset}") - pprint 'info' 'Snapshot done: '"${snap_name}" - else - pprint 'warn' 'Snapshot failed: '"${snap_name}" - fi - fi + local -a planned_snaps + for snappable_dataset_id in "${!snappable_datasets[@]}"; do + snap_name="${snappable_datasets[${snappable_dataset_id}]}"'@'"${snap_name_prefix}${snap_field_separator}${date_string}${snap_field_separator}"'op:'"${conf_op_suffix}${snap_field_separator}"'sev:'"${severity}${snap_field_separator}"'pkgs:'"${trimmed_pkg_list_oneline}" + planned_snaps["${snappable_dataset_id}"]="${snap_name}" done + if [[ "${do_dry_run}" == 'true' ]]; then + pprint 'info' 'Dry-run, pretending to atomically do zfs snapshot:' + for planned_snap in "${planned_snaps[@]}"; do + pprint 'info' "${planned_snap}" + done + else + zfs snapshot "${planned_snaps[@]}" + snap_return_code="${?}" + if [[ "${snap_return_code}" -eq '0' ]]; then + successfully_snapped_datasets=("${snappable_datasets[@]}") + pprint 'info' 'zfs snapshot atomically done:' + for planned_snap in "${planned_snaps[@]}"; do + pprint 'info' "${planned_snap}" + done + else + pprint 'warn' 'zfs snapshot failed:' + for planned_snap in "${planned_snaps[@]}"; do + pprint 'warn' "${planned_snap}" + done + fi + fi } function get_snaps_in_cur_sev () {