From: Derrick Brashear Date: Sun, 21 Feb 2010 22:15:26 +0000 (-0500) Subject: idledead client dont interrupt writes X-Git-Tag: openafs-stable-1_4_12pre4~9 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=0581a8ca753550645e6c1931e1195ecf81ead233;p=packages%2Fo%2Fopenafs.git idledead client dont interrupt writes allowing failover is nonsensical, there's nothing to fail to. keep trying to write. if we want to change this, we need to handle it better than just this. Change-Id: Ibed4c63182f44ed9e659895e4868b4192d004688 Reviewed-on: http://gerrit.openafs.org/1355 Tested-by: Stephan Wiesand Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear (cherry picked from commit 01f42cad663cc860e451f694f973ca46f03289ff) Reviewed-on: http://gerrit.openafs.org/1359 --- diff --git a/src/afs/afs_analyze.c b/src/afs/afs_analyze.c index 3d70f83dc..861b7e522 100644 --- a/src/afs/afs_analyze.c +++ b/src/afs/afs_analyze.c @@ -672,12 +672,17 @@ afs_Analyze(register struct afs_conn *aconn, afs_int32 acode, if ((acode < 0) && (acode != VRESTARTING)) { if (acode == RX_CALL_TIMEOUT) { serversleft = afs_BlackListOnce(areq, afid, tsp); - areq->idleError++; - if (serversleft) { - shouldRetry = 1; - } else { + tvp = afs_FindVolume(afid, READ_LOCK); + if (!tvp || (tvp->states & VRO)) + areq->idleError++; + if ((serversleft == 0) && tvp && + ((tvp->states & VRO) || (tvp->states & VBackup))) { shouldRetry = 0; + } else { + shouldRetry = 1; } + if (tvp) + afs_PutVolume(tvp, READ_LOCK); /* By doing this, we avoid ever marking a server down * in an idle timeout case. That's because the server is * still responding and may only be letting a single vnode