X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fbehavior.c;h=2fe17dc8d66943dd025ff29d794c83fb59588ede;hb=2a34f4dcac48917e41a1b6aee37edbe886aa9f7b;hp=138e0f17c98613473b57302f2bb4336c7246e296;hpb=dac169cdb8e544f5967bb8d22f229b49d78afa9a;p=m6w6%2Flibmemcached diff --git a/libmemcached/behavior.c b/libmemcached/behavior.c index 138e0f17..2fe17dc8 100644 --- a/libmemcached/behavior.c +++ b/libmemcached/behavior.c @@ -94,26 +94,16 @@ memcached_return_t memcached_behavior_set(memcached_st *ptr, return memcached_behavior_set_distribution(ptr, (memcached_server_distribution_t)data); case MEMCACHED_BEHAVIOR_KETAMA: { - if (data) - { - (void)memcached_behavior_set_key_hash(ptr, MEMCACHED_HASH_MD5); - (void)memcached_behavior_set_distribution_hash(ptr, MEMCACHED_HASH_MD5); - (void)memcached_behavior_set_distribution(ptr, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA); - } - else - { - (void)memcached_behavior_set_key_hash(ptr, MEMCACHED_HASH_DEFAULT); - (void)memcached_behavior_set_distribution_hash(ptr, MEMCACHED_HASH_DEFAULT); - (void)memcached_behavior_set_distribution(ptr, MEMCACHED_DISTRIBUTION_MODULA); - } + if (data) // Turn on + return memcached_behavior_set_distribution(ptr, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA); - break; + return memcached_behavior_set_distribution(ptr, MEMCACHED_DISTRIBUTION_MODULA); } case MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED: { (void)memcached_behavior_set_key_hash(ptr, MEMCACHED_HASH_MD5); (void)memcached_behavior_set_distribution_hash(ptr, MEMCACHED_HASH_MD5); - ptr->flags.ketama_weighted= set_flag(data); + ptr->ketama.weighted= set_flag(data); /** @note We try to keep the same distribution going. This should be deprecated and rewritten. */ @@ -179,55 +169,12 @@ memcached_return_t memcached_behavior_set(memcached_st *ptr, break; case MEMCACHED_BEHAVIOR_CORK: { - memcached_server_write_instance_st instance; - bool action= set_flag(data); - - if (action == false) - { - ptr->flags.cork= set_flag(false); - return MEMCACHED_SUCCESS; - } - - instance= memcached_server_instance_fetch(ptr, 0); - if (! instance) - return MEMCACHED_NO_SERVERS; - - - /* We just try the first host, and if it is down we return zero */ - memcached_return_t rc; - rc= memcached_connect(instance); - if (rc != MEMCACHED_SUCCESS) - { - return rc; - } - - /* Now we test! */ - memcached_ternary_t enabled; - enabled= test_cork(instance, true); - - switch (enabled) - { - case MEM_FALSE: - return ptr->cached_errno ? MEMCACHED_ERRNO : MEMCACHED_FAILURE ; - case MEM_TRUE: - { - enabled= test_cork(instance, false); - - if (enabled == false) // Possible bug in OS? - { - memcached_quit_server(instance, false); // We should reset everything on this error. - return MEMCACHED_ERRNO; // Errno will be true because we will have already set it. - } - ptr->flags.cork= true; - ptr->flags.tcp_nodelay= true; - memcached_quit(ptr); // We go on and reset the connections. - } - break; - case MEM_NOT: - default: - return memcached_set_error_string(ptr, MEMCACHED_NOT_SUPPORTED, - memcached_string_with_size("MEMCACHED_BEHAVIOR_CORK is not supported on this platform.")); - } +#ifdef HAVE_MSG_MORE + break; +#else + return memcached_set_error_string(ptr, MEMCACHED_NOT_SUPPORTED, + memcached_string_with_size("MEMCACHED_BEHAVIOR_CORK is not supported on this platform.")); +#endif } break; case MEMCACHED_BEHAVIOR_LOAD_FROM_FILE: @@ -279,7 +226,7 @@ uint64_t memcached_behavior_get(memcached_st *ptr, case MEMCACHED_BEHAVIOR_VERIFY_KEY: return ptr->flags.verify_key; case MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED: - return ptr->flags.ketama_weighted; + return ptr->ketama.weighted; case MEMCACHED_BEHAVIOR_DISTRIBUTION: return ptr->distribution; case MEMCACHED_BEHAVIOR_KETAMA: @@ -331,7 +278,7 @@ uint64_t memcached_behavior_get(memcached_st *ptr, if (getsockopt(instance->fd, SOL_SOCKET, SO_SNDBUF, &sock_size, &sock_length) < 0) { - ptr->cached_errno= errno; + memcached_set_errno(ptr, errno, NULL); return 0; /* Zero means error */ } } @@ -367,7 +314,7 @@ uint64_t memcached_behavior_get(memcached_st *ptr, if (getsockopt(instance->fd, SOL_SOCKET, SO_RCVBUF, &sock_size, &sock_length) < 0) { - ptr->cached_errno= errno; + memcached_set_errno(ptr, errno, NULL); return 0; /* Zero means error */ } @@ -387,7 +334,11 @@ uint64_t memcached_behavior_get(memcached_st *ptr, case MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ: return ptr->flags.randomize_replica_read; case MEMCACHED_BEHAVIOR_CORK: - return ptr->flags.cork; +#ifdef HAVE_MSG_MORE + return true; +#else + return false; +#endif case MEMCACHED_BEHAVIOR_TCP_KEEPALIVE: return ptr->flags.tcp_keepalive; case MEMCACHED_BEHAVIOR_LOAD_FROM_FILE: @@ -406,6 +357,14 @@ memcached_return_t memcached_behavior_set_distribution(memcached_st *ptr, memcac { if (type < MEMCACHED_DISTRIBUTION_CONSISTENT_MAX) { + if (MEMCACHED_DISTRIBUTION_CONSISTENT_WEIGHTED) + { + ptr->ketama.weighted= true; + } + else + { + ptr->ketama.weighted= false; + } ptr->distribution= type; run_distribution(ptr); return MEMCACHED_SUCCESS; @@ -502,6 +461,7 @@ const char *libmemcached_string_distribution(const memcached_server_distribution case MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA: return "MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA"; case MEMCACHED_DISTRIBUTION_RANDOM: return "MEMCACHED_DISTRIBUTION_RANDOM"; case MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY: return "MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY"; + case MEMCACHED_DISTRIBUTION_CONSISTENT_WEIGHTED: return "MEMCACHED_DISTRIBUTION_CONSISTENT_WEIGHTED"; default: case MEMCACHED_DISTRIBUTION_CONSISTENT_MAX: return "INVALID memcached_server_distribution_t"; }