diff options
author | Raghavendra G <raghavendra@gluster.com> | 2010-10-08 20:21:59 +0000 |
---|---|---|
committer | Vijay Bellur <vijay@dev.gluster.com> | 2010-10-09 06:36:58 -0700 |
commit | d1f938c16e309431382ab9aaa32d50bf0ccd3260 (patch) | |
tree | 79e56063ab268acb8c2ba84057d3a94280677a84 /rpc/rpc-transport/rdma/src | |
parent | 0ccb63dbc52f66975205baf8452d2b57418da4aa (diff) |
rpc-transport/rdma: fix the bug which was causing an ioq-entry being mem_put twice.
- in case of failure to send message, ioq-entry would be freed, but it used to
get added to the ioq-list. Failure in sending a message (for reasons
other than insufficient quota), would result in transport being
disconnected. In the process of handling pollerr, when ioq-list is flushed,
the same ioq-entry which would've already been freed, would be freed for
second time.
- this patch also fixes spurious disconnects happening when quota was not
available while sending a request.
Signed-off-by: Raghavendra G <raghavendra@gluster.com>
Signed-off-by: Vijay Bellur <vijay@dev.gluster.com>
BUG: 1854 (GlusterFS 3.1 beta crashes over Infiniband with rdma issue)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1854
Diffstat (limited to 'rpc/rpc-transport/rdma/src')
-rw-r--r-- | rpc/rpc-transport/rdma/src/rdma.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/rpc/rpc-transport/rdma/src/rdma.c b/rpc/rpc-transport/rdma/src/rdma.c index 00664963c39..30f77f33128 100644 --- a/rpc/rpc-transport/rdma/src/rdma.c +++ b/rpc/rpc-transport/rdma/src/rdma.c @@ -1682,6 +1682,8 @@ __rdma_ioq_churn_entry (rdma_peer_t *peer, rdma_ioq_t *entry) if (ret != 0) { __rdma_ioq_entry_free (entry); } + } else { + ret = 0; } out: @@ -1740,7 +1742,7 @@ rdma_writev (rpc_transport_t *this, peer = &priv->peer; if (list_empty (&peer->ioq)) { ret = __rdma_ioq_churn_entry (peer, entry); - if (ret > 0) { + if (ret != 0) { need_append = 0; } } |