fi
}
-
usage() {
cat <<EOF
Usage: ${0##*/} [ARGS]
Do btrfs maintence or stop if xprintidle shows a user
-force Run regardless of user idle status
+force Run regardless of user idle status on all disks.
check Only check if an existing maintence should be cancelled due to
nonidle user. Also, runs in a loop every 20 seconds for 10
minutes.
idle=true
if ! $force; then
check-idle
+ if ! $check; then
+ min=0
+ max_min=300
+ # When the cron kicks in, we may not be idle (physically sleeping) yet, so
+ # wait.
+ while ! $idle && (( min < max_min )); do
+ min=$(( min + 1 ))
+ sleep 60
+ check-idle
+ done
+ # If we've waited a really long time for idle, just give up.
+ if (( min == max_min )); then
+ return
+ fi
+ fi
fi
- tmp=$(mktemp)
+ tmp=$(mktemp)
fnd="findmnt --types btrfs --noheading"
for x in $($fnd --output "SOURCE" --nofsroot | sort -u); do
mnt=$($fnd --output "TARGET" --first-only --source $x)
[[ $mnt ]] || continue
- if ! btrfs dev stats -c $mnt >$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
- rm -f $tmp
+ #### 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
+ if ! btrfs dev stats -c $mnt >$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
+ 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
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 > EPOCHSECONDS - 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 $(( (EPOCHSECONDS - date) / 60/60/24 )) days ago, < 30 days"
fi
fi
# -c 2 -n 4 is from btrfsmaintenance, does ionice
e btrfs scrub start -Bd -c 2 -n 4 $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
}