projects
/
m6w6
/
libmemcached
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
Add the LDFLAGS for -lm(floorf)
[m6w6/libmemcached]
/
libmemcached
/
memcached_connect.c
diff --git
a/libmemcached/memcached_connect.c
b/libmemcached/memcached_connect.c
index 7d6f85a49840c99ed2c8be8114e38a5b030d0200..f2549dc75157877fb23a8e79244a7e2b465298e4 100644
(file)
--- a/
libmemcached/memcached_connect.c
+++ b/
libmemcached/memcached_connect.c
@@
-45,30
+45,43
@@
static memcached_return set_socket_options(memcached_server_st *ptr)
if (ptr->type == MEMCACHED_CONNECTION_UDP)
return MEMCACHED_SUCCESS;
if (ptr->type == MEMCACHED_CONNECTION_UDP)
return MEMCACHED_SUCCESS;
- if (ptr->root->
flags & MEM_NO_BLOCK
)
+ if (ptr->root->
snd_timeout
)
{
int error;
{
int error;
- struct linger linger;
struct timeval waittime;
struct timeval waittime;
- waittime.tv_sec= 10;
- waittime.tv_usec= 0;
-
- linger.l_onoff= 1;
- linger.l_linger= MEMCACHED_DEFAULT_TIMEOUT;
- error= setsockopt(ptr->fd, SOL_SOCKET, SO_LINGER,
- &linger, (socklen_t)sizeof(struct linger));
- WATCHPOINT_ASSERT(error == 0);
+ waittime.tv_sec= 0;
+ waittime.tv_usec= ptr->root->snd_timeout;
error= setsockopt(ptr->fd, SOL_SOCKET, SO_SNDTIMEO,
&waittime, (socklen_t)sizeof(struct timeval));
WATCHPOINT_ASSERT(error == 0);
error= setsockopt(ptr->fd, SOL_SOCKET, SO_SNDTIMEO,
&waittime, (socklen_t)sizeof(struct timeval));
WATCHPOINT_ASSERT(error == 0);
+ }
+
+ if (ptr->root->rcv_timeout)
+ {
+ int error;
+ struct timeval waittime;
+
+ waittime.tv_sec= 0;
+ waittime.tv_usec= ptr->root->rcv_timeout;
error= setsockopt(ptr->fd, SOL_SOCKET, SO_RCVTIMEO,
&waittime, (socklen_t)sizeof(struct timeval));
WATCHPOINT_ASSERT(error == 0);
}
error= setsockopt(ptr->fd, SOL_SOCKET, SO_RCVTIMEO,
&waittime, (socklen_t)sizeof(struct timeval));
WATCHPOINT_ASSERT(error == 0);
}
+ {
+ int error;
+ struct linger linger;
+
+ linger.l_onoff= 1;
+ linger.l_linger= MEMCACHED_DEFAULT_TIMEOUT;
+ error= setsockopt(ptr->fd, SOL_SOCKET, SO_LINGER,
+ &linger, (socklen_t)sizeof(struct linger));
+ WATCHPOINT_ASSERT(error == 0);
+ }
+
if (ptr->root->flags & MEM_TCP_NODELAY)
{
int flag= 1;
if (ptr->root->flags & MEM_TCP_NODELAY)
{
int flag= 1;
@@
-159,6
+172,11
@@
static memcached_return network_connect(memcached_server_st *ptr)
{
struct addrinfo *use;
{
struct addrinfo *use;
+ if(ptr->root->server_failure_limit != 0) {
+ if(ptr->server_failure_counter >= ptr->root->server_failure_limit) {
+ server_remove(ptr);
+ }
+ }
/* Old connection junk still is in the structure */
WATCHPOINT_ASSERT(ptr->cursor_active == 0);
/* Old connection junk still is in the structure */
WATCHPOINT_ASSERT(ptr->cursor_active == 0);
@@
-211,7
+229,7
@@
test_connect:
{
goto handle_retry;
}
{
goto handle_retry;
}
- else if (error != 1)
+ else if (error != 1
|| fds[0].revents & POLLERR
)
{
ptr->cached_errno= errno;
WATCHPOINT_ERRNO(ptr->cached_errno);
{
ptr->cached_errno= errno;
WATCHPOINT_ERRNO(ptr->cached_errno);
@@
-224,6
+242,14
@@
test_connect:
ptr->address_info= NULL;
}
ptr->address_info= NULL;
}
+ if (ptr->root->retry_timeout)
+ {
+ struct timeval next_time;
+
+ gettimeofday(&next_time, NULL);
+ ptr->next_retry= next_time.tv_sec + ptr->root->retry_timeout;
+ }
+ ptr->server_failure_counter+= 1;
return MEMCACHED_ERRNO;
}
return MEMCACHED_ERRNO;
}
@@
-251,15
+277,19
@@
handle_retry:
else
{
WATCHPOINT_ASSERT(ptr->cursor_active == 0);
else
{
WATCHPOINT_ASSERT(ptr->cursor_active == 0);
+ ptr->server_failure_counter= 0;
return MEMCACHED_SUCCESS;
}
use = use->ai_next;
}
}
return MEMCACHED_SUCCESS;
}
use = use->ai_next;
}
}
- if (ptr->fd == -1)
+ if (ptr->fd == -1) {
+ ptr->server_failure_counter+= 1;
return MEMCACHED_ERRNO; /* The last error should be from connect() */
return MEMCACHED_ERRNO; /* The last error should be from connect() */
+ }
+ ptr->server_failure_counter= 0;
return MEMCACHED_SUCCESS; /* The last error should be from connect() */
}
return MEMCACHED_SUCCESS; /* The last error should be from connect() */
}