From 09fe35b1f3adfd08aa74377d291a4acd638d247b Mon Sep 17 00:00:00 2001 From: Andrew Deason Date: Wed, 20 Jul 2011 16:50:52 -0500 Subject: [PATCH] libafs: Rate-limit hard-mount waiting messages Limit how often we log "hard-mount waiting for XXX" messages. Without this, it is possible for a client with hard-mounts enabled to spam the kernel log rather excessively (in extreme cases this can even panic the machine on at least some Linux). To keep things simple, just log approximately one message per volume per hard-mount interval. Reviewed-on: http://gerrit.openafs.org/5060 Tested-by: Derrick Brashear Reviewed-by: Derrick Brashear (cherry picked from commit 530b5ecac51cc7ce61ccddd50868c632c4a47298) Change-Id: I566aa3d411ff100ccc6afa9a5273fb84e6172dd0 Reviewed-on: http://gerrit.openafs.org/6347 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/afs/afs.h | 1 + src/afs/afs_analyze.c | 56 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src/afs/afs.h b/src/afs/afs.h index 861421385..e726c7d83 100644 --- a/src/afs/afs.h +++ b/src/afs/afs.h @@ -521,6 +521,7 @@ struct chservinfo { #define VRecheck 2 /* recheck volume info with server */ #define VBackup 4 /* is this a backup volume? */ #define VForeign 8 /* this is a non-afs volume */ +#define VHardMount 16 /* we are hard-mount waiting for the vol */ enum repstate { not_busy, end_not_busy = 6, rd_busy, rdwr_busy, offline }; diff --git a/src/afs/afs_analyze.c b/src/afs/afs_analyze.c index 4defe4685..33c962758 100644 --- a/src/afs/afs_analyze.c +++ b/src/afs/afs_analyze.c @@ -393,26 +393,72 @@ afs_Analyze(struct afs_conn *aconn, struct rx_connection *rxconn, ((afid && afs_IsPrimaryCellNum(afid->Cell)) || (cellp && afs_IsPrimaryCell(cellp)))) { if (!afid) { - afs_warnuser - ("afs: hard-mount waiting for a vlserver to return to service\n"); + static int afs_vl_hm = 0; + int warn = 0; + if (!afs_vl_hm) { + afs_vl_hm = warn = 1; + } + if (warn) { + afs_warnuser + ("afs: hard-mount waiting for a vlserver to return to service\n"); + } VSleep(hm_retry_int); afs_CheckServers(1, cellp); shouldRetry = 1; + + if (warn) { + afs_vl_hm = 0; + } } else { + static int afs_unknown_vhm = 0; + int warn = 0, vp_vhm = 0; + tvp = afs_FindVolume(afid, READ_LOCK); if (!tvp || (tvp->states & VRO)) { shouldRetry = hm_retry_RO; } else { shouldRetry = hm_retry_RW; } + + /* Set 'warn' if we should afs_warnuser. Only let one + * caller call afs_warnuser per hm_retry_int interval per + * volume. */ + if (shouldRetry) { + if (tvp) { + if (!(tvp->states & VHardMount)) { + tvp->states |= VHardMount; + warn = vp_vhm = 1; + } + } else { + if (!afs_unknown_vhm) { + afs_unknown_vhm = 1; + warn = 1; + } + } + } + if (tvp) afs_PutVolume(tvp, READ_LOCK); + if (shouldRetry) { - afs_warnuser - ("afs: hard-mount waiting for volume %u\n", - afid->Fid.Volume); + if (warn) { + afs_warnuser + ("afs: hard-mount waiting for volume %u\n", + afid->Fid.Volume); + } + VSleep(hm_retry_int); afs_CheckServers(1, cellp); + + if (vp_vhm) { + tvp = afs_FindVolume(afid, READ_LOCK); + if (tvp) { + tvp->states &= ~VHardMount; + afs_PutVolume(tvp, READ_LOCK); + } + } else if (warn) { + afs_unknown_vhm = 0; + } } } } /* if (hm_retry_int ... */ -- 2.39.5