From: Derrick Brashear Date: Wed, 22 Feb 2012 20:57:46 +0000 (-0500) Subject: libafs: retry retriable RPCs instead of abandoning X-Git-Tag: upstream/1.6.1.pre4^2~50 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=8a0bc72693cf7e735539f10e55b292f59ca0ad6f;p=packages%2Fo%2Fopenafs.git libafs: retry retriable RPCs instead of abandoning if we get e.g. an idle dead error we should retry retriable actions, namely data stores. in order for writing files to work correctly given how the writeback code is structured it's important that this not interfere with analyze's shouldRetry decision on those RPCs Reviewed-on: http://gerrit.openafs.org/6749 Tested-by: BuildBot Reviewed-by: Derrick Brashear (cherry picked from commit 75a3dabe66a9fbc232b05e2f744ad5b867e18262) Change-Id: I9c611eeb9a71298e9725268392cdf94074324bf1 Reviewed-on: http://gerrit.openafs.org/6777 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- diff --git a/src/afs/afs_analyze.c b/src/afs/afs_analyze.c index b022d95c4..1cd7b8a40 100644 --- a/src/afs/afs_analyze.c +++ b/src/afs/afs_analyze.c @@ -321,9 +321,12 @@ afs_ClearStatus(struct VenusFid *afid, int op, struct volume *avp) } else { ReleaseReadLock(&afs_xvcache); } + if (!avp) + afs_PutVolume(tvp, READ_LOCK); } - if (!avp) - afs_PutVolume(tvp, READ_LOCK); + + if (AFS_STATS_FS_RPCIDXES_WRITE_RETRIABLE(op)) + return 1; /* not retriable: we may have raced ourselves */ return 0; diff --git a/src/afs/afs_stats.h b/src/afs/afs_stats.h index e02be1952..6179d425d 100644 --- a/src/afs/afs_stats.h +++ b/src/afs/afs_stats.h @@ -868,6 +868,7 @@ struct afs_stats_CMPerf { #define AFS_STATS_NUM_FS_RPC_OPS 29 #define AFS_STATS_FS_RPCIDXES_ISWRITE(X) (((X > AFS_STATS_FS_RPCIDX_FETCHSTATUS) && (X < AFS_STATS_FS_RPCIDX_GETSTATISTICS)) || (X == AFS_STATS_FS_RPCIDX_SETVOLUMESTATUS)) +#define AFS_STATS_FS_RPCIDXES_WRITE_RETRIABLE(X) ((X >= AFS_STATS_FS_RPCIDX_STOREDATA) && (X <= AFS_STATS_FS_RPCIDX_STORESTATUS)) #define AFS_STATS_FS_XFERIDX_FETCHDATA 0 #define AFS_STATS_FS_XFERIDX_STOREDATA 1