From 339f8452e9a01af3fa0d026035561d8fdfc07447 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. Reviewed-on: http://gerrit.openafs.org/7275 Reviewed-by: Derrick Brashear Tested-by: BuildBot (cherry picked from commit 94a8ce970d57498583e249ea61725fce1ee53a50) Change-Id: I9aec874fc525c823c095bb3647bd2561854dbab3 Reviewed-on: http://gerrit.openafs.org/8002 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 9f18a1de9..25b69b6ac 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 80d50efaf..c4a0cffea 100644 --- a/src/afs/afs_analyze.c +++ b/src/afs/afs_analyze.c @@ -333,6 +333,55 @@ afs_ClearStatus(struct VenusFid *afid, int op, struct volume *avp) return 0; } +/*! + * \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); +} + /*------------------------------------------------------------------------ * EXPORTED afs_Analyze * @@ -502,8 +551,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); @@ -567,6 +617,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 */ -- 2.39.5