Index: etc/defaults/periodic.conf =================================================================== --- etc/defaults/periodic.conf +++ etc/defaults/periodic.conf @@ -22,6 +22,8 @@ # periodic script dirs local_periodic="/usr/local/etc/periodic" +# Max time to sleep to avoid causing congestion on download servers +anticongestion_sleeptime=3600 # Daily options @@ -136,8 +138,6 @@ # 480.leapfile-ntpd daily_ntpd_leapfile_enable="YES" # Fetch NTP leapfile -daily_ntpd_avoid_congestion="YES" # Avoid congesting - # leapfile sources # 480.status-ntpd daily_status_ntpd_enable="NO" # Check NTP status @@ -307,6 +307,19 @@ if [ -z "${source_periodic_confs_defined}" ]; then source_periodic_confs_defined=yes + # Sleep for a random amount of time in order to mitigate the thundering + # herd problem of multiple hosts running periodic simultaneously. + # Will not sleep when used interactively. + # Will sleep at most once per invocation of periodic + anticongestion() { + local sleepfile="$PERIODIC_TMPDIR/slept" + + [ -n "$PERIODIC_IS_INTERACTIVE" ] && return + [ -f "$sleepfile" ] && return + touch "$sleepfile" + sleep `jot -r 1 0 ${anticongestion_sleeptime}` + } + # Compatibility with old daily variable names. # They can be removed in stable/11. security_daily_compat_var() { Index: etc/periodic/daily/480.leapfile-ntpd =================================================================== --- etc/periodic/daily/480.leapfile-ntpd +++ etc/periodic/daily/480.leapfile-ntpd @@ -13,16 +13,9 @@ case "$daily_ntpd_leapfile_enable" in [Yy][Ee][Ss]) - case "$daily_ntpd_avoid_congestion" in - [Yy][Ee][Ss]) - # Avoid dogpiling - (sleep $(jot -r 1 0 3600); service ntpd onefetch) & - ;; - *) - service ntpd onefetch - ;; - esac - ;; + anticongestion + service ntpd onefetch + ;; esac exit $rc Index: usr.sbin/periodic/periodic.sh =================================================================== --- usr.sbin/periodic/periodic.sh +++ usr.sbin/periodic/periodic.sh @@ -76,8 +76,12 @@ shift arg=$1 -tmp_output=`mktemp ${TMPDIR:-/tmp}/periodic.XXXXXXXXXX` +export PERIODIC_TMPDIR=`mktemp -d ${TMPDIR:-/tmp}/periodic.XXXXXXXXXX` +tmp_output="$PERIODIC_TMPDIR"/output context="$PERIODIC" +if tty > /dev/null 2>&1; then + export PERIODIC_IS_INTERACTIVE=1 +fi export PERIODIC="$arg${PERIODIC:+ }${PERIODIC}" # Execute each executable file in the directory list. If the x bit is not @@ -140,4 +144,4 @@ fi } | output_pipe $arg "$context" -rm -f $tmp_output +rm -rf $PERIODIC_TMPDIR