From: Jean-Charles Redoutey Date: Sat, 10 Oct 2009 13:12:01 +0000 (+0200) Subject: Fixed code to blacklist server as from very first failure, if specified so X-Git-Tag: 0.34~7^2 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=ecc773508676b68051ed8dde6416979f7676b9bc;p=m6w6%2Flibmemcached Fixed code to blacklist server as from very first failure, if specified so --- diff --git a/libmemcached/memcached_connect.c b/libmemcached/memcached_connect.c index 833ad0ef..53ff8cee 100644 --- a/libmemcached/memcached_connect.c +++ b/libmemcached/memcached_connect.c @@ -60,7 +60,7 @@ static memcached_return set_socket_options(memcached_server_st *ptr) waittime.tv_sec= 0; waittime.tv_usec= ptr->root->snd_timeout; - error= setsockopt(ptr->fd, SOL_SOCKET, SO_SNDTIMEO, + error= setsockopt(ptr->fd, SOL_SOCKET, SO_SNDTIMEO, &waittime, (socklen_t)sizeof(struct timeval)); WATCHPOINT_ASSERT(error == 0); } @@ -75,7 +75,7 @@ static memcached_return set_socket_options(memcached_server_st *ptr) waittime.tv_sec= 0; waittime.tv_usec= ptr->root->rcv_timeout; - error= setsockopt(ptr->fd, SOL_SOCKET, SO_RCVTIMEO, + error= setsockopt(ptr->fd, SOL_SOCKET, SO_RCVTIMEO, &waittime, (socklen_t)sizeof(struct timeval)); WATCHPOINT_ASSERT(error == 0); } @@ -86,9 +86,9 @@ static memcached_return set_socket_options(memcached_server_st *ptr) int error; struct linger linger; - linger.l_onoff= 1; - linger.l_linger= 0; /* By default on close() just drop the socket */ - error= setsockopt(ptr->fd, SOL_SOCKET, SO_LINGER, + linger.l_onoff= 1; + linger.l_linger= 0; /* By default on close() just drop the socket */ + error= setsockopt(ptr->fd, SOL_SOCKET, SO_LINGER, &linger, (socklen_t)sizeof(struct linger)); WATCHPOINT_ASSERT(error == 0); } @@ -98,7 +98,7 @@ static memcached_return set_socket_options(memcached_server_st *ptr) int flag= 1; int error; - error= setsockopt(ptr->fd, IPPROTO_TCP, TCP_NODELAY, + error= setsockopt(ptr->fd, IPPROTO_TCP, TCP_NODELAY, &flag, (socklen_t)sizeof(int)); WATCHPOINT_ASSERT(error == 0); } @@ -107,7 +107,7 @@ static memcached_return set_socket_options(memcached_server_st *ptr) { int error; - error= setsockopt(ptr->fd, SOL_SOCKET, SO_SNDBUF, + error= setsockopt(ptr->fd, SOL_SOCKET, SO_SNDBUF, &ptr->root->send_size, (socklen_t)sizeof(int)); WATCHPOINT_ASSERT(error == 0); } @@ -116,7 +116,7 @@ static memcached_return set_socket_options(memcached_server_st *ptr) { int error; - error= setsockopt(ptr->fd, SOL_SOCKET, SO_RCVBUF, + error= setsockopt(ptr->fd, SOL_SOCKET, SO_RCVBUF, &ptr->root->recv_size, (socklen_t)sizeof(int)); WATCHPOINT_ASSERT(error == 0); } @@ -156,7 +156,7 @@ static memcached_return unix_socket_connect(memcached_server_st *ptr) addrlen= (socklen_t) (strlen(servAddr.sun_path) + sizeof(servAddr.sun_family)); test_connect: - if (connect(ptr->fd, + if (connect(ptr->fd, (struct sockaddr *)&servAddr, sizeof(servAddr)) < 0) { @@ -208,8 +208,8 @@ static memcached_return network_connect(memcached_server_st *ptr) continue; } - if ((ptr->fd= socket(use->ai_family, - use->ai_socktype, + if ((ptr->fd= socket(use->ai_family, + use->ai_socktype, use->ai_protocol)) < 0) { ptr->cached_errno= errno; @@ -228,7 +228,7 @@ static memcached_return network_connect(memcached_server_st *ptr) } /* connect to server */ - while (ptr->fd != -1 && + while (ptr->fd != -1 && connect(ptr->fd, use->ai_addr, use->ai_addrlen) < 0) { ptr->cached_errno= errno; @@ -253,23 +253,23 @@ static memcached_return network_connect(memcached_server_st *ptr) (void)close(ptr->fd); ptr->fd= -1; } - } + } else if (errno == EISCONN) /* we are connected :-) */ { break; - } + } else if (errno != EINTR) { (void)close(ptr->fd); ptr->fd= -1; break; - } + } } if (ptr->fd != -1) { - /* restore flags */ - if (ptr->root->connect_timeout && (ptr->root->flags & MEM_NO_BLOCK) == 0) + /* restore flags */ + if (ptr->root->connect_timeout && (ptr->root->flags & MEM_NO_BLOCK) == 0) (void)fcntl(ptr->fd, F_SETFL, flags & ~O_NONBLOCK); WATCHPOINT_ASSERT(ptr->cursor_active == 0); @@ -310,18 +310,18 @@ memcached_return memcached_connect(memcached_server_st *ptr) WATCHPOINT_ASSERT(ptr->root); if (ptr->root->retry_timeout && ptr->root->server_failure_limit) { - struct timeval next_time; + struct timeval curr_time; - gettimeofday(&next_time, NULL); + gettimeofday(&curr_time, NULL); /* if we've had too many consecutive errors on this server, mark it dead. */ - if (ptr->server_failure_counter > ptr->root->server_failure_limit) + if (ptr->server_failure_counter >= ptr->root->server_failure_limit) { - ptr->next_retry= next_time.tv_sec + ptr->root->retry_timeout; + ptr->next_retry= curr_time.tv_sec + ptr->root->retry_timeout; ptr->server_failure_counter= 0; } - if (next_time.tv_sec < ptr->next_retry) + if (curr_time.tv_sec < ptr->next_retry) { if (memcached_behavior_get(ptr->root, MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS)) run_distribution(ptr->root);