]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/async/rdma: change rdma_event_channel to be non blocked
authorChangcheng Liu <changcheng.liu@aliyun.com>
Mon, 26 Aug 2019 08:57:28 +0000 (16:57 +0800)
committerChangcheng Liu <changcheng.liu@aliyun.com>
Mon, 16 Sep 2019 07:25:19 +0000 (15:25 +0800)
rdma_event_channel is blocked by default, if there's no event
in the event channel, rdma_get_cm_event could be blocked forever.
This is not "asynchronous" messenger.

Signed-off-by: Changcheng Liu <changcheng.liu@aliyun.com>
src/msg/async/rdma/RDMAIWARPServerSocketImpl.cc

index 2b8291d35d322d8737dfd3bd9b46a0a5d9fb552e..317e9f2874f3000d56abbb80909927006be567c4 100644 (file)
@@ -37,6 +37,10 @@ int RDMAIWARPServerSocketImpl::listen(entity_addr_t &sa,
     goto err;
   }
   server_setup_socket = cm_channel->fd;
+  rc = net.set_nonblock(server_setup_socket);
+  if (rc < 0) {
+    goto err;
+  }
   ldout(cct, 20) << __func__ << " fd of cm_channel is " << server_setup_socket << dendl;
   return 0;
 
@@ -69,6 +73,13 @@ int RDMAIWARPServerSocketImpl::accept(ConnectedSocket *sock, const SocketOptions
   struct rdma_cm_id *event_cm_id = cm_event->id;
   struct rdma_event_channel *event_channel = rdma_create_event_channel();
 
+  if (net.set_nonblock(event_channel->fd) < 0) {
+      lderr(cct) << __func__ << " failed to switch event channel to non-block, close event channel " << dendl;
+      rdma_destroy_event_channel(event_channel);
+      rdma_ack_cm_event(cm_event);
+      return -errno;
+  }
+
   rdma_migrate_id(event_cm_id, event_channel);
 
   struct rdma_cm_id *new_cm_id = event_cm_id;