Set recv/send sockket sizes.
authorBrian Aker <brian@tangent.org>
Tue, 16 Oct 2007 10:14:51 +0000 (03:14 -0700)
committerBrian Aker <brian@tangent.org>
Tue, 16 Oct 2007 10:14:51 +0000 (03:14 -0700)
Clarrified the memcached_behavior_set will reconnect sockets.

All test cases pass.

docs/memcached_behavior.pod
include/memcached.h
lib/memcached_behavior.c
lib/memcached_connect.c
tests/output.res
tests/test.c

index d9e157f4ea1e4116dbceb6ecc0e86eb8d67927bd..55e82d8d2d7f7032283d73f45b1bd2cc1717e144 100755 (executable)
@@ -32,7 +32,8 @@ that behavior is currently enabled in the client.
 
 memcached_behavior_set() changes the value of a particular option of the
 client. It takes both a flag (listed below) and a value. For simple on or
-off options you just need to pass in a value of 1.
+off options you just need to pass in a value of 1. Calls to 
+memcached_behavior_set() will flush and reset all connections.
 
 =over 4
 
index 652a77c55abf3bac6b9645304e9eefe27bf766e1..a706fea657048c8b15b87fd01f21e8c1765e780f 100644 (file)
@@ -28,7 +28,7 @@ typedef struct memcached_server_st memcached_server_st;
 #define HUGE_STRING_LEN 8196
 #define MEMCACHED_MAX_KEY 251 /* We add one to have it null terminated */
 //#define MEMCACHED_MAX_BUFFER 8196
-#define MEMCACHED_MAX_BUFFER HUGE_STRING_LEN*4
+#define MEMCACHED_MAX_BUFFER HUGE_STRING_LEN*2
 
 typedef enum {
   MEMCACHED_SUCCESS,
@@ -65,6 +65,8 @@ typedef enum {
   MEMCACHED_BEHAVIOR_TCP_NODELAY,
   MEMCACHED_BEHAVIOR_MD5_HASHING,
   MEMCACHED_BEHAVIOR_KETAMA,
+  MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE,
+  MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE,
 } memcached_behavior;
 
 typedef enum {
@@ -129,6 +131,8 @@ struct memcached_st {
   char connected;
   int my_errno;
   unsigned long long flags;
+  int send_size;
+  int recv_size;
   memcached_return warning; /* Future Use */
 };
 
index 1ce495afe336ee27e0d28ef78325afe82e6450f3..17a0d83bf5ff94bbeed5e70ef22b5f1554cdc992 100644 (file)
@@ -38,6 +38,20 @@ memcached_return memcached_behavior_set(memcached_st *ptr,
   case MEMCACHED_BEHAVIOR_KETAMA:
     set_behavior_flag(ptr, MEM_USE_KETAMA, data);
     break;
+  case MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE:
+    {
+      ptr->send_size= (*((int *)data));
+      memcached_quit(ptr);
+      break;
+    }
+  case MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE:
+    {
+      ptr->recv_size= (*((int *)data));
+      memcached_quit(ptr);
+      break;
+    }
+
+
   }
 
   return MEMCACHED_SUCCESS;
@@ -46,7 +60,7 @@ memcached_return memcached_behavior_set(memcached_st *ptr,
 unsigned long long memcached_behavior_get(memcached_st *ptr, 
                                           memcached_behavior flag)
 {
-  memcached_flags temp_flag;
+  memcached_flags temp_flag= 0;
 
   switch (flag)
   {
@@ -62,8 +76,39 @@ unsigned long long memcached_behavior_get(memcached_st *ptr,
   case MEMCACHED_BEHAVIOR_KETAMA:
     temp_flag= MEM_USE_KETAMA;
     break;
+  case MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE:
+    {
+      int sock_size;
+      socklen_t sock_length= sizeof(int);
+
+      /* We just try the first host, and if it is down we return zero */
+      if ((memcached_connect(ptr, 0)) != MEMCACHED_SUCCESS)
+        return 0;
+
+      if (getsockopt(ptr->hosts[0].fd, SOL_SOCKET, 
+                     SO_SNDBUF, &sock_size, &sock_length))
+        return 0; /* Zero means error */
+
+      return sock_size;
+    }
+  case MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE:
+    {
+      int sock_size;
+      socklen_t sock_length= sizeof(int);
+
+      /* We just try the first host, and if it is down we return zero */
+      if ((memcached_connect(ptr, 0)) != MEMCACHED_SUCCESS)
+        return 0;
+
+      if (getsockopt(ptr->hosts[0].fd, SOL_SOCKET, 
+                     SO_RCVBUF, &sock_size, &sock_length))
+        return 0; /* Zero means error */
+
+      return sock_size;
+    }
   }
 
+  assert(temp_flag); /* Programming mistake if it gets this far */
   if (ptr->flags & temp_flag)
     return 1;
   else
index 57274be2086a17d35192dd98bd68c54716de2507..34613ddd13a7a1007a8ec45b3bbdd2ed69170911 100644 (file)
@@ -33,7 +33,6 @@ memcached_return memcached_real_connect(memcached_st *ptr, unsigned int server_k
       return MEMCACHED_CONNECTION_SOCKET_CREATE_FAILURE;
     }
 
-
     /* bind any port number */
     localAddr.sin_family = AF_INET;
     localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
@@ -57,6 +56,18 @@ memcached_return memcached_real_connect(memcached_st *ptr, unsigned int server_k
                  &flag, (socklen_t)sizeof(int));
     }
 
+    if (ptr->send_size)
+    {
+      setsockopt(ptr->hosts[server_key].fd, SOL_SOCKET, SO_SNDBUF, 
+                 &ptr->send_size, (socklen_t)sizeof(int));
+    }
+
+    if (ptr->recv_size)
+    {
+      setsockopt(ptr->hosts[server_key].fd, SOL_SOCKET, SO_SNDBUF, 
+                 &ptr->recv_size, (socklen_t)sizeof(int));
+    }
+
     /* connect to server */
 test_connect:
     if (connect(ptr->hosts[server_key].fd, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
index a3c5c628e9def0c140d98dfb1093587810773012..813c18b158c20d419f665d068d0371f822369dd9 100644 (file)
@@ -1,4 +1,6 @@
 servers localhost
+       localhost : 11211
+
 Error 0 -> SUCCESS
 Error 1 -> FAILURE
 Error 2 -> HOSTNAME LOOKUP FAILURE
@@ -24,6 +26,7 @@ Error 21 -> SERVER END
 Error 22 -> SERVER DELETE
 Error 23 -> SERVER VALUE
 Error 24 -> STAT VALUE
+Error 25 -> UNKOWN ERROR SEE MY_ERRNO
 Found key pid
 Found key uptime
 Found key time
@@ -127,6 +130,7 @@ Error 21 -> SERVER END
 Error 22 -> SERVER DELETE
 Error 23 -> SERVER VALUE
 Error 24 -> STAT VALUE
+Error 25 -> UNKOWN ERROR SEE MY_ERRNO
 Found key pid
 Found key uptime
 Found key time
@@ -230,6 +234,7 @@ Error 21 -> SERVER END
 Error 22 -> SERVER DELETE
 Error 23 -> SERVER VALUE
 Error 24 -> STAT VALUE
+Error 25 -> UNKOWN ERROR SEE MY_ERRNO
 Found key pid
 Found key uptime
 Found key time
@@ -333,6 +338,7 @@ Error 21 -> SERVER END
 Error 22 -> SERVER DELETE
 Error 23 -> SERVER VALUE
 Error 24 -> STAT VALUE
+Error 25 -> UNKOWN ERROR SEE MY_ERRNO
 Found key pid
 Found key uptime
 Found key time
index ba1aee379f723df910e36228a21bde4f1787e0e3..16afb65e5905acfc1d73c1948451b34a74fb20c0 100644 (file)
@@ -102,7 +102,6 @@ void delete_test(memcached_st *memc)
   assert(rc == MEMCACHED_SUCCESS);
 
   rc= memcached_delete(memc, key, strlen(key), (time_t)0);
-  WATCHPOINT_ERROR(rc);
   assert(rc == MEMCACHED_SUCCESS);
 }
 
@@ -222,8 +221,6 @@ void get_test3(memcached_st *memc)
   string= memcached_get(memc, key, strlen(key),
                         &string_length, &flags, &rc);
 
-  WATCHPOINT_ERRNO(memc->my_errno);
-  WATCHPOINT_ERROR(rc);
   assert(rc == MEMCACHED_SUCCESS);
   assert(string);
   assert(string_length == value_length);
@@ -500,6 +497,12 @@ void behavior_test(memcached_st *memc)
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_MD5_HASHING, &set);
   value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_MD5_HASHING);
   assert(value == 0);
+
+  value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE);
+  assert(value > 0);
+
+  value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE);
+  assert(value > 0);
 }
 
 /* Test case provided by Cal Haldenbrand */