Windows: handle rx busy call channel
authorJeffrey Altman <jaltman@your-file-system.com>
Wed, 9 Mar 2011 12:51:02 +0000 (07:51 -0500)
committerJeffrey Altman <jaltman@openafs.org>
Wed, 9 Mar 2011 14:03:36 +0000 (06:03 -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.

Change-Id: I196fb99d38bb89f57f296fd1b60d2a7f17fec80c
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>

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 24ae089..7653521 100644 (file)
@@ -223,6 +223,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 8ad0077..38d8ce3 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 a7190da..fba202e 100644 (file)
@@ -1347,6 +1347,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 1bf23a0..2474ab4 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 cf90ef6..2134a96 100644 (file)
@@ -732,18 +732,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) {
@@ -970,7 +987,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;