Patchwork [BUG:2452] Eliminate syscall tight loop when handling EAGAIN in NFS.

login
register
Submitter Pavan
Date 2011-02-23 11:53:26
Message ID <1298462006-19299-1-git-send-email-tcp@gluster.com>
Download mbox | patch
Permalink /patch/6247/
State Accepted
Headers show

Comments

Pavan - 2011-02-23 11:53:26
From: Pavan T C <tcp@gluster.com>


Signed-off-by: Pavan T C <tcp@gluster.com>
---
 xlators/nfs/lib/src/rpcsvc.c |   15 ++++++++++++++-
 1 files changed, 14 insertions(+), 1 deletions(-)

Patch

diff --git a/xlators/nfs/lib/src/rpcsvc.c b/xlators/nfs/lib/src/rpcsvc.c
index ff3c1fa..2ca8ed7 100644
--- a/xlators/nfs/lib/src/rpcsvc.c
+++ b/xlators/nfs/lib/src/rpcsvc.c
@@ -2552,6 +2552,7 @@  tx_remaining:
                         nfs_rpcsvc_socket_block_tx (conn->sockfd);
                 }
 
+                errno = 0;
                 written = nfs_rpcsvc_socket_write (conn->sockfd, writeaddr,
                                                    writesize);
                 if (txbuf->txbehave & RPCSVC_TXB_LAST) {
@@ -2561,13 +2562,25 @@  tx_remaining:
                 gf_log (GF_RPCSVC, GF_LOG_TRACE, "conn: 0x%lx, Tx request: %zu,"
                         " Tx sent: %zd", (long)conn, writesize, written);
 
-                /* There was an error transmitting this buffer */
+                /*
+                 * There was an error transmitting this buffer. We are polling
+                 * for errors. So, there is no necessity to handle closure of
+                 * the connection explicitly here.
+                 */
                 if (written == -1)
                         break;
 
                 if (written >= 0)
                         txbuf->offset += written;
 
+                if (errno == EAGAIN) {
+                        /*
+                         * Socket layer is indicating flow-control. We
+                         * break-out now and wait for the next event indicating
+                         * room for writes.
+                         */
+                        break;
+                }
                 /* If the current buffer has been completely transmitted,
                  * delete it from the list and move on to the next buffer.
                  */