X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=libmemcached%2Fconnect.cc;h=602bc5e9d6c914268918bba4144485dcbc71e295;hb=3b22dd937e1f9216c526bcbf7fa3ba51cb37bbf6;hp=77cfb3bd2e7c4b809537bb45f0bf871a80925f79;hpb=276e5c1e7fefa8f7061270f79443a704231c819e;p=awesomized%2Flibmemcached diff --git a/libmemcached/connect.cc b/libmemcached/connect.cc index 77cfb3bd..602bc5e9 100644 --- a/libmemcached/connect.cc +++ b/libmemcached/connect.cc @@ -37,7 +37,6 @@ #include -#include #include #include @@ -49,18 +48,14 @@ static memcached_return_t connect_poll(memcached_server_st *ptr) size_t loop_max= 5; - while (--loop_max) // Should only loop on cases of ERESTART or EINTR + if (ptr->root->poll_timeout == 0) { - int error; - if (ptr->root->poll_timeout) - { - error= poll(fds, 1, ptr->root->connect_timeout); - } - else - { - error= 0; - } + return memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT); + } + while (--loop_max) // Should only loop on cases of ERESTART or EINTR + { + int error= poll(fds, 1, ptr->root->connect_timeout); switch (error) { case 1: @@ -83,7 +78,6 @@ static memcached_return_t connect_poll(memcached_server_st *ptr) } default: // A real error occurred and we need to completely bail - WATCHPOINT_ERRNO(get_socket_errno()); switch (get_socket_errno()) { #ifdef TARGET_OS_LINUX @@ -105,14 +99,14 @@ static memcached_return_t connect_poll(memcached_server_st *ptr) int err; socklen_t len= sizeof (err); (void)getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len); - ptr->cached_errno= (err == 0) ? get_socket_errno() : err; + memcached_set_errno(*ptr, (err == 0) ? get_socket_errno() : err, MEMCACHED_AT); } else { - ptr->cached_errno= get_socket_errno(); + memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT); } - WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET); + assert_msg(ptr->fd != INVALID_SOCKET, "poll() was passed an invalid file descriptor"); (void)closesocket(ptr->fd); ptr->fd= INVALID_SOCKET; ptr->state= MEMCACHED_SERVER_STATE_NEW; @@ -128,7 +122,6 @@ static memcached_return_t connect_poll(memcached_server_st *ptr) static memcached_return_t set_hostinfo(memcached_server_st *server) { - WATCHPOINT_ASSERT(not server->address_info); // We cover the case where a programming mistake has been made. if (server->address_info) { freeaddrinfo(server->address_info); @@ -138,8 +131,10 @@ static memcached_return_t set_hostinfo(memcached_server_st *server) char str_port[NI_MAXSERV]; int length= snprintf(str_port, NI_MAXSERV, "%u", (uint32_t)server->port); - if (length >= NI_MAXSERV || length < 0) + if (length >= NI_MAXSERV or length < 0) + { return MEMCACHED_FAILURE; + } struct addrinfo hints; memset(&hints, 0, sizeof(struct addrinfo)); @@ -178,8 +173,6 @@ static memcached_return_t set_hostinfo(memcached_server_st *server) default: { - WATCHPOINT_STRING(server->hostname); - WATCHPOINT_STRING(gai_strerror(errcode)); return memcached_set_error(*server, MEMCACHED_HOST_LOOKUP_FAILURE, MEMCACHED_AT, memcached_string_make_from_cstr(gai_strerror(errcode))); } } @@ -228,10 +221,12 @@ static inline void set_socket_nonblocking(memcached_server_st *ptr) static void set_socket_options(memcached_server_st *ptr) { - WATCHPOINT_ASSERT(ptr->fd != -1); + assert_msg(ptr->fd != -1, "invalid socket was passed to set_socket_options()"); if (ptr->type == MEMCACHED_CONNECTION_UDP) + { return; + } #ifdef HAVE_SNDTIMEO if (ptr->root->snd_timeout) @@ -351,7 +346,8 @@ static memcached_return_t unix_socket_connect(memcached_server_st *ptr) if ((ptr->fd= socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { - return memcached_set_errno(*ptr, errno, NULL); + memcached_set_errno(*ptr, errno, NULL); + return MEMCACHED_CONNECTION_FAILURE; } struct sockaddr_un servAddr; @@ -378,7 +374,8 @@ static memcached_return_t unix_socket_connect(memcached_server_st *ptr) default: WATCHPOINT_ERRNO(errno); - return memcached_set_errno(*ptr, errno, MEMCACHED_AT); + memcached_set_errno(*ptr, errno, MEMCACHED_AT); + return MEMCACHED_CONNECTION_FAILURE; } } } while (0); @@ -408,7 +405,9 @@ static memcached_return_t network_connect(memcached_server_st *ptr) while (--counter) { if ((rc= set_hostinfo(ptr)) != MEMCACHED_TIMEOUT) + { break; + } #ifndef WIN32 struct timespec dream, rem; @@ -447,7 +446,7 @@ static memcached_return_t network_connect(memcached_server_st *ptr) if ((connect(ptr->fd, ptr->address_info_next->ai_addr, ptr->address_info_next->ai_addrlen) != SOCKET_ERROR)) { ptr->state= MEMCACHED_SERVER_STATE_CONNECTED; - break; // Success + return MEMCACHED_SUCCESS; } /* An error occurred */ @@ -516,11 +515,20 @@ static memcached_return_t network_connect(memcached_server_st *ptr) struct timeval next_time; if (gettimeofday(&next_time, NULL) == 0) + { ptr->next_retry= next_time.tv_sec + ptr->root->retry_timeout; + } + } + + if (memcached_has_current_error(*ptr)) + { + return memcached_server_error_return(ptr); } - if (timeout_error_occured) + if (timeout_error_occured and ptr->state < MEMCACHED_SERVER_STATE_IN_PROGRESS) + { return memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT); + } return memcached_set_error(*ptr, MEMCACHED_CONNECTION_FAILURE, MEMCACHED_AT); /* The last error should be from connect() */ } @@ -530,11 +538,6 @@ void set_last_disconnected_host(memcached_server_write_instance_st self) // const_cast memcached_st *root= (memcached_st *)self->root; -#if 0 - WATCHPOINT_STRING(self->hostname); - WATCHPOINT_NUMBER(self->port); - WATCHPOINT_ERRNO(self->cached_errno); -#endif memcached_server_free(root->last_disconnected_server); root->last_disconnected_server= memcached_server_clone(NULL, self); } @@ -544,7 +547,9 @@ memcached_return_t memcached_connect(memcached_server_write_instance_st ptr) memcached_return_t rc= MEMCACHED_NO_SERVERS; if (ptr->fd != INVALID_SOCKET) + { return MEMCACHED_SUCCESS; + } LIBMEMCACHED_MEMCACHED_CONNECT_START(); @@ -621,6 +626,11 @@ memcached_return_t memcached_connect(memcached_server_write_instance_st ptr) ptr->server_failure_counter= 0; ptr->next_retry= 0; } + else if (memcached_has_current_error(*ptr)) + { + ptr->server_failure_counter++; + set_last_disconnected_host(ptr); + } else { memcached_set_error(*ptr, rc, MEMCACHED_AT);