X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fbehavior.c;h=2b6ccdf9112fda235bb2dc163497b9b49fd712f4;hb=29251f6f205e2323a473c181aaee98786fc90dca;hp=7ca97e3a716cccb85a4deb9308f19fa50ce613e1;hpb=ff452398ec3114d6af77aa5d2d77f53b18d980e3;p=m6w6%2Flibmemcached diff --git a/libmemcached/behavior.c b/libmemcached/behavior.c index 7ca97e3a..2b6ccdf9 100644 --- a/libmemcached/behavior.c +++ b/libmemcached/behavior.c @@ -12,8 +12,6 @@ #include "common.h" #include #include -#include -#include static bool set_flag(uint64_t data) { @@ -55,6 +53,7 @@ memcached_return_t memcached_behavior_set(memcached_st *ptr, ptr->server_failure_limit= (uint32_t)data; break; case MEMCACHED_BEHAVIOR_BINARY_PROTOCOL: + memcached_quit(ptr); // We need t shutdown all of the connections to make sure we do the correct protocol if (data) { ptr->flags.verify_key= false; @@ -238,7 +237,7 @@ memcached_return_t memcached_behavior_set(memcached_st *ptr, return MEMCACHED_SUCCESS; } -inline bool _is_auto_eject_host(const memcached_st *ptr) +bool _is_auto_eject_host(const memcached_st *ptr) { return ptr->flags.auto_eject_hosts; } @@ -314,11 +313,20 @@ uint64_t memcached_behavior_get(memcached_st *ptr, /* REFACTOR */ /* We just try the first host, and if it is down we return zero */ if ((memcached_connect(instance)) != MEMCACHED_SUCCESS) + { + return 0; + } + + if (memcached_io_wait_for_write(instance) != MEMCACHED_SUCCESS) + { return 0; + } - if (getsockopt(instance->fd, SOL_SOCKET, - SO_SNDBUF, &sock_size, &sock_length)) + if (getsockopt(instance->fd, SOL_SOCKET, SO_SNDBUF, &sock_size, &sock_length) < 0) + { + ptr->cached_errno= errno; return 0; /* Zero means error */ + } } return (uint64_t) sock_size; @@ -341,11 +349,20 @@ uint64_t memcached_behavior_get(memcached_st *ptr, { /* We just try the first host, and if it is down we return zero */ if ((memcached_connect(instance)) != MEMCACHED_SUCCESS) + { + return 0; + } + + if (memcached_io_wait_for_write(instance) != MEMCACHED_SUCCESS) + { return 0; + } - if (getsockopt(instance->fd, SOL_SOCKET, - SO_RCVBUF, &sock_size, &sock_length)) + if (getsockopt(instance->fd, SOL_SOCKET, SO_RCVBUF, &sock_size, &sock_length) < 0) + { + ptr->cached_errno= errno; return 0; /* Zero means error */ + } }