X-Git-Url: http://git.scottworley.com/annex-ec/blobdiff_plain/2b22dfad8f09a236e4c8f7983b491b31b06b4c25..2801b2a3b9d82ad03115e74c8b434acd36310d47:/annex-ec-test diff --git a/annex-ec-test b/annex-ec-test index 013236d..9858db1 100755 --- a/annex-ec-test +++ b/annex-ec-test @@ -1,5 +1,13 @@ #!/usr/bin/env bash +# annex-ec: Use erasure codes for more efficient storage use in git-annex +# Copyright (C) 2026 Scott Worley + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + set -euo pipefail die() { echo "$*" >&2; exit 1; } @@ -33,28 +41,31 @@ make_test_vols() { sync_everything } +has_been_deleted() { + for already_deleted in "${deleted_vols[@]}";do + if [[ "$1" == "$already_deleted" ]];then return 0; fi + done + return 1 +} + sync_everything() { for vol in "${vols[@]}";do - for already_deleted in "${deleted_vols[@]}";do - if [[ "$vol" == "$already_deleted" ]];then continue 2; fi - done + if has_been_deleted "$vol";then continue; fi git -C "$(vol_dir "$vol")" annex sync done } fsck_everything() { for vol in "${vols[@]}";do - for already_deleted in "${deleted_vols[@]}";do - if [[ "$vol" == "$already_deleted" ]];then continue 2; fi - done - git -C "$(vol_dir "$vol")" annex fsck + if has_been_deleted "$vol";then continue; fi + pushd "$(vol_dir "$vol")" + git annex fsck -- *-* + popd done } delete_test_vol() { - for already_deleted in "${deleted_vols[@]}";do - if [[ "$1" == "$already_deleted" ]];then return; fi - done + if has_been_deleted "$vol";then return; fi d="$(vol_dir "$1")" if [[ -d "$d/.git/annex/objects" ]];then chmod -R +w "$d/.git/annex/objects" @@ -64,9 +75,7 @@ delete_test_vol() { # Find a not-yet-deleted volume (if there is one) and report the deleted volume as dead for vol in "${vols[@]}";do - for already_deleted in "${deleted_vols[@]}";do - if [[ "$vol" == "$already_deleted" ]];then continue 2; fi - done + if has_been_deleted "$vol";then continue; fi git -C "$(vol_dir "$vol")" annex dead "$(vol_name "$1")" break done @@ -99,19 +108,28 @@ make_test_file() { echo "$f" } -choose_volumes() { +some_random_volume_names() { x=$(for vol in "${vols[@]}";do vol_name "$vol" done | shuf | head -n "$1" | tr \\n ,) echo "${x%,}" } +a_random_volume_dir() { + while true;do + vol="${vols[$RANDOM % $num_vols]}" + if has_been_deleted "$vol";then continue; fi + vol_dir "$vol" + break + done +} + MIN_REDUNDANCY=1 MIN_FILES=2 # If you only have one file in a group, you'd just make copies of it, no need for annex-ec MIN_VOLUMES=$((MIN_REDUNDANCY + MIN_FILES)) for (( num_vols=MIN_VOLUMES; num_vols <= 10; num_vols++ ));do - for (( redundancy=1; redundancy < num_vols-2; redundancy++ ));do + for (( redundancy=1; redundancy <= num_vols-2; redundancy++ ));do max_files=$(( num_vols - redundancy )) for (( num_files=MIN_FILES; num_files <= max_files; num_files++ ));do make_test_vols "$num_vols" @@ -121,17 +139,23 @@ for (( num_vols=MIN_VOLUMES; num_vols <= 10; num_vols++ ));do done sync_everything sync_everything - pushd "$(vol_dir "${vols[$RANDOM % $num_vols]}")" - cmd=(annex-ec -r "$redundancy" -v "$(choose_volumes $((num_files+redundancy)))" "${files[@]}") + pushd "$(a_random_volume_dir)" + cmd=(annex-ec -r "$redundancy" -v "$(some_random_volume_names $((num_files+redundancy)))" "${files[@]}") echo "In $PWD , running ${cmd[*]}" >&2 "${cmd[@]}" popd sync_everything + sync_everything fsck_everything + delete_some_test_vols "$redundancy" - # TODO: Recover + pushd "$(a_random_volume_dir)" + annex-ec-recover -- *-* + popd + sync_everything - # fsck_everything # Skip this check until recovery is implemented + sync_everything + fsck_everything delete_all_test_vols done done