From 94a8ce970d57498583e249ea61725fce1ee53a50 Mon Sep 17 00:00:00 2001 From: Michael Meffie Date: Mon, 23 Apr 2012 14:42:24 -0400 Subject: [PATCH] libafs: log server errors on hard mount retry Save the last errors seen during a request and log those errors if a hard-mount retry is done. Change-Id: I65e41207c5f667c41c7f9cf459243118e5baa074 Reviewed-on: http://gerrit.openafs.org/7275 Reviewed-by: Derrick Brashear Tested-by: BuildBot --- src/afs/afs.h | 1 + src/afs/afs_analyze.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/afs/afs.h b/src/afs/afs.h index 95b4351..1f5996c 100644 --- a/src/afs/afs.h +++ b/src/afs/afs.h @@ -244,6 +244,7 @@ struct vrequest { char tokenError; /* a token error other than expired. */ char idleError; /* the server idled too long */ char skipserver[AFS_MAXHOSTS]; + afs_int32 lasterror[AFS_MAXHOSTS]; }; #define VOLMISSING 1 #define VOLBUSY 2 diff --git a/src/afs/afs_analyze.c b/src/afs/afs_analyze.c index 6b9f496..0aa0c7d 100644 --- a/src/afs/afs_analyze.c +++ b/src/afs/afs_analyze.c @@ -328,6 +328,55 @@ afs_ClearStatus(struct VenusFid *afid, int op, struct volume *avp) /*! * \brief + * Print the last errors from the servers for the volume on + * this request. + * + * \param[in] areq The request record associated with this operation. + * \param[in] afid The FID of the file involved in the action. This argument + * may be null if none was involved. + * + * \return + * None + * + * \note + * This routine is called before a hard-mount retry, to display + * the servers by primary address and the errors encountered. + */ +static void +afs_PrintServerErrors(struct vrequest *areq, struct VenusFid *afid) +{ + int i; + struct volume *tvp; + struct srvAddr *sa; + afs_uint32 address; + char *sep = " ("; + char *term = ""; + + if (afid) { + tvp = afs_FindVolume(afid, READ_LOCK); + if (tvp) { + for (i = 0; i < AFS_MAXHOSTS; i++) { + if (tvp->serverHost[i]) { + sa = tvp->serverHost[i]->addr; + if (sa) { + address = ntohl(sa->sa_ip); + afs_warnuser("%s%d.%d.%d.%d code=%d", sep, + (address >> 24), (address >> 16) & 0xff, + (address >> 8) & 0xff, (address) & 0xff, + areq->lasterror[i]); + sep = ", "; + term = ")"; + } + } + } + afs_PutVolume(tvp, READ_LOCK); + } + } + afs_warnuser("%s\n", term); +} + +/*! + * \brief * Analyze the outcome of an RPC operation, taking whatever support * actions are necessary. * @@ -487,8 +536,9 @@ afs_Analyze(struct afs_conn *aconn, struct rx_connection *rxconn, if (shouldRetry) { if (warn) { afs_warnuser - ("afs: hard-mount waiting for volume %u\n", + ("afs: hard-mount waiting for volume %u", afid->Fid.Volume); + afs_PrintServerErrors(areq, afid); } VSleep(hm_retry_int); @@ -550,6 +600,17 @@ afs_Analyze(struct afs_conn *aconn, struct rx_connection *rxconn, return 0; } + /* Save the last code of this server on this request. */ + tvp = afs_FindVolume(afid, READ_LOCK); + if (tvp) { + for (i = 0; i < AFS_MAXHOSTS; i++) { + if (tvp->serverHost[i] == tsp) { + areq->lasterror[i] = acode; + } + } + afs_PutVolume(tvp, READ_LOCK); + } + /* If network troubles, mark server as having bogued out again. */ /* VRESTARTING is < 0 because of backward compatibility issues * with 3.4 file servers and older cache managers */ -- 1.9.4