svn commit: r211506 - stable/8/etc/periodic/daily

Alexander Leidinger netchild at FreeBSD.org
Thu Aug 19 13:24:14 UTC 2010


Author: netchild
Date: Thu Aug 19 13:24:13 2010
New Revision: 211506
URL: http://svn.freebsd.org/changeset/base/211506

Log:
  sort of MFC: r211495 was supposed to add this script from HEAD, and while
  the merge seems to have been successful, the script does not show up
  in releng-8. This is a "svn copy head/.../800.zfs-scrub ." as retrying
  the svn merge does not result in the file showing up. This may not be
  the best way to fix the problem in svn, but it is the only way I'm aware of
  to fix the stable branch (which is IMO more important than to use a potential
  best way I'm not aware of).
  
  Relevant commit log for this file (r209195):
    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

Added:
     - copied unchanged from r211505, head/etc/periodic/daily/800.scrub-zfs
Directory Properties:
  stable/8/etc/periodic/daily/800.scrub-zfs   (props changed)

Copied: stable/8/etc/periodic/daily/800.scrub-zfs (from r211505, head/etc/periodic/daily/800.scrub-zfs)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/8/etc/periodic/daily/800.scrub-zfs	Thu Aug 19 13:24:13 2010	(r211506, copy of r211505, head/etc/periodic/daily/800.scrub-zfs)
@@ -0,0 +1,86 @@
+#!/bin/sh
+#
+# $FreeBSD$
+#
+
+# 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


More information about the svn-src-all mailing list