Use TCP_CORK/TCP_NOFLUSH socket options where available to coalesce writes for multi...
authorAdam Thomason <ad@mthomason.net>
Wed, 11 Nov 2009 01:38:26 +0000 (17:38 -0800)
committerAdam Thomason <ad@mthomason.net>
Wed, 11 Nov 2009 01:38:26 +0000 (17:38 -0800)
libmemcached/memcached_io.c
libmemcached/memcached_server.c
libmemcached/memcached_server.h

index 693ce95c54ddc052642acc7fd98137c54fb8ebbc..fdcdfdd6595170a37acf01c22d720c197426c9f4 100644 (file)
@@ -142,6 +142,28 @@ static bool process_input_buffer(memcached_server_st *ptr)
   return false;
 }
 
+#ifdef TCP_CORK
+  #define CORK TCP_CORK
+#elif defined TCP_NOPUSH
+  #define CORK TCP_NOPUSH
+#endif
+
+static void memcached_io_cork(memcached_server_st *ptr, int enable)
+{
+  #ifdef CORK
+  if (ptr->type != MEMCACHED_CONNECTION_TCP)
+    return;
+
+  if ((enable && ptr->is_corked) || (!enable && !ptr->is_corked))
+    return;
+
+  int err= setsockopt(ptr->fd, IPPROTO_TCP, CORK,
+                      &enable, (socklen_t)sizeof(int));
+  if (!err)
+    ptr->is_corked= enable;
+  #endif
+}
+
 #ifdef UNUSED
 void memcached_io_preread(memcached_st *ptr)
 {
@@ -268,6 +290,10 @@ ssize_t memcached_io_write(memcached_server_st *ptr,
   original_length= length;
   buffer_ptr= buffer;
 
+  /* more writable data is coming if a flush isn't required, so delay send */
+  if (!with_flush)
+    memcached_io_cork(ptr, 1);
+
   while (length)
   {
     char *write_ptr;
@@ -319,6 +345,7 @@ ssize_t memcached_io_write(memcached_server_st *ptr,
     WATCHPOINT_ASSERT(ptr->fd != -1);
     if (io_flush(ptr, &rc) == -1)
       return -1;
+    memcached_io_cork(ptr, 0);
   }
 
   return (ssize_t) original_length;
index 2ecbe214d9fb416f60b9fca98290bb70ee37977f..e45d1c9507b20f01084230712014a2625cc97a73 100644 (file)
@@ -38,6 +38,7 @@ memcached_server_st *memcached_server_create_with(memcached_st *memc, memcached_
   host->fd= -1;
   host->type= type;
   host->read_ptr= host->read_buffer;
+  host->is_corked= 0;
   if (memc)
     host->next_retry= memc->retry_timeout;
   if (type == MEMCACHED_CONNECTION_UDP)
index de57eaec3534cf69cba4fd5cd91707cf666d4740..6d1e376e99a279387977ab50ef8b7ed754808425 100644 (file)
@@ -40,6 +40,7 @@ struct memcached_server_st {
   char read_buffer[MEMCACHED_MAX_BUFFER];
   char write_buffer[MEMCACHED_MAX_BUFFER];
   char hostname[MEMCACHED_MAX_HOST_LENGTH];
+  bool is_corked;
 };
 
 #define memcached_server_count(A) (A)->number_of_hosts