X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=libmemcached%2Fmemcached_behavior.c;h=eb3466ce1bea961606db348ba96c1bbc118ff2df;hb=a246ac50a88e4af750fd2dd209eff94dcadf72d2;hp=dd9884892ca89ef8d0bf822015e8ae365053e823;hpb=1b18496b3d1399d90cfba1975f23aee9c747445a;p=awesomized%2Flibmemcached diff --git a/libmemcached/memcached_behavior.c b/libmemcached/memcached_behavior.c index dd988489..eb3466ce 100644 --- a/libmemcached/memcached_behavior.c +++ b/libmemcached/memcached_behavior.c @@ -1,26 +1,29 @@ -#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 behavior of running client. We quit all connections so we can reset the sockets. */ -static 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) { @@ -38,43 +41,46 @@ memcached_return memcached_behavior_set(memcached_st *ptr, break; case MEMCACHED_BEHAVIOR_SND_TIMEOUT: ptr->snd_timeout= (int32_t)data; - break; + break; case MEMCACHED_BEHAVIOR_RCV_TIMEOUT: ptr->rcv_timeout= (int32_t)data; - break; + break; case MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT: ptr->server_failure_limit= (uint32_t)data; - break; + break; case MEMCACHED_BEHAVIOR_BINARY_PROTOCOL: if (data) - set_behavior_flag(ptr, MEM_VERIFY_KEY, 0); - set_behavior_flag(ptr, MEM_BINARY_PROTOCOL, data); - break; + 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; - set_behavior_flag(ptr, MEM_USE_UDP, data); + ptr->flags.use_udp= data ? true : false; + if (data) - set_behavior_flag(ptr,MEM_NOREPLY,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)); @@ -101,33 +107,49 @@ memcached_return memcached_behavior_set(memcached_st *ptr, { ptr->hash= MEMCACHED_HASH_MD5; ptr->distribution= MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA; - set_behavior_flag(ptr, MEM_KETAMA_WEIGHTED, data); + ptr->flags.ketama_weighted= data ? true : false; run_distribution(ptr); break; } + case MEMCACHED_BEHAVIOR_KETAMA_COMPAT_MODE: + switch (data) + { + 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: #ifndef HAVE_HSIEH_HASH - if ((memcached_hash)(data) == MEMCACHED_HASH_HSIEH) + if ((memcached_hash_t)(data) == MEMCACHED_HASH_HSIEH) return MEMCACHED_FAILURE; #endif - ptr->hash= (memcached_hash)(data); + ptr->hash= (memcached_hash_t)(data); break; case MEMCACHED_BEHAVIOR_KETAMA_HASH: - ptr->hash_continuum= (memcached_hash)(data); + 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: - if (ptr->flags & MEM_BINARY_PROTOCOL) + if (ptr->flags.binary_protocol) break; - set_behavior_flag(ptr, MEM_VERIFY_KEY, data); + 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; @@ -152,14 +174,18 @@ memcached_return memcached_behavior_set(memcached_st *ptr, case MEMCACHED_BEHAVIOR_USER_DATA: return MEMCACHED_FAILURE; case MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY: - set_behavior_flag(ptr, MEM_HASH_WITH_PREFIX_KEY, data); + ptr->flags.hash_with_prefix_key= data ? true : false; break; case MEMCACHED_BEHAVIOR_NOREPLY: - set_behavior_flag(ptr, MEM_NOREPLY, data); + ptr->flags.no_reply= data ? true : false; break; case MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS: - set_behavior_flag(ptr, MEM_AUTO_EJECT_HOSTS, data); + 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); @@ -169,11 +195,9 @@ memcached_return memcached_behavior_set(memcached_st *ptr, 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= MEM_NO_BLOCK; - switch (flag) { case MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS: @@ -185,36 +209,42 @@ uint64_t memcached_behavior_get(memcached_st *ptr, case MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH: return ptr->io_key_prefetch; case MEMCACHED_BEHAVIOR_BINARY_PROTOCOL: - temp_flag= MEM_BINARY_PROTOCOL; - break; + 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: - temp_flag= MEM_USE_UDP; - break; + 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: - temp_flag= MEM_KETAMA_WEIGHTED; - break; + return ptr->flags.ketama_weighted; case MEMCACHED_BEHAVIOR_DISTRIBUTION: return ptr->distribution; case MEMCACHED_BEHAVIOR_KETAMA: 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: @@ -222,8 +252,7 @@ uint64_t memcached_behavior_get(memcached_st *ptr, 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 (uint64_t)ptr->poll_timeout; case MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT: @@ -244,7 +273,7 @@ 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 */ @@ -260,7 +289,7 @@ 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 */ @@ -269,22 +298,18 @@ uint64_t memcached_behavior_get(memcached_st *ptr, case MEMCACHED_BEHAVIOR_USER_DATA: return MEMCACHED_FAILURE; case MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY: - temp_flag= MEM_HASH_WITH_PREFIX_KEY; - break; + return ptr->flags.hash_with_prefix_key; case MEMCACHED_BEHAVIOR_NOREPLY: - temp_flag= MEM_NOREPLY; - break; + return ptr->flags.no_reply; case MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS: - temp_flag= MEM_AUTO_EJECT_HOSTS; - break; + 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; + WATCHPOINT_ASSERT(0); /* Programming mistake if it gets this far */ + return 0; }