const memcached_behavior_t flag,
uint64_t data)
{
- if (not ptr)
+ if (ptr == NULL)
+ {
return MEMCACHED_INVALID_ARGUMENTS;
+ }
switch (flag)
{
ptr->flags.auto_eject_hosts= bool(data);
case MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT:
- ptr->server_failure_limit= (uint32_t)data;
+ if (data == 0)
+ {
+ return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT,
+ memcached_literal_param("MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT requires a value greater then zero."));
+ }
+ ptr->server_failure_limit= uint32_t(data);
break;
case MEMCACHED_BEHAVIOR_BINARY_PROTOCOL:
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;
case MEMCACHED_BEHAVIOR_KETAMA:
{
if (data) // Turn on
+ {
return memcached_behavior_set_distribution(ptr, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA);
+ }
return memcached_behavior_set_distribution(ptr, MEMCACHED_DISTRIBUTION_MODULA);
}
case MEMCACHED_BEHAVIOR_VERIFY_KEY:
if (ptr->flags.binary_protocol)
+ {
return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT,
memcached_literal_param("MEMCACHED_BEHAVIOR_VERIFY_KEY if the binary protocol has been enabled."));
+ }
ptr->flags.verify_key= bool(data);
break;
case MEMCACHED_BEHAVIOR_SORT_HOSTS:
{
ptr->flags.use_sort_hosts= bool(data);
- run_distribution(ptr);
-
- break;
+ return run_distribution(ptr);
}
case MEMCACHED_BEHAVIOR_POLL_TIMEOUT:
break;
case MEMCACHED_BEHAVIOR_RETRY_TIMEOUT:
- ptr->retry_timeout= (int32_t)data;
+ if (data == 0)
+ {
+ return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT,
+ memcached_literal_param("MEMCACHED_BEHAVIOR_RETRY_TIMEOUT requires a value greater then zero."));
+ }
+ ptr->retry_timeout= int32_t(data);
+ break;
+
+ case MEMCACHED_BEHAVIOR_DEAD_TIMEOUT:
+ ptr->dead_timeout= int32_t(data);
break;
case MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE:
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:
case MEMCACHED_BEHAVIOR_MAX:
default:
- /* Shouldn't get here */
- WATCHPOINT_ASSERT(0);
- return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT,
- memcached_literal_param("Invalid behavior passed to memcached_behavior_set()"));
+ /* Shouldn't get here */
+ assert_msg(0, "Invalid behavior passed to memcached_behavior_set()");
+ return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT,
+ memcached_literal_param("Invalid behavior passed to memcached_behavior_set()"));
}
return MEMCACHED_SUCCESS;
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;
case MEMCACHED_BEHAVIOR_RETRY_TIMEOUT:
return (uint64_t)ptr->retry_timeout;
+ case MEMCACHED_BEHAVIOR_DEAD_TIMEOUT:
+ return uint64_t(ptr->dead_timeout);
+
case MEMCACHED_BEHAVIOR_SND_TIMEOUT:
return (uint64_t)ptr->snd_timeout;
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);
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 */
}
}
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;
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;
case MEMCACHED_BEHAVIOR_MAX:
default:
- WATCHPOINT_ASSERT(0); /* Programming mistake if it gets this far */
+ assert_msg(0, "Invalid behavior passed to memcached_behavior_set()");
return 0;
}
{
ptr->ketama.weighted= false;
}
+
ptr->distribution= type;
- run_distribution(ptr);
- return MEMCACHED_SUCCESS;
+ return run_distribution(ptr);
}
return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT,
memcached_return_t memcached_behavior_set_key_hash(memcached_st *ptr, memcached_hash_t type)
{
if (hashkit_success(hashkit_set_function(&ptr->hashkit, (hashkit_hash_algorithm_t)type)))
+ {
return MEMCACHED_SUCCESS;
+ }
return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT,
memcached_literal_param("Invalid memcached_hash_t()"));
case MEMCACHED_BEHAVIOR_VERIFY_KEY: return "MEMCACHED_BEHAVIOR_VERIFY_KEY";
case MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT: return "MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT";
case MEMCACHED_BEHAVIOR_RETRY_TIMEOUT: return "MEMCACHED_BEHAVIOR_RETRY_TIMEOUT";
+ case MEMCACHED_BEHAVIOR_DEAD_TIMEOUT: return "MEMCACHED_BEHAVIOR_DEAD_TIMEOUT";
case MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED: return "MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED";
case MEMCACHED_BEHAVIOR_KETAMA_HASH: return "MEMCACHED_BEHAVIOR_KETAMA_HASH";
case MEMCACHED_BEHAVIOR_BINARY_PROTOCOL: return "MEMCACHED_BEHAVIOR_BINARY_PROTOCOL";
{
memcached_return_t rc;
- if (not self)
+ if (self == NULL)
+ {
return MEMCACHED_INVALID_ARGUMENTS;
+ }
- if (not host_map)
+ if (host_map == NULL)
+ {
return MEMCACHED_INVALID_ARGUMENTS;
+ }
memcached_server_distribution_t old= memcached_behavior_get_distribution(self);