From fe4e52655ce7e5a8e5f6c23cde678fc66c3db490 Mon Sep 17 00:00:00 2001 From: Andrew Deason Date: Fri, 17 Feb 2012 17:12:46 -0600 Subject: [PATCH] viced: Relax "h_TossStuff_r failed" warnings Currently, h_TossStuff_r bails out and logs a message if we detect that somebody grabbed a reference or locked the host while we tried to h_NBLock_r. The reasoning for this is that it is not legal for anyone to h_Hold_r a host that has HOSTDELETED set (but the error is detectable and recoverable); callers are supposed to check for HOSTDELETED and not hold a host in that case. However, HOSTDELETED may not be set when h_TossStuff_r is called, since we call it if either HOSTDELETED _or_ CLIENTDELETED are set. If CLIENTDELETED is set and HOSTDELETED is not, it's perfectly fine (and necessary) for callers to grab a reference to the host. So, if that's what is going on, don't log a message, since that's normal behavior. Check for HOSTDELETED before we h_NBLock_r, since it is technically possible (and legal) for someone to grab a reference to the host and somehow set HOSTDELETED while we wait for h_NBLock_r to return. Also log the flags when we see this message. Change-Id: Ie50a0617de094bb1c721da28f100ed4b31aa849f Reviewed-on: http://gerrit.openafs.org/6733 Reviewed-by: Alistair Ferguson Reviewed-by: Derrick Brashear Tested-by: BuildBot --- src/viced/host.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/viced/host.c b/src/viced/host.c index 9f1ddb63d0..86a3377cf2 100644 --- a/src/viced/host.c +++ b/src/viced/host.c @@ -804,6 +804,11 @@ h_TossStuff_r(struct host *host) { struct client **cp, *client; int code; + int wasdeleted = 0; + + if ((host->hostFlags & HOSTDELETED)) { + wasdeleted = 1; + } /* make sure host doesn't go away over h_NBLock_r */ h_Hold_r(host); @@ -816,9 +821,13 @@ h_TossStuff_r(struct host *host) /* if somebody still has this host locked */ if (code != 0) { char hoststr[16]; - ViceLog(0, - ("Warning: h_TossStuff_r failed; Host %" AFS_PTR_FMT " (%s:%d) was locked.\n", - host, afs_inet_ntoa_r(host->host, hoststr), ntohs(host->port))); + if (wasdeleted) { + /* someone locked the host while HOSTDELETED was set; that is bad */ + ViceLog(0, ("Warning: h_TossStuff_r failed; Host %" AFS_PTR_FMT + " (%s:%d flags 0x%x) was locked.\n", + host, afs_inet_ntoa_r(host->host, hoststr), ntohs(host->port), + (unsigned)host->hostFlags)); + } return; } else { h_Unlock_r(host); @@ -829,9 +838,13 @@ h_TossStuff_r(struct host *host) * reacquire H_LOCK */ if (host->refCount > 0) { char hoststr[16]; - ViceLog(0, - ("Warning: h_TossStuff_r failed; Host %" AFS_PTR_FMT " (%s:%d) was held.\n", - host, afs_inet_ntoa_r(host->host, hoststr), ntohs(host->port))); + if (wasdeleted) { + /* someone grabbed a ref while HOSTDELETED was set; that is bad */ + ViceLog(0, ("Warning: h_TossStuff_r failed; Host %" AFS_PTR_FMT + " (%s:%d flags 0x%x) was held.\n", + host, afs_inet_ntoa_r(host->host, hoststr), ntohs(host->port), + (unsigned)host->hostFlags)); + } return; }