X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=libmemcached%2Fconnect.cc;h=fa35d84e5af49cd35edbbd89598fe09c948eb7e5;hb=0ae14bed70947882f5ee9423dfcb20eeda7acdd9;hp=7044306e6908cfe864fedb4835084c170a2900c0;hpb=91e92172731fe8a37e562a165d25a312569aff44;p=m6w6%2Flibmemcached diff --git a/libmemcached/connect.cc b/libmemcached/connect.cc index 7044306e..fa35d84e 100644 --- a/libmemcached/connect.cc +++ b/libmemcached/connect.cc @@ -131,7 +131,7 @@ 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; } @@ -153,6 +153,7 @@ static memcached_return_t set_hostinfo(memcached_server_st *server) hints.ai_protocol= IPPROTO_TCP; } + server->address_info= NULL; int errcode; switch(errcode= getaddrinfo(server->hostname, str_port, &hints, &server->address_info)) { @@ -446,7 +447,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 */ @@ -590,35 +591,27 @@ memcached_return_t memcached_connect(memcached_server_write_instance_st ptr) /* We need to clean up the multi startup piece */ switch (ptr->type) { - case MEMCACHED_CONNECTION_UNKNOWN: - WATCHPOINT_ASSERT(0); - rc= MEMCACHED_NOT_SUPPORTED; - break; - case MEMCACHED_CONNECTION_UDP: case MEMCACHED_CONNECTION_TCP: rc= network_connect(ptr); -#ifdef LIBMEMCACHED_WITH_SASL_SUPPORT - if (ptr->fd != INVALID_SOCKET and ptr->root->sasl.callbacks) + if (LIBMEMCACHED_WITH_SASL_SUPPORT) { - rc= memcached_sasl_authenticate_connection(ptr); - if (memcached_failed(rc) and ptr->fd != INVALID_SOCKET) + if (ptr->fd != INVALID_SOCKET and ptr->root->sasl.callbacks) { - WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET); - (void)closesocket(ptr->fd); - ptr->fd= INVALID_SOCKET; + rc= memcached_sasl_authenticate_connection(ptr); + if (memcached_failed(rc) and ptr->fd != INVALID_SOCKET) + { + WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET); + (void)closesocket(ptr->fd); + ptr->fd= INVALID_SOCKET; + } } } -#endif break; case MEMCACHED_CONNECTION_UNIX_SOCKET: rc= unix_socket_connect(ptr); break; - - case MEMCACHED_CONNECTION_MAX: - default: - WATCHPOINT_ASSERT(0); } if (memcached_success(rc)) @@ -626,6 +619,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);