]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
rx: Process error queue after noticing errors
authorAndrew Deason <adeason@sinenomine.net>
Fri, 7 Sep 2012 21:58:05 +0000 (16:58 -0500)
committerDerrick Brashear <shadow@your-file-system.com>
Tue, 16 Oct 2012 08:47:48 +0000 (01:47 -0700)
If errors exist in the socket error queue, we will notice by a sendmsg
or recvmsg returning an error. If we never get an error, we don't need
to check the error queue. So, only call osi_HandleSocketError after
such an error has been returned, so we can avoid unnecessarily
checking the error queue when there are no errors.

Change-Id: I7c8aaaac42728dac7fb0634538b8cc317f0e7212
Reviewed-on: http://gerrit.openafs.org/8114
Reviewed-by: Chas Williams - CONTRACTOR <chas@cmf.nrl.navy.mil>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
Reviewed-by: Simon Wilkinson <simonxwilkinson@gmail.com>
src/rx/LINUX/rx_knet.c
src/rx/rx_lwp.c
src/rx/rx_pthread.c

index 5d2fc4a63fe334e3d446db401d10ada32a2a10c9..48a493d24686f78e1ddb5c4276483670d36b9778 100644 (file)
@@ -170,10 +170,6 @@ osi_NetSend(osi_socket sop, struct sockaddr_in *to, struct iovec *iovec,
     struct msghdr msg;
     int code;
 
-#ifdef AFS_RXERRQ_ENV
-    while (osi_HandleSocketError(sop))
-       ;
-#endif
 
     msg.msg_name = to;
     msg.msg_namelen = sizeof(*to);
@@ -182,6 +178,14 @@ osi_NetSend(osi_socket sop, struct sockaddr_in *to, struct iovec *iovec,
     msg.msg_flags = 0;
 
     code = kernel_sendmsg(sop, &msg, (struct kvec *) iovec, iovcnt, size);
+
+#ifdef AFS_RXERRQ_ENV
+    if (code < 0) {
+       while (osi_HandleSocketError(sop))
+           ;
+    }
+#endif
+
     return (code < 0) ? code : 0;
 }
 
@@ -220,11 +224,6 @@ osi_NetReceive(osi_socket so, struct sockaddr_in *from, struct iovec *iov,
        osi_Panic("Too many (%d) iovecs passed to osi_NetReceive\n", iovcnt);
     }
 
-#ifdef AFS_RXERRQ_ENV
-    while (osi_HandleSocketError(so))
-       ;
-#endif
-
     memcpy(tmpvec, iov, iovcnt * sizeof(struct iovec));
     msg.msg_name = from;
     msg.msg_iov = tmpvec;
@@ -245,6 +244,11 @@ osi_NetReceive(osi_socket so, struct sockaddr_in *from, struct iovec *iov,
        flush_signals(current); /* We don't want no stinkin' signals. */
        rxk_lastSocketError = code;
        rxk_nSocketErrors++;
+
+#ifdef AFS_RXERRQ_ENV
+       while (osi_HandleSocketError(so))
+           ;
+#endif
     } else {
        *lengthp = code;
        code = 0;
index fe9bdceef03e8e72b98b28ea33a503a3d0c6e1bc..fa4ee6dc48080aa80d5229b818eab3b7640bb3ce 100644 (file)
@@ -412,11 +412,17 @@ rxi_Listen(osi_socket sock)
 int
 rxi_Recvmsg(osi_socket socket, struct msghdr *msg_p, int flags)
 {
+    int code;
+    code = recvmsg(socket, msg_p, flags);
+
 #ifdef AFS_RXERRQ_ENV
-    while((rxi_HandleSocketError(socket)) > 0)
-       ;
+    if (code < 0) {
+       while((rxi_HandleSocketError(socket)) > 0)
+           ;
+    }
 #endif
-    return recvmsg(socket, msg_p, flags);
+
+    return code;
 }
 
 /*
index a1af2b42ea45b70eacea2e6dbd110670b32aae75..9dcb9f79c3cf2079a67e1de666da03e8dd332761 100644 (file)
@@ -393,11 +393,15 @@ int
 rxi_Recvmsg(osi_socket socket, struct msghdr *msg_p, int flags)
 {
     int ret;
+    ret = recvmsg(socket, msg_p, flags);
+
 #ifdef AFS_RXERRQ_ENV
-    while((rxi_HandleSocketError(socket)) > 0)
-      ;
+    if (ret < 0) {
+       while (rxi_HandleSocketError(socket) > 0)
+           ;
+    }
 #endif
-    ret = recvmsg(socket, msg_p, flags);
+
     return ret;
 }
 
@@ -409,26 +413,36 @@ rxi_Sendmsg(osi_socket socket, struct msghdr *msg_p, int flags)
 {
     int ret;
     ret = sendmsg(socket, msg_p, flags);
-#ifdef AFS_LINUX22_ENV
+
+#ifdef AFS_RXERRQ_ENV
+    if (ret < 0) {
+       while (rxi_HandleSocketError(socket) > 0)
+           ;
+    }
+    return ret;
+
+#else
+# ifdef AFS_LINUX22_ENV
     /* linux unfortunately returns ECONNREFUSED if the target port
      * is no longer in use */
     /* and EAGAIN if a UDP checksum is incorrect */
     if (ret == -1 && errno != ECONNREFUSED && errno != EAGAIN) {
-#else
+# else
     if (ret == -1) {
-#endif
+# endif
        dpf(("rxi_sendmsg failed, error %d\n", errno));
        fflush(stdout);
-#ifndef AFS_NT40_ENV
+# ifndef AFS_NT40_ENV
         if (errno > 0)
           return -errno;
-#else
+# else
             if (WSAGetLastError() > 0)
               return -WSAGetLastError();
-#endif
+# endif
        return -1;
     }
     return 0;
+#endif /* !AFS_RXERRQ_ENV */
 }
 
 struct rx_ts_info_t * rx_ts_info_init(void) {