Fix for death of file io to call shutdown()
author <brian@h219-110-127-160.catv02.itscom.jp> <>
Wed, 21 May 2008 14:49:54 +0000 (23:49 +0900)
committer <brian@h219-110-127-160.catv02.itscom.jp> <>
Wed, 21 May 2008 14:49:54 +0000 (23:49 +0900)
ChangeLog
libmemcached/memcached_get.c
libmemcached/memcached_io.c
libmemcached/memcached_io.h
libmemcached/memcached_quit.c

index 7c95c16cbca6d51846d77854e25bca7ad19ba865..e533985ca5451d335249ddd7445ac85a0183f4c7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,7 @@
   * New  MEMCACHED_CALLBACK_PREFIX_KEY added. You can now create domains for
     values.
   * Fixed bug introducd in last version on memcp
+  * Fix for death of file io to call shutdown()
 
 0.20 Mon May  5 08:34:26 PDT 2008
   * New consistent distribution tests.
index f6c81338a1bf817f376c789fb179756a1cafa658..34fcb4ea974a1ad2729e000ff2fac2624558d160 100644 (file)
@@ -51,22 +51,28 @@ char *memcached_get_by_key(memcached_st *ptr,
       /* On all failure drop to returning NULL */
       if (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED)
       {
-        uint8_t latch; /* We use latch to track the state of the original socket */
-
         if (rc == MEMCACHED_BUFFERED)
         {
+          uint8_t latch; /* We use latch to track the state of the original socket */
           latch= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS);
           if (latch == 0)
             memcached_behavior_set(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 1);
-        }
 
-        rc= memcached_set(ptr, key, key_length, 
-                          memcached_result_value(&ptr->result),
-                          memcached_result_length(&ptr->result),
-                          0, memcached_result_flags(&ptr->result));
+          rc= memcached_set(ptr, key, key_length, 
+                            memcached_result_value(&ptr->result),
+                            memcached_result_length(&ptr->result),
+                            0, memcached_result_flags(&ptr->result));
 
-        if (rc == MEMCACHED_BUFFERED && latch == 0)
-          memcached_behavior_set(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 0);
+          if (rc == MEMCACHED_BUFFERED && latch == 0)
+            memcached_behavior_set(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 0);
+        }
+        else
+        {
+          rc= memcached_set(ptr, key, key_length, 
+                            memcached_result_value(&ptr->result),
+                            memcached_result_length(&ptr->result),
+                            0, memcached_result_flags(&ptr->result));
+        }
 
         if (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED)
         {
index 38544102bcc54765101b25e2beb68e4390db639d..93ca41732d4ca26741c2c905e10e9ea001795e15 100644 (file)
@@ -204,9 +204,14 @@ ssize_t memcached_io_write(memcached_server_st *ptr,
   return original_length;
 }
 
-memcached_return memcached_io_close(memcached_server_st *ptr)
+memcached_return memcached_io_close(memcached_server_st *ptr, uint8_t io_death)
 {
-  close(ptr->fd);
+  /* in case of death shutdown to avoid blocking at close() */
+
+  if (io_death)
+    shutdown(ptr->fd, SHUT_RDWR);
+  else
+    close(ptr->fd);
 
   return MEMCACHED_SUCCESS;
 }
index 887f520049e172e9f950e5f627075db864bf575c..f7a725740c38e346757e061b8c4fae89dfe521f3 100644 (file)
@@ -6,4 +6,4 @@ ssize_t memcached_io_write(memcached_server_st *ptr,
 void memcached_io_reset(memcached_server_st *ptr);
 ssize_t memcached_io_read(memcached_server_st *ptr,
                           char *buffer, size_t length);
-memcached_return memcached_io_close(memcached_server_st *ptr);
+memcached_return memcached_io_close(memcached_server_st *ptr, uint8_t io_death);
index b764cd1bf318ab6bdb41121ef80dd10a4b40ef2c..9749b848306cafaae7b15c693196dd728e0cedf0 100644 (file)
@@ -29,12 +29,9 @@ void memcached_quit_server(memcached_server_st *ptr, uint8_t io_death)
        */
       while ((read_length=
              memcached_io_read(ptr, buffer, sizeof(buffer)/sizeof(*buffer)))
-            > 0)
-       {
-         ;
-       }
+            > 0);
     }
-    memcached_io_close(ptr);
+    memcached_io_close(ptr, io_death);
 
     ptr->fd= -1;
     ptr->write_buffer_offset= 0;