]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
msg/async/net_handler: errno should be stored before next calling
authorZhou Zhengping <johnzzpcrystal@gmail.com>
Fri, 5 May 2017 23:39:27 +0000 (07:39 +0800)
committerZhou Zhengping <johnzzpcrystal@gmail.com>
Sat, 6 May 2017 00:51:43 +0000 (08:51 +0800)
Signed-off-by: Zhou Zhengping <johnzzpcrystal@gmail.com>
src/msg/async/net_handler.cc

index 233c8b19021c312303c440f0f75d347a62e91b2a..19adb2c83f2065ec5d0e19edaae7410756f99606 100644 (file)
@@ -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;