From 1dbcd90cb519fadbd3351e40434afc0f30438627 Mon Sep 17 00:00:00 2001 From: Zhou Zhengping Date: Sat, 6 May 2017 07:39:27 +0800 Subject: [PATCH] msg/async/net_handler: errno should be stored before next calling Signed-off-by: Zhou Zhengping --- src/msg/async/net_handler.cc | 47 +++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/msg/async/net_handler.cc b/src/msg/async/net_handler.cc index 233c8b19021c..19adb2c83f20 100644 --- a/src/msg/async/net_handler.cc +++ b/src/msg/async/net_handler.cc @@ -34,10 +34,12 @@ namespace ceph{ int NetHandler::create_socket(int domain, bool reuse_addr) { int s; + int r = 0; if ((s = ::socket(domain, SOCK_STREAM, 0)) == -1) { - lderr(cct) << __func__ << " couldn't create socket " << cpp_strerror(errno) << dendl; - return -errno; + r = errno; + lderr(cct) << __func__ << " couldn't create socket " << cpp_strerror(r) << dendl; + return -r; } #if !defined(__FreeBSD__) @@ -46,10 +48,11 @@ int NetHandler::create_socket(int domain, bool reuse_addr) if (reuse_addr) { int on = 1; if (::setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) { + r = errno; lderr(cct) << __func__ << " setsockopt SO_REUSEADDR failed: " - << strerror(errno) << dendl; + << strerror(r) << dendl; close(s); - return -errno; + return -r; } } #endif @@ -60,17 +63,20 @@ int NetHandler::create_socket(int domain, bool reuse_addr) int NetHandler::set_nonblock(int sd) { int flags; + int r = 0; /* Set the socket nonblocking. * Note that fcntl(2) for F_GETFL and F_SETFL can't be * interrupted by a signal. */ if ((flags = fcntl(sd, F_GETFL)) < 0 ) { - lderr(cct) << __func__ << " fcntl(F_GETFL) failed: " << strerror(errno) << dendl; - return -errno; + r = errno; + lderr(cct) << __func__ << " fcntl(F_GETFL) failed: " << cpp_strerror(r) << dendl; + return -r; } if (fcntl(sd, F_SETFL, flags | O_NONBLOCK) < 0) { - lderr(cct) << __func__ << " fcntl(F_SETFL,O_NONBLOCK): " << strerror(errno) << dendl; - return -errno; + r = errno; + lderr(cct) << __func__ << " fcntl(F_SETFL,O_NONBLOCK): " << cpp_strerror(r) << dendl; + return -r; } return 0; @@ -100,14 +106,14 @@ int NetHandler::set_socket_options(int sd, bool nodelay, int size) int flag = 1; r = ::setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(flag)); if (r < 0) { - r = -errno; + r = errno; ldout(cct, 0) << "couldn't set TCP_NODELAY: " << cpp_strerror(r) << dendl; } } if (size) { r = ::setsockopt(sd, SOL_SOCKET, SO_RCVBUF, (void*)&size, sizeof(size)); if (r < 0) { - r = -errno; + r = errno; ldout(cct, 0) << "couldn't set SO_RCVBUF to " << size << ": " << cpp_strerror(r) << dendl; } } @@ -117,11 +123,11 @@ int NetHandler::set_socket_options(int sd, bool nodelay, int size) int val = 1; r = ::setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void*)&val, sizeof(val)); if (r) { - r = -errno; + r = errno; ldout(cct,0) << "couldn't set SO_NOSIGPIPE: " << cpp_strerror(r) << dendl; } #endif - return r; + return -r; } void NetHandler::set_priority(int sd, int prio, int domain) @@ -189,22 +195,23 @@ int NetHandler::generic_connect(const entity_addr_t& addr, const entity_addr_t & addr.set_port(0); ret = ::bind(s, addr.get_sockaddr(), addr.get_sockaddr_len()); if (ret < 0) { - ret = -errno; + ret = errno; ldout(cct, 2) << __func__ << " client bind error " << ", " << cpp_strerror(ret) << dendl; close(s); - return ret; + return -ret; } } } ret = ::connect(s, addr.get_sockaddr(), addr.get_sockaddr_len()); if (ret < 0) { + ret = errno; if (errno == EINPROGRESS && nonblock) return s; - ldout(cct, 10) << __func__ << " connect: " << strerror(errno) << dendl; + ldout(cct, 10) << __func__ << " connect: " << cpp_strerror(ret) << dendl; close(s); - return -errno; + return -ret; } return s; @@ -212,13 +219,15 @@ int NetHandler::generic_connect(const entity_addr_t& addr, const entity_addr_t & int NetHandler::reconnect(const entity_addr_t &addr, int sd) { + int r = 0; int ret = ::connect(sd, addr.get_sockaddr(), addr.get_sockaddr_len()); if (ret < 0 && errno != EISCONN) { - ldout(cct, 10) << __func__ << " reconnect: " << strerror(errno) << dendl; - if (errno == EINPROGRESS || errno == EALREADY) + r = errno; + ldout(cct, 10) << __func__ << " reconnect: " << strerror(r) << dendl; + if (r == EINPROGRESS || r == EALREADY) return 1; - return -errno; + return -r; } return 0; -- 2.47.3