Fix for non-blocking IO error. The refactoring bit broke some cases where
authorBrian Aker <brian@tangent.org>
Tue, 29 Jan 2008 07:42:27 +0000 (23:42 -0800)
committerBrian Aker <brian@tangent.org>
Tue, 29 Jan 2008 07:42:27 +0000 (23:42 -0800)
the server had not caught up with the client.

include/memcached.h
lib/memcached_io.c
lib/memcached_response.c
tests/function.c

index eddc5f3cdd0b8f0857226e69a92ca02ab4dbfa5e..629963338c767ea5429612923605a264900ccb41 100644 (file)
@@ -433,7 +433,7 @@ size_t memcached_result_length(memcached_result_st *ptr);
 #define WATCHPOINT_STRING(A) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %s\n", __FILE__, __LINE__,__func__,A);fflush(stdout);
 #define WATCHPOINT_STRING_LENGTH(A,B) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %.*s\n", __FILE__, __LINE__,__func__,(int)B,A);fflush(stdout);
 #define WATCHPOINT_NUMBER(A) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %zu\n", __FILE__, __LINE__,__func__,(size_t)(A));fflush(stdout);
-#define WATCHPOINT_ERRNO(A) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %s\n", __FILE__, __LINE__,__func__, strerror(A));A= 0;fflush(stdout);
+#define WATCHPOINT_ERRNO(A) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %s\n", __FILE__, __LINE__,__func__, strerror(A));fflush(stdout);
 #define WATCHPOINT_ASSERT(A) assert((A));
 #else
 #define WATCHPOINT
index 22c54e420da76f51f888a3c4eef6b0480e3c892c..bb53f08ec023b9d1273812abd7ae74d12e7d3b90 100644 (file)
@@ -86,14 +86,14 @@ ssize_t memcached_io_read(memcached_server_st *ptr,
     uint8_t found_eof= 0;
     if (!ptr->read_buffer_length)
     {
-      size_t data_read;
+      ssize_t data_read;
 
       while (1)
       {
         data_read= read(ptr->fd, 
                         ptr->read_buffer, 
                         MEMCACHED_MAX_BUFFER);
-        if (data_read)
+        if (data_read > 0)
           break;
         else if (data_read == -1)
         {
index 4b29a1cbbec259211ef3800954a580f13f4512f9..956107932615034853f4d12748137f052e759e40 100644 (file)
@@ -32,9 +32,10 @@ memcached_return memcached_response(memcached_server_st *ptr,
 
     while (1)
     {
-      unsigned int read_length;
+      ssize_t read_length;
 
       read_length= memcached_io_read(ptr, buffer_ptr, 1);
+      WATCHPOINT_ASSERT(isgraph(*buffer_ptr) || isspace(*buffer_ptr));
 
       if (read_length != 1)
         return  MEMCACHED_UNKNOWN_READ_FAILURE;
index 8592e55074c8aba5e3a08ade769d8ac3eb0cf305..a1c817a4a3c08bcd8475797281492d3e2ef67cb8 100644 (file)
@@ -392,6 +392,12 @@ uint8_t replace_test(memcached_st *memc)
   memcached_return rc;
   char *key= "foo";
   char *value= "when we sanitize";
+  char *original= "first we insert some data";
+
+  rc= memcached_set(memc, key, strlen(key), 
+                    original, strlen(original),
+                    (time_t)0, (uint32_t)0);
+  assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
 
   rc= memcached_replace(memc, key, strlen(key), 
                     value, strlen(value),
@@ -2312,7 +2318,7 @@ test_st tests[] ={
   {"set2", 0, set_test2 },
   {"set3", 0, set_test3 },
   {"add", 1, add_test },
-  {"replace", 0, replace_test },
+  {"replace", 1, replace_test },
   {"delete", 1, delete_test },
   {"get", 1, get_test },
   {"get2", 0, get_test2 },