X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fserver.hpp;h=320da1152fe0f07aea280dbfda3ad98e3a29c0cc;hb=969fea8e7bed82c109685ec3976cf7b0ec514ae9;hp=05b51f4fcbf098fbdda139b7a2f96a8f4b9c55d5;hpb=0fe409a0db64fc9d24a44ac363c502ea9e98857e;p=m6w6%2Flibmemcached diff --git a/libmemcached/server.hpp b/libmemcached/server.hpp index 05b51f4f..320da115 100644 --- a/libmemcached/server.hpp +++ b/libmemcached/server.hpp @@ -39,11 +39,65 @@ #include +#ifdef HAVE_SYS_TIME_H +#include +#endif + +#include + static inline bool memcached_is_valid_servername(const memcached_string_t& arg) { return arg.size > 0 or arg.size < NI_MAXHOST; } +static inline void memcached_mark_server_as_clean(memcached_server_write_instance_st server) +{ + server->server_failure_counter= 0; + server->next_retry= 0; +} + + +static inline void set_last_disconnected_host(memcached_server_write_instance_st self) +{ + assert(self->root); + if (self->root == NULL) + { + return; + } + + if (self->root->last_disconnected_server and self->root->last_disconnected_server->version == self->version) + { + return; + } + + // const_cast + memcached_st *root= (memcached_st *)self->root; + + memcached_server_free(root->last_disconnected_server); + root->last_disconnected_server= memcached_server_clone(NULL, self); + root->last_disconnected_server->version= self->version; +} + +static inline void memcached_mark_server_for_timeout(memcached_server_write_instance_st server) +{ + if (server->state != MEMCACHED_SERVER_STATE_IN_TIMEOUT) + { + struct timeval next_time; + if (gettimeofday(&next_time, NULL) == 0) + { + server->next_retry= next_time.tv_sec +server->root->retry_timeout; + } + else + { + server->next_retry= 1; // Setting the value to 1 causes the timeout to occur immediatly + } + + server->state= MEMCACHED_SERVER_STATE_IN_TIMEOUT; + server->server_failure_counter++; + set_last_disconnected_host(server); + } +} + LIBMEMCACHED_LOCAL memcached_server_st *__server_create_with(memcached_st *memc, memcached_server_write_instance_st host,