X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fconnect.cc;h=90d3facb06728f24edc3ac7effa8004c1684c2ff;hb=2aacfe6223ea5ff3656c900041a0f7ed847c2bf1;hp=5de143be0587acfc6f7e82fc59240f860ed39fc8;hpb=b16fffff43d822239ce79a366ec36873b0803df9;p=awesomized%2Flibmemcached diff --git a/libmemcached/connect.cc b/libmemcached/connect.cc index 5de143be..90d3facb 100644 --- a/libmemcached/connect.cc +++ b/libmemcached/connect.cc @@ -37,9 +37,9 @@ #include -#include +#include +#include #include -#include static memcached_return_t connect_poll(memcached_server_st *ptr) { @@ -145,52 +145,31 @@ static memcached_return_t set_hostinfo(memcached_server_st *server) hints.ai_protocol= IPPROTO_TCP; } - uint32_t counter= 5; - while (--counter) + int errcode; + switch(errcode= getaddrinfo(server->hostname, str_port, &hints, &server->address_info)) { - int errcode; - switch(errcode= getaddrinfo(server->hostname, str_port, &hints, &server->address_info)) - { - case 0: - break; - case EAI_AGAIN: - if (counter > 1) - { -#ifndef WIN32 - struct timespec dream, rem; + case 0: + break; - dream.tv_nsec= 1000; - dream.tv_sec= 0; + case EAI_AGAIN: + return memcached_set_error(*server, MEMCACHED_TIMEOUT, MEMCACHED_AT, memcached_string_make_from_cstr(gai_strerror(errcode))); - nanosleep(&dream, &rem); -#endif - continue; - } - else - { - return memcached_set_error_string(*server, MEMCACHED_HOST_LOOKUP_FAILURE, gai_strerror(errcode), strlen(gai_strerror(errcode))); - } + case EAI_SYSTEM: + return memcached_set_errno(*server, errno, MEMCACHED_AT, memcached_literal_param("getaddrinfo(EAI_SYSTEM)")); - case EAI_SYSTEM: - { - static memcached_string_t mesg= { memcached_string_make("getaddrinfo") }; - return memcached_set_errno(*server, errno, &mesg); - } - case EAI_BADFLAGS: - return memcached_set_error_string(*server, MEMCACHED_HOST_LOOKUP_FAILURE, memcached_literal_param("getaddrinfo(EAI_BADFLAGS)")); + case EAI_BADFLAGS: + return memcached_set_error(*server, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT, memcached_literal_param("getaddrinfo(EAI_BADFLAGS)")); - case EAI_MEMORY: - return memcached_set_error_string(*server, MEMCACHED_ERRNO, memcached_literal_param("getaddrinfo(EAI_MEMORY)")); + case EAI_MEMORY: + return memcached_set_error(*server, MEMCACHED_ERRNO, MEMCACHED_AT, memcached_literal_param("getaddrinfo(EAI_MEMORY)")); - default: - { - WATCHPOINT_STRING(server->hostname); - WATCHPOINT_STRING(gai_strerror(e)); - return memcached_set_error_string(*server, MEMCACHED_HOST_LOOKUP_FAILURE, gai_strerror(errcode), strlen(gai_strerror(errcode))); - } + default: + { + WATCHPOINT_STRING(server->hostname); + WATCHPOINT_STRING(gai_strerror(e)); + return memcached_set_error(*server, MEMCACHED_HOST_LOOKUP_FAILURE, MEMCACHED_AT, memcached_string_make_from_cstr(gai_strerror(errcode))); } } - server->address_info_next= server->address_info; return MEMCACHED_SUCCESS; @@ -377,8 +356,7 @@ static memcached_return_t unix_socket_connect(memcached_server_st *ptr) if ((ptr->fd= socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { - ptr->cached_errno= errno; - return MEMCACHED_CONNECTION_SOCKET_CREATE_FAILURE; + return memcached_set_errno(*ptr, errno, NULL); } struct sockaddr_un servAddr; @@ -407,7 +385,7 @@ test_connect: } } - WATCHPOINT_ASSERT(ptr->fd != -1); + WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET); return MEMCACHED_SUCCESS; #else @@ -423,10 +401,26 @@ static memcached_return_t network_connect(memcached_server_st *ptr) WATCHPOINT_ASSERT(ptr->fd == INVALID_SOCKET); WATCHPOINT_ASSERT(ptr->cursor_active == 0); - if (! ptr->address_info) + if (not ptr->address_info) { - memcached_return_t rc= set_hostinfo(ptr); - if (rc != MEMCACHED_SUCCESS) + memcached_return_t rc; + uint32_t counter= 5; + while (--counter) + { + if ((rc= set_hostinfo(ptr)) != MEMCACHED_TIMEOUT) + break; + +#ifndef WIN32 + struct timespec dream, rem; + + dream.tv_nsec= 1000; + dream.tv_sec= 0; + + nanosleep(&dream, &rem); +#endif + } + + if (memcached_failed(rc)) return rc; } @@ -444,9 +438,7 @@ static memcached_return_t network_connect(memcached_server_st *ptr) ptr->address_info_next->ai_socktype, ptr->address_info_next->ai_protocol)) < 0) { - ptr->cached_errno= get_socket_errno(); - WATCHPOINT_ERRNO(get_socket_errno()); - return MEMCACHED_CONNECTION_SOCKET_CREATE_FAILURE; + return memcached_set_errno(*ptr, get_socket_errno(), NULL); } (void)set_socket_options(ptr); @@ -513,19 +505,18 @@ static memcached_return_t network_connect(memcached_server_st *ptr) return MEMCACHED_SUCCESS; /* The last error should be from connect() */ } -void set_last_disconnected_host(memcached_server_write_instance_st ptr) +void set_last_disconnected_host(memcached_server_write_instance_st self) { // const_cast - memcached_st *root= (memcached_st *)ptr->root; + memcached_st *root= (memcached_st *)self->root; #if 0 - WATCHPOINT_STRING(ptr->hostname); - WATCHPOINT_NUMBER(ptr->port); - WATCHPOINT_ERRNO(ptr->cached_errno); + WATCHPOINT_STRING(self->hostname); + WATCHPOINT_NUMBER(self->port); + WATCHPOINT_ERRNO(self->cached_errno); #endif - if (root->last_disconnected_server) - memcached_server_free(root->last_disconnected_server); - root->last_disconnected_server= memcached_server_clone(NULL, ptr); + memcached_server_free(root->last_disconnected_server); + root->last_disconnected_server= memcached_server_clone(NULL, self); } memcached_return_t memcached_connect(memcached_server_write_instance_st ptr) @@ -578,6 +569,7 @@ memcached_return_t memcached_connect(memcached_server_write_instance_st ptr) WATCHPOINT_ASSERT(0); rc= MEMCACHED_NOT_SUPPORTED; break; + case MEMCACHED_CONNECTION_UDP: case MEMCACHED_CONNECTION_TCP: rc= network_connect(ptr); @@ -585,7 +577,7 @@ memcached_return_t memcached_connect(memcached_server_write_instance_st ptr) if (ptr->fd != INVALID_SOCKET && ptr->root->sasl.callbacks) { rc= memcached_sasl_authenticate_connection(ptr); - if (rc != MEMCACHED_SUCCESS) + if (memcached_failed(rc)) { (void)closesocket(ptr->fd); ptr->fd= INVALID_SOCKET; @@ -593,15 +585,17 @@ memcached_return_t memcached_connect(memcached_server_write_instance_st ptr) } #endif break; + case MEMCACHED_CONNECTION_UNIX_SOCKET: rc= unix_socket_connect(ptr); break; + case MEMCACHED_CONNECTION_MAX: default: WATCHPOINT_ASSERT(0); } - if (rc == MEMCACHED_SUCCESS) + if (memcached_success(rc)) { ptr->server_failure_counter= 0; ptr->next_retry= 0;