Date: Wed, 4 Aug 2010 12:37:42 GMT From: "J. Hellenthal" <jhell@DataIX.net> To: freebsd-gnats-submit@FreeBSD.org Subject: conf/149271: Merge Request for commit r209195 800.scrub-zfs to stable/8 Message-ID: <201008041237.o74CbgOR014881@www.freebsd.org> Resent-Message-ID: <201008041240.o74Ce6ot018510@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 149271 >Category: conf >Synopsis: Merge Request for commit r209195 800.scrub-zfs to stable/8 >Confidential: no >Severity: non-critical >Priority: high >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Wed Aug 04 12:40:06 UTC 2010 >Closed-Date: >Last-Modified: >Originator: J. Hellenthal >Release: stable/8 >Organization: >Environment: N/A >Description: Please merge commit r209195 800.scrub-zfs to stable/8. ------------------------------------------------------------------------ r209195 | netchild | 2010-06-15 04:58:16 -0400 (Tue, 15 Jun 2010) | 17 lines Changed paths: A /head/etc/periodic/daily/800.scrub-zfs M /head/share/man/man5/periodic.conf.5 Add a periodic zfs scrub script. Features: - configurable amount of days between scrubs (default value or per pool) - do not scrub directly after pool creation (respects the configured number of days between scrubs) - do not scrub if a scrub is in progress - tells how to see the status of the scrub - tells how many days since the last scrub if it skips the scrubbing - warns if a non-existent pool is specified explicitely (default: no pools specified -> all currently imported pools are handled) - runs late in the periodic run to not slow down the other periodic daily scripts Discussed on: fs@ ------------------------------------------------------------------------ >How-To-Repeat: N/A >Fix: 800.scrub-zfs | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 6 +++- 2 files changed, 91 insertions(+), 1 deletion(-) Patch attached with submission follows: Index: etc/periodic/daily/800.scrub-zfs =================================================================== --- etc/periodic/daily/800.scrub-zfs (revision 0) +++ etc/periodic/daily/800.scrub-zfs (revision 0) @@ -0,0 +1,86 @@ +#!/bin/sh +# +# $FreeBSD: stable/8/etc/periodic/daily/800.scrub-zfs 209195 2010-06-15 08:58:16Z netchild $ +# + +# If there is a global system configuration file, suck it in. +# +if [ -r /etc/defaults/periodic.conf ] +then + . /etc/defaults/periodic.conf + source_periodic_confs +fi + +: ${daily_scrub_zfs_default_threshold=30} + +case "$daily_scrub_zfs_enable" in + [Yy][Ee][Ss]) + echo + echo 'Scrubbing of zfs pools:' + + if [ -z "${daily_scrub_zfs_pools}" ]; then + daily_scrub_zfs_pools="$(zpool list -H -o name)" + fi + + for pool in ${daily_scrub_zfs_pools}; do + # sanity check + zpool list ${pool} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + echo " WARNING: pool '${pool}' specified in" + echo " '/etc/periodic.conf:daily_scrub_zfs_pools'" + echo " does not exist" + continue + fi + + # successful only if there is at least one pool to scrub + rc=0 + + # determine how many days shall be between scrubs + eval _pool_threshold=\${daily_scrub_zfs_${pool}_threshold} + if [ -z "${_pool_threshold}" ];then + _pool_threshold=${daily_scrub_zfs_default_threshold} + fi + + _last_scrub=$(zpool history ${pool} | \ + egrep "^[0-9\.\:\-]{19} zpool scrub ${pool}\$" | tail -1 |\ + cut -d ' ' -f 1) + if [ -z "${_last_scrub}" ]; then + # creation time of the pool if no scrub was done + _last_scrub=$(zpool history ${pool} | \ + sed -ne '2s/ .*$//p') + fi + + # Now minus last scrub (both in seconds) converted to days. + _scrub_diff=$(expr -e \( $(date +%s) - \ + $(date -j -f %F.%T ${_last_scrub} +%s) \) / 60 / 60 / 24) + if [ ${_scrub_diff} -le ${_pool_threshold} ]; then + echo " skipping scrubbing of pool '${pool}':" + echo " last scrubbing is ${_scrub_diff} days ago, threshold is set to ${_pool_threshold} days" + continue + fi + + _status="$(zpool status ${pool} | grep scrub:)" + case "${_status}" in + *"scrub in progress"*) + echo " scrubbing of pool '${pool}' already in progress, skipping:" + ;; + *"none requested"*) + echo " starting first scrubbing (after reboot) of pool '${pool}':" + zpool scrub ${pool} + ;; + *) + echo " starting scrubbing of pool '${pool}':" + zpool scrub ${pool} + ;; + esac + + echo " consult 'zpool status ${pool}' for the result" + done + ;; + + *) + rc=0 + ;; +esac + +exit $rc Property changes on: etc/periodic/daily/800.scrub-zfs ___________________________________________________________________ Added: svn:executable + * Index: etc/periodic/daily/Makefile =================================================================== --- etc/periodic/daily/Makefile (revision 210841) +++ etc/periodic/daily/Makefile (working copy) @@ -8,7 +8,6 @@ 200.backup-passwd \ 330.news \ 400.status-disks \ - 404.status-zfs \ 405.status-ata-raid \ 406.status-gmirror \ 407.status-graid3 \ @@ -53,4 +52,9 @@ 500.queuerun .endif +.if ${MK_ZFS} != "no" +FILES+= 404.status-zfs \ + 800.scrub-zfs +.endif + .include <bsd.prog.mk> >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008041237.o74CbgOR014881>