X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fmemcached_behavior.c;h=eb3466ce1bea961606db348ba96c1bbc118ff2df;hb=a246ac50a88e4af750fd2dd209eff94dcadf72d2;hp=aac63f4239541d12cb9f2fd06417e6e3fc56829c;hpb=42b674b747eae466d9ca0d766555c53ae75dc367;p=awesomized%2Flibmemcached diff --git a/libmemcached/memcached_behavior.c b/libmemcached/memcached_behavior.c index aac63f42..eb3466ce 100644 --- a/libmemcached/memcached_behavior.c +++ b/libmemcached/memcached_behavior.c @@ -1,73 +1,155 @@ -#include "common.h" +/* LibMemcached + * Copyright (C) 2006-2009 Brian Aker + * All rights reserved. + * + * Use and distribution licensed under the BSD license. See + * the COPYING file in the parent directory for full text. + * + * Summary: Change the behavior of the memcached connection. + * + */ + +#include "common.h" +#include #include #include #include -/* - This function is used to modify the behabior of running client. +/* + This function is used to modify the behavior of running client. We quit all connections so we can reset the sockets. */ -void set_behavior_flag(memcached_st *ptr, memcached_flags temp_flag, uint64_t data) -{ - if (data) - ptr->flags|= temp_flag; - else - ptr->flags&= ~temp_flag; -} - -memcached_return memcached_behavior_set(memcached_st *ptr, - memcached_behavior flag, - uint64_t data) +memcached_return_t memcached_behavior_set(memcached_st *ptr, + memcached_behavior_t flag, + uint64_t data) { switch (flag) { + case MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS: + ptr->number_of_replicas= (uint32_t)data; + break; + case MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK: + ptr->io_msg_watermark= (uint32_t) data; + break; + case MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK: + ptr->io_bytes_watermark= (uint32_t)data; + break; + case MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH: + ptr->io_key_prefetch = (uint32_t)data; + break; + case MEMCACHED_BEHAVIOR_SND_TIMEOUT: + ptr->snd_timeout= (int32_t)data; + break; + case MEMCACHED_BEHAVIOR_RCV_TIMEOUT: + ptr->rcv_timeout= (int32_t)data; + break; + case MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT: + ptr->server_failure_limit= (uint32_t)data; + break; + case MEMCACHED_BEHAVIOR_BINARY_PROTOCOL: + if (data) + ptr->flags.verify_key= false; + + ptr->flags.binary_protocol= data ? true : false; + break; case MEMCACHED_BEHAVIOR_SUPPORT_CAS: - set_behavior_flag(ptr, MEM_SUPPORT_CAS, data); + ptr->flags.support_cas= data ? true: false; break; case MEMCACHED_BEHAVIOR_NO_BLOCK: - set_behavior_flag(ptr, MEM_NO_BLOCK, data); + ptr->flags.no_block= data ? true: false; memcached_quit(ptr); + break; case MEMCACHED_BEHAVIOR_BUFFER_REQUESTS: - set_behavior_flag(ptr, MEM_BUFFER_REQUESTS, data); + ptr->flags.buffer_requests= data ? true : false; memcached_quit(ptr); break; + case MEMCACHED_BEHAVIOR_USE_UDP: + if (ptr->number_of_hosts) + return MEMCACHED_FAILURE; + ptr->flags.use_udp= data ? true : false; + + if (data) + ptr->flags.no_reply= data ? true : false; + break; + case MEMCACHED_BEHAVIOR_TCP_NODELAY: - set_behavior_flag(ptr, MEM_TCP_NODELAY, data); + ptr->flags.tcp_nodelay= data ? true : false; memcached_quit(ptr); break; case MEMCACHED_BEHAVIOR_DISTRIBUTION: { - ptr->distribution= (memcached_server_distribution)(data); + ptr->distribution= (memcached_server_distribution_t)(data); + if (ptr->distribution == MEMCACHED_DISTRIBUTION_RANDOM) + { + srandom((uint32_t) time(NULL)); + } run_distribution(ptr); break; } case MEMCACHED_BEHAVIOR_KETAMA: - if (data) + { + if (data) + { + ptr->hash= MEMCACHED_HASH_MD5; + ptr->distribution= MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA; + } + else + { + ptr->hash= 0; + ptr->distribution= 0; + } + run_distribution(ptr); + break; + } + case MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED: { ptr->hash= MEMCACHED_HASH_MD5; ptr->distribution= MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA; + ptr->flags.ketama_weighted= data ? true : false; + run_distribution(ptr); + break; } - else + case MEMCACHED_BEHAVIOR_KETAMA_COMPAT_MODE: + switch (data) { - ptr->hash= 0; - ptr->distribution= 0; + case MEMCACHED_KETAMA_COMPAT_LIBMEMCACHED: + ptr->hash= MEMCACHED_HASH_MD5; + ptr->distribution= MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA; + break; + case MEMCACHED_KETAMA_COMPAT_SPY: + ptr->hash= MEMCACHED_HASH_MD5; + ptr->distribution= MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY; + break; + default: + return MEMCACHED_FAILURE; } + run_distribution(ptr); break; case MEMCACHED_BEHAVIOR_HASH: - ptr->hash= (memcached_hash)(data); +#ifndef HAVE_HSIEH_HASH + if ((memcached_hash_t)(data) == MEMCACHED_HASH_HSIEH) + return MEMCACHED_FAILURE; +#endif + ptr->hash= (memcached_hash_t)(data); + break; + case MEMCACHED_BEHAVIOR_KETAMA_HASH: + ptr->hash_continuum= (memcached_hash_t)(data); + run_distribution(ptr); break; case MEMCACHED_BEHAVIOR_CACHE_LOOKUPS: - set_behavior_flag(ptr, MEM_USE_CACHE_LOOKUPS, data); + ptr->flags.use_cache_lookups= data ? true : false; memcached_quit(ptr); break; case MEMCACHED_BEHAVIOR_VERIFY_KEY: - set_behavior_flag(ptr, MEM_VERIFY_KEY, data); + if (ptr->flags.binary_protocol) + break; + ptr->flags.verify_key= data ? true : false; break; case MEMCACHED_BEHAVIOR_SORT_HOSTS: { - set_behavior_flag(ptr, MEM_USE_SORT_HOSTS, data); + ptr->flags.use_sort_hosts= data ? true : false; run_distribution(ptr); break; @@ -91,57 +173,96 @@ memcached_return memcached_behavior_set(memcached_st *ptr, break; case MEMCACHED_BEHAVIOR_USER_DATA: return MEMCACHED_FAILURE; + case MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY: + ptr->flags.hash_with_prefix_key= data ? true : false; + break; + case MEMCACHED_BEHAVIOR_NOREPLY: + ptr->flags.no_reply= data ? true : false; + break; + case MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS: + ptr->flags.auto_eject_hosts= data ? true : false; + break; + case MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ: + srandom((uint32_t) time(NULL)); + ptr->flags.randomize_replica_read= data ? true : false; + break; + default: + /* Shouldn't get here */ + WATCHPOINT_ASSERT(flag); + break; } return MEMCACHED_SUCCESS; } -uint64_t memcached_behavior_get(memcached_st *ptr, - memcached_behavior flag) +uint64_t memcached_behavior_get(memcached_st *ptr, + memcached_behavior_t flag) { - memcached_flags temp_flag= 0; - switch (flag) { + case MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS: + return ptr->number_of_replicas; + case MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK: + return ptr->io_msg_watermark; + case MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK: + return ptr->io_bytes_watermark; + case MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH: + return ptr->io_key_prefetch; + case MEMCACHED_BEHAVIOR_BINARY_PROTOCOL: + return ptr->flags.binary_protocol; case MEMCACHED_BEHAVIOR_SUPPORT_CAS: - temp_flag= MEM_SUPPORT_CAS; - break; + return ptr->flags.support_cas; case MEMCACHED_BEHAVIOR_CACHE_LOOKUPS: - temp_flag= MEM_USE_CACHE_LOOKUPS; + return ptr->flags.use_cache_lookups; break; case MEMCACHED_BEHAVIOR_NO_BLOCK: - temp_flag= MEM_NO_BLOCK; - break; + return ptr->flags.no_block; case MEMCACHED_BEHAVIOR_BUFFER_REQUESTS: - temp_flag= MEM_BUFFER_REQUESTS; - break; + return ptr->flags.buffer_requests; + case MEMCACHED_BEHAVIOR_USE_UDP: + return ptr->flags.use_udp; case MEMCACHED_BEHAVIOR_TCP_NODELAY: - temp_flag= MEM_TCP_NODELAY; - break; + return ptr->flags.tcp_nodelay; case MEMCACHED_BEHAVIOR_VERIFY_KEY: - temp_flag= MEM_VERIFY_KEY; - break; + return ptr->flags.verify_key; + case MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED: + return ptr->flags.ketama_weighted; case MEMCACHED_BEHAVIOR_DISTRIBUTION: return ptr->distribution; case MEMCACHED_BEHAVIOR_KETAMA: - return (ptr->distribution == MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA && ptr->hash == MEMCACHED_HASH_MD5 ) ? 1 : 0; + return (ptr->distribution == MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA) ? (uint64_t) 1 : 0; + case MEMCACHED_BEHAVIOR_KETAMA_COMPAT_MODE: + switch (ptr->distribution) + { + case MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA: + return MEMCACHED_KETAMA_COMPAT_LIBMEMCACHED; + case MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY: + return MEMCACHED_KETAMA_COMPAT_SPY; + case MEMCACHED_DISTRIBUTION_MODULA: + case MEMCACHED_DISTRIBUTION_CONSISTENT: + case MEMCACHED_DISTRIBUTION_RANDOM: + default: + return (uint64_t)-1; + } + /* NOTREACHED */ case MEMCACHED_BEHAVIOR_HASH: return ptr->hash; + case MEMCACHED_BEHAVIOR_KETAMA_HASH: + return ptr->hash_continuum; + case MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT: + return ptr->server_failure_limit; case MEMCACHED_BEHAVIOR_SORT_HOSTS: - temp_flag= MEM_USE_SORT_HOSTS; - break; + return ptr->flags.use_sort_hosts; case MEMCACHED_BEHAVIOR_POLL_TIMEOUT: - { - return (unsigned long long)ptr->poll_timeout; - } + return (uint64_t)ptr->poll_timeout; case MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT: - { - return (unsigned long long)ptr->connect_timeout; - } + return (uint64_t)ptr->connect_timeout; case MEMCACHED_BEHAVIOR_RETRY_TIMEOUT: - { - return (unsigned long long)ptr->retry_timeout; - } + return (uint64_t)ptr->retry_timeout; + case MEMCACHED_BEHAVIOR_SND_TIMEOUT: + return (uint64_t)ptr->snd_timeout; + case MEMCACHED_BEHAVIOR_RCV_TIMEOUT: + return (uint64_t)ptr->rcv_timeout; case MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE: { int sock_size; @@ -152,11 +273,11 @@ uint64_t memcached_behavior_get(memcached_st *ptr, if ((memcached_connect(&ptr->hosts[0])) != MEMCACHED_SUCCESS) return 0; - if (getsockopt(ptr->hosts[0].fd, SOL_SOCKET, + if (getsockopt(ptr->hosts[0].fd, SOL_SOCKET, SO_SNDBUF, &sock_size, &sock_length)) return 0; /* Zero means error */ - return sock_size; + return (uint64_t) sock_size; } case MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE: { @@ -168,21 +289,27 @@ uint64_t memcached_behavior_get(memcached_st *ptr, if ((memcached_connect(&ptr->hosts[0])) != MEMCACHED_SUCCESS) return 0; - if (getsockopt(ptr->hosts[0].fd, SOL_SOCKET, + if (getsockopt(ptr->hosts[0].fd, SOL_SOCKET, SO_RCVBUF, &sock_size, &sock_length)) return 0; /* Zero means error */ - return sock_size; + return (uint64_t) sock_size; } case MEMCACHED_BEHAVIOR_USER_DATA: return MEMCACHED_FAILURE; + case MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY: + return ptr->flags.hash_with_prefix_key; + case MEMCACHED_BEHAVIOR_NOREPLY: + return ptr->flags.no_reply; + case MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS: + return ptr->flags.auto_eject_hosts; + case MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ: + return ptr->flags.randomize_replica_read; + default: + WATCHPOINT_ASSERT(flag); + break; } - WATCHPOINT_ASSERT(temp_flag); /* Programming mistake if it gets this far */ - if (ptr->flags & temp_flag) - return 1; - else - return 0; - - return MEMCACHED_SUCCESS; + WATCHPOINT_ASSERT(0); /* Programming mistake if it gets this far */ + return 0; }