X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=btrfsmaint;h=d2263257d412b4da2d9e37e5c1678641e301e8f6;hb=3ca4714d6b02ff279a0c724415f3e0a3a6f49059;hp=1639a8dd48f450e69fdf67558a4780059583ec1d;hpb=40dd151ec6ba75633c74568da59e35a45351f194;p=distro-setup diff --git a/btrfsmaint b/btrfsmaint index 1639a8d..d226325 100755 --- a/btrfsmaint +++ b/btrfsmaint @@ -41,13 +41,13 @@ check-idle() { fi } - usage() { cat <$tmp; then - if diff -q $mnt/btrfs-dev-stats $tmp; then - diff -u $mnt/btrfs-dev-stats $tmp | mail -s "$HOSTNAME: error: btrfs dev stats -c $mnt" root@localhost - cat $tmp >$mnt/btrfs-dev-stats - fi - fi + #### begin look for diff in stats, eg: increasing error count #### - if ! $idle; then - if $dryrun; then - echo "$0: not idle. if this wasnt a dry run, btrfs scrub cancel $mnt" - else - btrfs scrub cancel $mnt &>/dev/null ||: - continue + # Only run for $check, since it runs in parallel to non-check, avoid + # race condition. + if $check; then + tmp=$(mktemp) + # if mnt is /, avoid making a buggy looking path + stats_path=${mnt%/}/btrfs-dev-stats + if [[ ! -e $stats_path ]]; then + btrfs dev stats -c $mnt >$stats_path ||: # populate initial reading + elif ! btrfs dev stats -c $mnt >$tmp; then + if ! diff -q $stats_path $tmp; then + exim -t <$stats_path + fi fi + rm -f $tmp fi + #### end look for diff in stats, eg: increasing error count #### + if $check; then + if ! $idle; then + if $dryrun; then + echo "$0: not idle. if this wasnt a dry run, btrfs scrub cancel $mnt" + else + btrfs scrub cancel $mnt &>/dev/null ||: + fi + fi continue fi @@ -143,24 +176,30 @@ main() { sed -rn 's/^\s*scrub started at (.*) and finished.*/\1/p' ) fi - if [[ $date ]]; then + if ! $force && [[ $date ]]; then if $dryrun; then echo "$0: last scrub finish for $mnt: $date" fi date=$(date --date="$date" +%s) - # if date is sooner than 90 days ago + # if date is sooner than 60 days ago # the wiki recommends 30 days or so, but - # it makes the comp lag like shit for a day, - # so I'm going with 90 days. - if (( date > $(date +%s) - 60*60*24*30 )); then + # I'm going with 60 days. + if (( date > EPOCHSECONDS - 60*60*24*60 )); then if $dryrun; then - echo "$0: skiping scrub of $mnt, last was $(( ($(date +%s) - date) / 60/60/24 )) days ago, < 30 days" + echo "$0: skiping scrub of $mnt, last was $(( (EPOCHSECONDS - date) / 60/60/24 )) days ago, < 30 days" fi continue fi fi - # -c 2 -n 4 is from btrfsmaintenance, does ionice - e btrfs scrub start -Bd -c 2 -n 4 $mnt + # btrfsmaintenance does -c 2 -n 4, but I want lowest pri. + e btrfs scrub start -Bd -c 3 $mnt + + # We normally only do one disk since this is meant to be run while I sleep + # and if we try to do all disks, we invariably end up doing a scrub still + # after I've woken up. So, just do one per day. + if ! $force; then + return 0 + fi done }