Mercurial > hgrepos > FreeBSD > ports > sysutils > local-bsdtools
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 ;;
