changeset 356:2ba1072103f1

Implement a new periodic script (daily) to control the automatic TRIM of SSD that contain ZFS pools/datasets
author Franz Glasner <fzglas.hg@dom66.de>
date Thu, 08 Dec 2022 09:55:12 +0100
parents f1c8fc3af3e1
children c559074302e0
files Makefile etc/periodic/daily/750.local-trim-zfs pkg-plist
diffstat 3 files changed, 54 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Thu Dec 08 00:54:18 2022 +0100
+++ b/Makefile	Thu Dec 08 09:55:12 2022 +0100
@@ -55,7 +55,7 @@
 	${SED} -i "" -e "s|@@PKGORIGIN@@|${PKGORIGIN}|" ${WRKSRC}/${_rp}
 .endfor
 	${MKDIR} ${WRKSRC}/etc/periodic/daily
-.for _ef in etc/package-mapping.conf.sample etc/pkgtools.conf.sample etc/bsmtp2dma.conf.sample etc/periodic/daily/800.local-ipv6-refresh
+.for _ef in etc/package-mapping.conf.sample etc/pkgtools.conf.sample etc/bsmtp2dma.conf.sample etc/periodic/daily/800.local-ipv6-refresh etc/periodic/daily/750.local-trim-zfs
 	${CP} -v ${SRC}/${_ef} ${WRKSRC}/${_ef}
 	${SED} -i "" -e "s|\\\$$HGid\\\$$|\$$HGid: ${HGPATH}/${_ef} ${HGREVISION} ${HGDATE} ${HGAUTHOR} ${HGPHASE} \$$|" ${WRKSRC}/${_ef}
 	${SED} -i "" -e "s|@@PKGORIGIN@@|${PKGORIGIN}|" ${WRKSRC}/${_ef}
@@ -80,7 +80,7 @@
 	${INSTALL_DATA} ${WRKSRC}/etc/${_ef} ${STAGEDIR}${ETCDIR}/${_ef}
 .endfor
 	${MKDIR} ${STAGEDIR}${PREFIX}/etc/periodic/daily
-.for _ps in 800.local-ipv6-refresh
+.for _ps in 800.local-ipv6-refresh 750.local-trim-zfs
 	${INSTALL_SCRIPT} ${WRKSRC}/etc/periodic/daily/${_ps} ${STAGEDIR}${PREFIX}/etc/periodic/daily
 .endfor
 
--- a/etc/periodic/daily/750.local-trim-zfs	Thu Dec 08 00:54:18 2022 +0100
+++ b/etc/periodic/daily/750.local-trim-zfs	Thu Dec 08 09:55:12 2022 +0100
@@ -1,6 +1,8 @@
 #!/bin/sh
 #
-# $FreeBSD$
+# # @(#)@@PKGORIGIN@@ $HGid$
+#
+# Heavily inspired (aka "copied")  from /etc/periodic/daily/800.scrub-zfs
 #
 
 # If there is a global system configuration file, suck it in.
@@ -15,25 +17,28 @@
     source_periodic_confs
 fi
 
-: ${daily_scrub_zfs_default_threshold=35}
+: ${daily_local_trim_zfs_enable:=NO}
+: ${daily_local_trim_zfs_pools=}
+: ${daliy_local_trim_zfs_default_threshold=35}
+# \${daily_local_trim_zfs_$(echo "${pool}"|tr  ".:-" "_")_threshold}
 
-case "$daily_scrub_zfs_enable" in
+case "$daily_local_trim_zfs_enable" in
     [Yy][Ee][Ss])
 	echo
-	echo 'Scrubbing of zfs pools:'
+	echo 'TRIM of zfs pools:'
 
-	if [ -z "${daily_scrub_zfs_pools}" ]; then
-		daily_scrub_zfs_pools="$(zpool list -H -o name)"
+	if [ -z "${daily_local_trim_zfs_pools}" ]; then
+		daily_local_trim_zfs_pools="$(zpool list -H -o name)"
 	fi
 
 	rc=0
-	for pool in ${daily_scrub_zfs_pools}; do
+	for pool in ${daily_local_trim_zfs_pools}; do
 		# sanity check
 		_status=$(zpool list "${pool}" 2> /dev/null)
 		if [ $? -ne 0 ]; then
 			rc=2
 			echo "   WARNING: pool '${pool}' specified in"
-			echo "            '/etc/periodic.conf:daily_scrub_zfs_pools'"
+			echo "            '/etc/periodic.conf:daily_local_trim_zfs_pools'"
 			echo "            does not exist"
 			continue
 		fi
@@ -49,56 +54,63 @@
 			continue ;;
 		esac
 
-		# determine how many days shall be between scrubs
-		eval _pool_threshold=\${daily_scrub_zfs_$(echo "${pool}"|tr  ".:-" "_")_threshold}
-		if [ -z "${_pool_threshold}" ];then
-			_pool_threshold=${daily_scrub_zfs_default_threshold}
+		# determine how many days shall be between trums
+		eval _pool_threshold=\${daily_local_trim_zfs_$(echo "${pool}"|tr  ".:-" "_")_threshold}
+		if [ -z "${_pool_threshold}" ]; then
+			_pool_threshold=${daliy_local_trim_zfs_default_threshold}
 		fi
 
-		_last_scrub=$(zpool history ${pool} | \
-		    egrep "^[0-9\.\:\-]{19} zpool scrub ${pool}\$" | tail -1 |\
+		_last_local_trim=$(zpool history ${pool} | \
+		    egrep "^[0-9\.\:\-]{19} zpool trim( -w)? ${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} | \
+		if [ -z "${_last_local_trim}" ]; then
+			# creation time of the pool if no trim was done
+			_last_local_trim=$(zpool history ${pool} | \
 			    sed -ne '2s/ .*$//p')
 		fi
-		if [ -z "${_last_scrub}" ]; then
-			echo "   skipping scrubbing of pool '${pool}':"
-			echo "      can't get last scrubbing date"
+		if [ -z "${_last_local_trim}" ]; then
+			echo "   skipping TRIM of pool '${pool}':"
+			echo "      can't get last TRIM date"
+			continue
+		fi
+
+		# Now minus last trim (both in seconds) converted to days.
+		_local_trim_diff=$(expr -e \( $(date +%s) - \
+		    $(date -j -v -70M -f %F.%T ${_last_local_trim} +%s) \) / 60 / 60 / 24)
+		if [ ${_local_trim_diff} -lt ${_pool_threshold} ]; then
+			echo "   skipping TRIM of pool '${pool}':"
+			echo "      last TRIM is ${_local_trim_diff} days ago, threshold is set to ${_pool_threshold} days"
 			continue
 		fi
 
-		# Now minus last scrub (both in seconds) converted to days.
-		_scrub_diff=$(expr -e \( $(date +%s) - \
-		    $(date -j -v -70M -f %F.%T ${_last_scrub} +%s) \) / 60 / 60 / 24)
-		if [ ${_scrub_diff} -lt ${_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
-
+		# Check general pool status (as in scrub-zfs)
 		_status="$(zpool status ${pool} | grep scan:)"
 		case "${_status}" in
 			*"scrub in progress"*)
-				echo "   scrubbing of pool '${pool}' already in progress, skipping:"
+				echo "   scrubbing of pool '${pool}' in progress, skipping:"
+				continue
 				;;
 			*"resilver in progress"*)
 				echo "   resilvering of pool '${pool}' is in progress, skipping:"
-				;;
-			*"none requested"*)
-				echo "   starting first scrub (since reboot) of pool '${pool}':"
-				zpool scrub ${pool}
-				[ $rc -eq 0 ] && rc=1
+				continue
 				;;
 			*)
-				echo "   starting scrub of pool '${pool}':"
-				zpool scrub ${pool}
+				# VOID
+				;;
+		esac
+
+		# Check whether a trim is already running
+		_status="$(zpool status ${pool} | fgrep trimming)"
+		case "${_status}" in
+			*\(trimming\)*)
+				echo "   TRIM of pool '${pool}' already in progress, skipping:"
+				;;
+			*)
+				echo "   starting TRIM of pool '${pool}':"
+				zpool trim -w ${pool}
 				[ $rc -eq 0 ] && rc=1
 				;;
 		esac
-
-		echo "      consult 'zpool status ${pool}' for the result"
 	done
 	;;
 
--- a/pkg-plist	Thu Dec 08 00:54:18 2022 +0100
+++ b/pkg-plist	Thu Dec 08 09:55:12 2022 +0100
@@ -1,4 +1,5 @@
 @comment FILES
+etc/periodic/daily/750.local-trim-zfs
 etc/periodic/daily/800.local-ipv6-refresh
 sbin/bsmtp2dma
 sbin/check-ports