]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Windows: handle rx busy call channel
authorJeffrey Altman <jaltman@your-file-system.com>
Wed, 9 Mar 2011 12:51:02 +0000 (07:51 -0500)
committerDerrick Brashear <shadow@dementia.org>
Thu, 10 Mar 2011 02:01:52 +0000 (18:01 -0800)
Register an error code for rx busy call channel detection.
Force a retry whenever CM_RX_BUSY_CALL_CHANNEL is received
by cm_Analyze().  Log the event to both the internal trace
log and the Windows Event Log along with the server address.

Reviewed-on: http://gerrit.openafs.org/4183
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>
Tested-by: Jeffrey Altman <jaltman@openafs.org>
(cherry picked from commit 75c2f96364d598ec0c134cb6b366ce067b8b7f49)

Change-Id: I932c3d1fdb89f697347c0acc06dc628b3b6175da
Reviewed-on: http://gerrit.openafs.org/4185
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
src/WINNT/afsd/afsd_eventlog.c
src/WINNT/afsd/afsd_eventmessages.mc
src/WINNT/afsd/afsd_init.c
src/WINNT/afsd/cm.h
src/WINNT/afsd/cm_conn.c

index 0709246b76c365ab282ab3531720685bb1e9e94c..b617d6319db50b16585e191b8125ecb830e67860 100644 (file)
@@ -214,6 +214,7 @@ LogEvent(WORD wEventType, DWORD dwEventID, ...)
     case MSG_SMB_SEND_PACKET_FAILURE:
     case MSG_UNEXPECTED_SMB_SESSION_CLOSE:
     case MSG_RX_MSGSIZE_EXCEEDED:
+    case MSG_RX_BUSY_CALL_CHANNEL:
        wNumArgs = 1;
        lpArgs[0] = va_arg(listArgs, LPTSTR);
        break;
index 9e714a6decf9e392f50af130442c0cf0cdf62154..7bbc0d35f5decb78e28ab418f4d90a1cf4f21878 100644 (file)
@@ -430,4 +430,12 @@ Language=English
 Path MTU may have been exceeded when communicating with server %1, retrying ...
 .
 
+MessageId=
+Severity=Warning
+Facility=System
+SymbolicName=MSG_RX_BUSY_CALL_CHANNEL
+Language=English
+Busy call channel when communicating with server %1, retrying ...
+.
+
 ;#endif /* __AFSD_EVENTMESSAGES_H_ 1 */
index d7e7c217235f28692e5f8208cf8e1926aeac9702..37a42cccfa557b0d04e354b46f48b133e001bc26 100644 (file)
@@ -1343,6 +1343,8 @@ afsd_InitCM(char **reasonP)
         afsi_log("rx_SetUdpBufSize %d", rx_udpbufsize);
     }
 
+    rx_SetBusyChannelError(CM_RX_RETRY_BUSY_CALL);
+
     /* initialize RX, and tell it to listen to the callbackport, 
      * which is used for callback RPC messages.
      */
index 1bf23a06bae2f861b934a7a7433918f16b7ec7d8..2474ab483b21f49a9a58c69cb15a8a326e26cbe8 100644 (file)
 #define CM_ERROR_RPC_MOREDATA          (CM_ERROR_BASE+63)
 #define CM_ERROR_BUFFER_OVERFLOW        (CM_ERROR_BASE+64)
 
+/* Private RX Errors */
+#define CM_RX_RETRY_BUSY_CALL           (-13)
+
 /* Used by cm_FollowMountPoint and cm_FindVolumeByName */
 /* And as an index in cm_volume_t */
 #define RWVOL  0
index 5ccd1feb5fd9e8ba9a504beb0afb180410ca39fb..3e519dae2c5ffeb4310ab1e065b2a5441eadb962 100644 (file)
@@ -729,18 +729,35 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
          * with a smaller mtu size.
          */
 
-        if (serverp) {
+        if (serverp)
             sprintf(addr, "%d.%d.%d.%d",
                     ((serverp->addr.sin_addr.s_addr & 0xff)),
                     ((serverp->addr.sin_addr.s_addr & 0xff00)>> 8),
                     ((serverp->addr.sin_addr.s_addr & 0xff0000)>> 16),
                     ((serverp->addr.sin_addr.s_addr & 0xff000000)>> 24));
 
-            LogEvent(EVENTLOG_WARNING_TYPE, MSG_RX_MSGSIZE_EXCEEDED, addr);
-            osi_Log1(afsd_logp, "cm_Analyze: Path MTU may have been exceeded addr[%s]",
-                     osi_LogSaveString(afsd_logp,addr));
-        }
+        LogEvent(EVENTLOG_WARNING_TYPE, MSG_RX_MSGSIZE_EXCEEDED, addr);
+        osi_Log1(afsd_logp, "cm_Analyze: Path MTU may have been exceeded addr[%s]",
+                 osi_LogSaveString(afsd_logp,addr));
+
+        retry = 1;
+    }
+    else if (errorCode == CM_RX_RETRY_BUSY_CALL) {
+        /*
+         * RPC failed because the selected call channel
+         * is currently busy on the server.  Unconditionally
+         * retry the request so an alternate call channel can be used.
+         */
+        if (serverp)
+            sprintf(addr, "%d.%d.%d.%d",
+                    ((serverp->addr.sin_addr.s_addr & 0xff)),
+                    ((serverp->addr.sin_addr.s_addr & 0xff00)>> 8),
+                    ((serverp->addr.sin_addr.s_addr & 0xff0000)>> 16),
+                    ((serverp->addr.sin_addr.s_addr & 0xff000000)>> 24));
 
+        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;
     }
     else if (errorCode >= -64 && errorCode < 0) {
@@ -967,7 +984,8 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
     }
 
     /* If not allowed to retry, don't */
-    if (!forcing_new && (reqp->flags & CM_REQ_NORETRY) && (errorCode != RX_MSGSIZE))
+    if (!forcing_new && (reqp->flags & CM_REQ_NORETRY) &&
+        (errorCode != RX_MSGSIZE && errorCode != CM_RX_RETRY_BUSY_CALL))
        retry = 0;
     else if (retry && dead_session)
         retry = 0;