Windows: cm_Analyze retries vs CM_REQ_NORETRY (2)
[openafs.git] / src / WINNT / afsd / cm_conn.c
index 06bb811..341a9dd 100644 (file)
@@ -969,7 +969,7 @@ cm_Analyze(cm_conn_t *connp,
         osi_Log1(afsd_logp, "cm_Analyze: Path MTU may have been exceeded addr[%s]",
                  osi_LogSaveString(afsd_logp,addr));
 
-        retry = 1;
+        retry = 2;
     }
     else if (errorCode == RX_CALL_BUSY) {
         /*
@@ -990,7 +990,7 @@ cm_Analyze(cm_conn_t *connp,
         LogEvent(EVENTLOG_WARNING_TYPE, MSG_RX_BUSY_CALL_CHANNEL, addr);
         osi_Log1(afsd_logp, "cm_Analyze: Retry RPC due to busy call channel addr[%s]",
                  osi_LogSaveString(afsd_logp,addr));
-        retry = 1;
+        retry = 2;
     }
     else if (errorCode == VNOSERVICE) {
         /*
@@ -1020,8 +1020,7 @@ cm_Analyze(cm_conn_t *connp,
                      osi_LogSaveString(afsd_logp,addr), fidp->volume, cellp->name);
         }
 
-        if (timeLeft > 2)
-            retry = 1;
+       retry = 2;
     }
     else if (errorCode == RX_CALL_IDLE) {
         /*
@@ -1095,8 +1094,7 @@ cm_Analyze(cm_conn_t *connp,
             reqp->errorServp = serverp;
             reqp->tokenError = errorCode;
 
-            if (timeLeft > 2)
-                retry = 1;
+           retry = 2;
         }
 
         LogEvent(EVENTLOG_WARNING_TYPE, MSG_RX_IDLE_DEAD_TIMEOUT, addr, retry);
@@ -1200,8 +1198,8 @@ cm_Analyze(cm_conn_t *connp,
             forcing_new = 1;
             cm_ForceNewConnections(serverp);
 
-            if ( timeLeft > 2 )
-                retry = 1;
+           if ( timeLeft > 2 )
+               retry = 2;
         }
     } else if (errorCode >= ERROR_TABLE_BASE_RXK && errorCode < ERROR_TABLE_BASE_RXK + 256) {
         char * s = "unknown error";
@@ -1251,8 +1249,7 @@ cm_Analyze(cm_conn_t *connp,
         reqp->flags |= CM_REQ_NEW_CONN_FORCED;
         forcing_new = 1;
         cm_ForceNewConnections(serverp);
-        if ( timeLeft > 2 )
-            retry = 1;
+       retry = 2;
     } else {
        if (connp)
            _InterlockedAnd(&connp->flags, ~CM_CONN_FLAG_NEW);
@@ -1381,7 +1378,7 @@ cm_Analyze(cm_conn_t *connp,
 
     /* If not allowed to retry, don't */
     if (dead_session ||
-        !forcing_new && (reqp->flags & CM_REQ_NORETRY) &&
+        !forcing_new && (retry < 2) && (reqp->flags & CM_REQ_NORETRY) &&
         !(errorCode > -64 && errorCode <= RX_INVALID_OPERATION))
         retry = 0;
 
@@ -1658,6 +1655,9 @@ long cm_ConnByServer(cm_server_t *serverp, cm_user_t *userp, afs_uint32 replicat
         userp = cm_rootUserp;
 
     lock_ObtainMutex(&userp->mx);
+    /* find ucell structure */
+    ucellp = cm_GetUCell(userp, serverp->cellp);
+
     lock_ObtainRead(&cm_connLock);
     for (tcp = serverp->connsp; tcp; tcp=tcp->nextp) {
         if (tcp->userp == userp &&
@@ -1666,13 +1666,13 @@ long cm_ConnByServer(cm_server_t *serverp, cm_user_t *userp, afs_uint32 replicat
             break;
     }
 
-    /* find ucell structure */
-    ucellp = cm_GetUCell(userp, serverp->cellp);
     if (!tcp) {
         lock_ConvertRToW(&cm_connLock);
         for (tcp = serverp->connsp; tcp; tcp=tcp->nextp) {
-            if (tcp->userp == userp)
-                break;
+           if (tcp->userp == userp &&
+                (replicated && (tcp->flags & CM_CONN_FLAG_REPLICATION) ||
+                 !replicated && !(tcp->flags & CM_CONN_FLAG_REPLICATION)))
+               break;
         }
         if (tcp) {
             InterlockedIncrement(&tcp->refCount);
@@ -1827,6 +1827,9 @@ void cm_ForceNewConnections(cm_server_t *serverp)
 {
     cm_conn_t *tcp;
 
+    if (serverp == NULL)
+       return;
+
     lock_ObtainWrite(&cm_connLock);
     for (tcp = serverp->connsp; tcp; tcp=tcp->nextp) {
        lock_ObtainMutex(&tcp->mx);