diff options
author | Continuous Integration <ci@tangent.org> | 2014-02-02 05:49:39 -0800 |
---|---|---|
committer | Continuous Integration <ci@tangent.org> | 2014-02-02 05:49:39 -0800 |
commit | 5356e466e864b310a0195b72ce232197827bbe4e (patch) | |
tree | afb645b7346c4a0746a1ef5c4aacd9ac6f7e21fe | |
parent | 237efd60e77a7d59839af07e5382c1f941cf4d80 (diff) | |
parent | eeb331250b498d8ba2c57d0646cb2953072a1a07 (diff) | |
download | libmemcached-5356e466e864b310a0195b72ce232197827bbe4e.tar.gz |
Merge lp:~493pocbrcycmdw7yksonho9o2qzz-o18bz-d18ecat4t1b76tkfi3vttrkfngli/libmemcached/libmemcached Build: jenkins-Libmemcached-445
-rw-r--r-- | libmemcached-1.0/server.h | 3 | ||||
-rw-r--r-- | libmemcached/io.cc | 9 | ||||
-rw-r--r-- | libmemcached/server.cc | 18 |
3 files changed, 27 insertions, 3 deletions
diff --git a/libmemcached-1.0/server.h b/libmemcached-1.0/server.h index 856c0e7e..abd0bfb9 100644 --- a/libmemcached-1.0/server.h +++ b/libmemcached-1.0/server.h @@ -104,6 +104,9 @@ LIBMEMCACHED_API in_port_t memcached_server_port(const memcached_instance_st * self); LIBMEMCACHED_API +in_port_t memcached_server_srcport(const memcached_instance_st * self); + +LIBMEMCACHED_API void memcached_instance_next_retry(const memcached_instance_st * self, const time_t absolute_time); LIBMEMCACHED_API diff --git a/libmemcached/io.cc b/libmemcached/io.cc index 8796d503..e9d3ad39 100644 --- a/libmemcached/io.cc +++ b/libmemcached/io.cc @@ -342,6 +342,7 @@ static bool io_flush(memcached_instance_st* instance, } ssize_t sent_length= ::send(instance->fd, local_write_ptr, write_length, flags); + int local_errno= get_socket_errno(); // We cache in case memcached_quit_server() modifies errno if (sent_length == SOCKET_ERROR) { @@ -381,14 +382,14 @@ static bool io_flush(memcached_instance_st* instance, } memcached_quit_server(instance, true); - error= memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT); + error= memcached_set_errno(*instance, local_errno, MEMCACHED_AT); return false; } case ENOTCONN: case EPIPE: default: memcached_quit_server(instance, true); - error= memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT); + error= memcached_set_errno(*instance, local_errno, MEMCACHED_AT); WATCHPOINT_ASSERT(instance->fd == INVALID_SOCKET); return false; } @@ -422,6 +423,8 @@ static memcached_return_t _io_fill(memcached_instance_st* instance) do { data_read= ::recv(instance->fd, instance->read_buffer, MEMCACHED_MAX_BUFFER, MSG_NOSIGNAL); + int local_errno= get_socket_errno(); // We cache in case memcached_quit_server() modifies errno + if (data_read == SOCKET_ERROR) { switch (get_socket_errno()) @@ -460,7 +463,7 @@ static memcached_return_t _io_fill(memcached_instance_st* instance) case ECONNREFUSED: default: memcached_quit_server(instance, true); - memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT); + memcached_set_errno(*instance, local_errno, MEMCACHED_AT); break; } diff --git a/libmemcached/server.cc b/libmemcached/server.cc index b38120ad..c4747ddc 100644 --- a/libmemcached/server.cc +++ b/libmemcached/server.cc @@ -213,6 +213,24 @@ in_port_t memcached_server_port(const memcached_instance_st * self) return self->port(); } +in_port_t memcached_server_srcport(const memcached_instance_st * self) +{ + WATCHPOINT_ASSERT(self); + if (self == NULL || self->fd == INVALID_SOCKET || (self->type != MEMCACHED_CONNECTION_TCP && self->type != MEMCACHED_CONNECTION_UDP)) + { + return 0; + } + + struct sockaddr_in sin; + socklen_t addrlen= sizeof(sin); + if (getsockname(self->fd, (struct sockaddr*)&sin, &addrlen) != -1) + { + return ntohs(sin.sin_port); + } + + return -1; +} + uint32_t memcached_server_response_count(const memcached_instance_st * self) { WATCHPOINT_ASSERT(self); |