Update tests, improved UDP performance.
[m6w6/libmemcached] / libmemcached / behavior.cc
index 2b3b389ce709d6cddb52a174d6e8dfa75f0cad94..9769759ba884a58b8cb37067893cd50d0aaf9819 100644 (file)
@@ -114,19 +114,26 @@ memcached_return_t memcached_behavior_set(memcached_st *ptr,
     break;
 
   case MEMCACHED_BEHAVIOR_BUFFER_REQUESTS:
+    if (memcached_is_udp(ptr))
+    {
+      return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT,
+                                 memcached_literal_param("MEMCACHED_BEHAVIOR_BUFFER_REQUESTS cannot be set while MEMCACHED_BEHAVIOR_USE_UDP is enabled."));
+    }
     ptr->flags.buffer_requests= bool(data);
     send_quit(ptr);
     break;
 
   case MEMCACHED_BEHAVIOR_USE_UDP:
-    if (memcached_server_count(ptr))
+    send_quit(ptr); // We need t shutdown all of the connections to make sure we do the correct protocol
+    ptr->flags.use_udp= bool(data);
+    if (bool(data))
     {
-      return MEMCACHED_FAILURE;
+      ptr->flags.reply= false;
+      ptr->flags.buffer_requests= false;
     }
-    ptr->flags.use_udp= bool(data);
-    if (data)
+    else
     {
-      ptr->flags.no_reply= bool(data);
+      ptr->flags.reply= true;
     }
     break;
 
@@ -228,7 +235,14 @@ memcached_return_t memcached_behavior_set(memcached_st *ptr,
     break;
 
   case MEMCACHED_BEHAVIOR_NOREPLY:
-    ptr->flags.no_reply= bool(data);
+    if (memcached_is_udp(ptr) and bool(data) == false)
+    {
+      return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT,
+                                 memcached_literal_param("MEMCACHED_BEHAVIOR_NOREPLY cannot be disabled while MEMCACHED_BEHAVIOR_USE_UDP is enabled."));
+    }
+    // We reverse the logic here to make it easier to understand throughout the
+    // code.
+    ptr->flags.reply= bool(data) ? false : true;
     break;
 
   case MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS:
@@ -302,7 +316,7 @@ uint64_t memcached_behavior_get(memcached_st *ptr,
     return ptr->flags.buffer_requests;
 
   case MEMCACHED_BEHAVIOR_USE_UDP:
-    return ptr->flags.use_udp;
+    return memcached_is_udp(ptr);
 
   case MEMCACHED_BEHAVIOR_TCP_NODELAY:
     return ptr->flags.tcp_nodelay;
@@ -356,7 +370,9 @@ uint64_t memcached_behavior_get(memcached_st *ptr,
       socklen_t sock_length= sizeof(int);
 
       if (ptr->send_size != -1) // If value is -1 then we are using the default
+      {
         return (uint64_t) ptr->send_size;
+      }
 
       memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, 0);
 
@@ -376,7 +392,7 @@ uint64_t memcached_behavior_get(memcached_st *ptr,
 
         if (getsockopt(instance->fd, SOL_SOCKET, SO_SNDBUF, &sock_size, &sock_length) < 0)
         {
-          memcached_set_errno(*ptr, errno, MEMCACHED_AT);
+          memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
           return 0; /* Zero means error */
         }
       }
@@ -412,10 +428,9 @@ uint64_t memcached_behavior_get(memcached_st *ptr,
 
         if (getsockopt(instance->fd, SOL_SOCKET, SO_RCVBUF, &sock_size, &sock_length) < 0)
         {
-          memcached_set_errno(*ptr, errno, MEMCACHED_AT);
+          memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
           return 0; /* Zero means error */
         }
-
       }
 
       return (uint64_t) sock_size;
@@ -430,7 +445,7 @@ uint64_t memcached_behavior_get(memcached_st *ptr,
     return ptr->flags.hash_with_namespace;
 
   case MEMCACHED_BEHAVIOR_NOREPLY:
-    return ptr->flags.no_reply;
+    return ptr->flags.reply ? false : true;
 
   case MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS:
     return ptr->flags.auto_eject_hosts;