Hi.

Here is a patch for memcached fixing the following two issues:

1. Replace include of sys/signal.h with signal.h (according to C99 this file contains the prototypes for signal etc).

2. The previous implementation of try_read_network will try to read from the network until it read returns with an error code. The new implementation will stop reading if read returns less bytes than we had room for in our buffer. I assume that the OS will return all of the available data instead of forcing the program to issue multiple read operations. If the OS for some odd reason decide to return less than the data that is available, this socket will be signaled the next time we poll libevent for a new event.

Thanks,

Trond Norbye


Index: memcached.c
===================================================================
--- memcached.c (revision 687)
+++ memcached.c (working copy)
@@ -19,9 +19,9 @@
 #include <sys/stat.h>
 #include <sys/socket.h>
 #include <sys/un.h>
-#include <sys/signal.h>
 #include <sys/resource.h>
 #include <sys/uio.h>
+#include <signal.h>

 /* some POSIX systems need the following definition
  * to get mlockall flags out of sys/mman.h.  */
@@ -1918,14 +1918,19 @@
             c->request_addr_size = 0;
         }

-        res = read(c->sfd, c->rbuf + c->rbytes, c->rsize - c->rbytes);
+        int avail = c->rsize - c->rbytes;
+        res = read(c->sfd, c->rbuf + c->rbytes, avail);
         if (res > 0) {
             STATS_LOCK();
             stats.bytes_read += res;
             STATS_UNLOCK();
             gotdata = 1;
             c->rbytes += res;
-            continue;
+            if (res == avail) {
+                continue;
+            } else {
+                break;
+            }
         }
         if (res == 0) {
             /* connection closed */

Reply via email to