Adding buffered IO to reads
authorBrian Aker <brian@tangent.org>
Tue, 2 Oct 2007 01:38:36 +0000 (18:38 -0700)
committerBrian Aker <brian@tangent.org>
Tue, 2 Oct 2007 01:38:36 +0000 (18:38 -0700)
ChangeLog
include/memcached.h
lib/memcached_get.c
lib/memcached_io.c
lib/memcached_io.h
lib/memcached_response.c

index f295a9ddc4c4a8877c0eb75b655109cf80fc64ec..27a76640592f1b3735afab8b168aa7ea95aae96c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,6 @@
 0.4
   * Added buffered IO to write calls for keys
+  * Added buffered IO for reads
   * memstat was broken (bad if/else on connect)
 
 0.3 Mon Oct  1 06:37:52 PDT 2007
index f4d0b25aefb2c2cba7f0436cacf263f5fc2e2f0a..a5cc14ba127f5af22443c37212083599ec60a520 100644 (file)
@@ -120,6 +120,9 @@ struct memcached_st {
   memcached_server_st *hosts;
   unsigned int number_of_hosts;
   unsigned int cursor_server;
+  char read_buffer[MEMCACHED_MAX_BUFFER];
+  size_t read_buffer_length;
+  char *read_ptr;
   char write_buffer[MEMCACHED_MAX_BUFFER];
   size_t write_buffer_offset;
   size_t write_between_flush;
index 404c332c5c65be38068365334efbfecbd20733ba..4d2b10d2edad397ae2efd18bba7a25d1a81b9bed 100644 (file)
@@ -1,4 +1,5 @@
 #include "common.h"
+#include "memcached_io.h"
 
 static char *memcached_value_fetch(memcached_st *ptr, char *key, size_t *key_length, 
                                    size_t *value_length, 
@@ -75,7 +76,6 @@ static char *memcached_value_fetch(memcached_st *ptr, char *key, size_t *key_len
     if (*value_length)
     {
       size_t read_length;
-      size_t partial_length;
       size_t to_read;
       char *value;
       char *value_ptr;
@@ -94,15 +94,9 @@ static char *memcached_value_fetch(memcached_st *ptr, char *key, size_t *key_len
       value_ptr= value;
       read_length= 0;
       to_read= (*value_length) + 2;
-      /* This is overkill */
-      while ((partial_length= recv(ptr->hosts[server_key].fd, value_ptr, to_read, 0)) > 0)
-      {
-        value_ptr+= partial_length;
-        read_length+= partial_length;
-        to_read-= partial_length;
-        if (read_length == (size_t)(*value_length + 2))
-          break;
-      }
+
+      read_length= memcached_io_read(ptr, server_key,
+                                     value_ptr, to_read);
 
       if (read_length != (size_t)(*value_length + 2))
       {
index 7067237ffd6f72ecc47317f7fdb74d90a056c585..a6e563d3d2d516d4dd26e7a42778771d0588a9bb 100644 (file)
@@ -4,9 +4,31 @@
 
 #include <memcached.h>
 
-ssize_t memcached_io_read(memcached_st *ptr, char *buf, size_t length)
+ssize_t memcached_io_read(memcached_st *ptr, unsigned  int server_key,
+                          char *buffer, size_t length)
 {
-  return -1;
+  size_t x;
+
+  for (x= 0; x < length; x++)
+  {
+    if (!ptr->read_buffer_length)
+    {
+      ptr->read_buffer_length= recv(ptr->hosts[server_key].fd, 
+                                    ptr->read_buffer, 
+                                    MEMCACHED_MAX_BUFFER, 0);
+      ptr->read_ptr= ptr->read_buffer;
+
+      if (ptr->read_buffer_length == -1)
+        return -1;
+      if (ptr->read_buffer_length == 0)
+        return x;
+    }
+    buffer[x]= *ptr->read_ptr;
+    ptr->read_ptr++;
+    ptr->read_buffer_length--;
+  }
+
+  return length;
 }
 
 ssize_t memcached_io_write(memcached_st *ptr, unsigned int server_key,
index d9abd6253714eaca7dbcfd04799c248bd3c16aff..0fac6d626620e39bffad8f194ffad5cf3539ed05 100644 (file)
@@ -5,3 +5,5 @@ ssize_t memcached_io_flush(memcached_st *ptr, unsigned int server_key);
 ssize_t memcached_io_write(memcached_st *ptr, unsigned int server_key,
                         char *buffer, size_t length);
 void memcached_io_reset(memcached_st *ptr, unsigned int server_key);
+ssize_t memcached_io_read(memcached_st *ptr, unsigned  int server_key,
+                          char *buffer, size_t length);
index cb74be0a911c6f1fe9ba383299de8c5f668ca199..24ee832f148a593ab9791f049abb1308d2170aad 100644 (file)
@@ -21,7 +21,9 @@ memcached_return memcached_response(memcached_st *ptr,
   while (1)
   {
     unsigned int read_length;
-    read_length= recv(ptr->hosts[server_key].fd, buffer_ptr, 1, 0);
+
+    read_length= memcached_io_read(ptr, server_key,
+                                   buffer_ptr, 1);
 
     if (read_length != 1)
       return  MEMCACHED_UNKNOWN_READ_FAILURE;