|
|
3604df |
From de20f58e8ad6baeef2296544822816cfe9eabb4e Mon Sep 17 00:00:00 2001
|
|
|
3604df |
From: Rajesh Joseph <rjoseph@redhat.com>
|
|
|
3604df |
Date: Tue, 13 Dec 2016 15:28:42 +0530
|
|
|
3604df |
Subject: [PATCH 249/257] socket: socket disconnect should wait for poller
|
|
|
3604df |
thread exit
|
|
|
3604df |
|
|
|
3604df |
When SSL is enabled or if "transport.socket.own-thread" option is set
|
|
|
3604df |
then socket_poller is run as different thread. Currently during
|
|
|
3604df |
disconnect or PARENT_DOWN scenario we don't wait for this thread
|
|
|
3604df |
to terminate. PARENT_DOWN will disconnect the socket layer and
|
|
|
3604df |
cleanup resources used by socket_poller.
|
|
|
3604df |
|
|
|
3604df |
Therefore before disconnect we should wait for poller thread to exit.
|
|
|
3604df |
|
|
|
3604df |
>Reviewed-on: http://review.gluster.org/16141
|
|
|
3604df |
>Smoke: Gluster Build System <jenkins@build.gluster.org>
|
|
|
3604df |
>NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
|
|
|
3604df |
>CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
|
|
|
3604df |
>Reviewed-by: Kaushal M <kaushal@redhat.com>
|
|
|
3604df |
>Reviewed-by: Raghavendra Talur <rtalur@redhat.com>
|
|
|
3604df |
>Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
|
|
|
3604df |
|
|
|
3604df |
Change-Id: I71f984b47d260ffd979102f180a99a0bed29f0d6
|
|
|
3604df |
BUG: 1398798
|
|
|
3604df |
Signed-off-by: Rajesh Joseph <rjoseph@redhat.com>
|
|
|
3604df |
Reviewed-on: https://code.engineering.redhat.com/gerrit/93555
|
|
|
3604df |
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
|
|
3604df |
Tested-by: Atin Mukherjee <amukherj@redhat.com>
|
|
|
3604df |
---
|
|
|
3604df |
rpc/rpc-lib/src/rpc-clnt-ping.c | 2 +-
|
|
|
3604df |
rpc/rpc-lib/src/rpc-clnt.c | 4 +-
|
|
|
3604df |
rpc/rpc-lib/src/rpc-transport.c | 5 +-
|
|
|
3604df |
rpc/rpc-lib/src/rpc-transport.h | 4 +-
|
|
|
3604df |
rpc/rpc-lib/src/rpcsvc.c | 2 +-
|
|
|
3604df |
rpc/rpc-transport/rdma/src/rdma.c | 19 ++---
|
|
|
3604df |
rpc/rpc-transport/socket/src/socket.c | 98 +++++++++++++++++++++-----
|
|
|
3604df |
rpc/rpc-transport/socket/src/socket.h | 6 ++
|
|
|
3604df |
xlators/mgmt/glusterd/src/glusterd-handshake.c | 7 +-
|
|
|
3604df |
xlators/mgmt/glusterd/src/glusterd-utils.c | 3 +-
|
|
|
3604df |
xlators/protocol/client/src/client-handshake.c | 4 +-
|
|
|
3604df |
xlators/protocol/server/src/server.c | 3 +-
|
|
|
3604df |
12 files changed, 116 insertions(+), 41 deletions(-)
|
|
|
3604df |
|
|
|
3604df |
diff --git a/rpc/rpc-lib/src/rpc-clnt-ping.c b/rpc/rpc-lib/src/rpc-clnt-ping.c
|
|
|
3604df |
index a7ff866..14a1d7c 100644
|
|
|
3604df |
--- a/rpc/rpc-lib/src/rpc-clnt-ping.c
|
|
|
3604df |
+++ b/rpc/rpc-lib/src/rpc-clnt-ping.c
|
|
|
3604df |
@@ -159,7 +159,7 @@ rpc_clnt_ping_timer_expired (void *rpc_ptr)
|
|
|
3604df |
trans->peerinfo.identifier,
|
|
|
3604df |
conn->ping_timeout);
|
|
|
3604df |
|
|
|
3604df |
- rpc_transport_disconnect (conn->trans);
|
|
|
3604df |
+ rpc_transport_disconnect (conn->trans, _gf_false);
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
out:
|
|
|
3604df |
diff --git a/rpc/rpc-lib/src/rpc-clnt.c b/rpc/rpc-lib/src/rpc-clnt.c
|
|
|
3604df |
index fe099f9..f24c934 100644
|
|
|
3604df |
--- a/rpc/rpc-lib/src/rpc-clnt.c
|
|
|
3604df |
+++ b/rpc/rpc-lib/src/rpc-clnt.c
|
|
|
3604df |
@@ -1855,7 +1855,7 @@ rpc_clnt_disable (struct rpc_clnt *rpc)
|
|
|
3604df |
pthread_mutex_unlock (&conn->lock);
|
|
|
3604df |
|
|
|
3604df |
if (trans) {
|
|
|
3604df |
- rpc_transport_disconnect (trans);
|
|
|
3604df |
+ rpc_transport_disconnect (trans, _gf_true);
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
if (unref)
|
|
|
3604df |
@@ -1914,7 +1914,7 @@ rpc_clnt_disconnect (struct rpc_clnt *rpc)
|
|
|
3604df |
pthread_mutex_unlock (&conn->lock);
|
|
|
3604df |
|
|
|
3604df |
if (trans) {
|
|
|
3604df |
- rpc_transport_disconnect (trans);
|
|
|
3604df |
+ rpc_transport_disconnect (trans, _gf_true);
|
|
|
3604df |
}
|
|
|
3604df |
if (unref)
|
|
|
3604df |
rpc_clnt_unref (rpc);
|
|
|
3604df |
diff --git a/rpc/rpc-lib/src/rpc-transport.c b/rpc/rpc-lib/src/rpc-transport.c
|
|
|
3604df |
index f3ebe2d..e62d94b 100644
|
|
|
3604df |
--- a/rpc/rpc-lib/src/rpc-transport.c
|
|
|
3604df |
+++ b/rpc/rpc-lib/src/rpc-transport.c
|
|
|
3604df |
@@ -435,13 +435,14 @@ fail:
|
|
|
3604df |
|
|
|
3604df |
|
|
|
3604df |
int32_t
|
|
|
3604df |
-rpc_transport_disconnect (rpc_transport_t *this)
|
|
|
3604df |
+rpc_transport_disconnect (rpc_transport_t *this, gf_boolean_t wait)
|
|
|
3604df |
{
|
|
|
3604df |
int32_t ret = -1;
|
|
|
3604df |
|
|
|
3604df |
GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);
|
|
|
3604df |
|
|
|
3604df |
- ret = this->ops->disconnect (this);
|
|
|
3604df |
+ ret = this->ops->disconnect (this, wait);
|
|
|
3604df |
+
|
|
|
3604df |
fail:
|
|
|
3604df |
return ret;
|
|
|
3604df |
}
|
|
|
3604df |
diff --git a/rpc/rpc-lib/src/rpc-transport.h b/rpc/rpc-lib/src/rpc-transport.h
|
|
|
3604df |
index 1d4b444..630729d 100644
|
|
|
3604df |
--- a/rpc/rpc-lib/src/rpc-transport.h
|
|
|
3604df |
+++ b/rpc/rpc-lib/src/rpc-transport.h
|
|
|
3604df |
@@ -223,7 +223,7 @@ struct rpc_transport_ops {
|
|
|
3604df |
rpc_transport_reply_t *reply);
|
|
|
3604df |
int32_t (*connect) (rpc_transport_t *this, int port);
|
|
|
3604df |
int32_t (*listen) (rpc_transport_t *this);
|
|
|
3604df |
- int32_t (*disconnect) (rpc_transport_t *this);
|
|
|
3604df |
+ int32_t (*disconnect) (rpc_transport_t *this, gf_boolean_t wait);
|
|
|
3604df |
int32_t (*get_peername) (rpc_transport_t *this, char *hostname,
|
|
|
3604df |
int hostlen);
|
|
|
3604df |
int32_t (*get_peeraddr) (rpc_transport_t *this, char *peeraddr,
|
|
|
3604df |
@@ -247,7 +247,7 @@ int32_t
|
|
|
3604df |
rpc_transport_connect (rpc_transport_t *this, int port);
|
|
|
3604df |
|
|
|
3604df |
int32_t
|
|
|
3604df |
-rpc_transport_disconnect (rpc_transport_t *this);
|
|
|
3604df |
+rpc_transport_disconnect (rpc_transport_t *this, gf_boolean_t wait);
|
|
|
3604df |
|
|
|
3604df |
int32_t
|
|
|
3604df |
rpc_transport_destroy (rpc_transport_t *this);
|
|
|
3604df |
diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c
|
|
|
3604df |
index 2a2ca64..2d2a7ff 100644
|
|
|
3604df |
--- a/rpc/rpc-lib/src/rpcsvc.c
|
|
|
3604df |
+++ b/rpc/rpc-lib/src/rpcsvc.c
|
|
|
3604df |
@@ -1639,7 +1639,7 @@ rpcsvc_create_listener (rpcsvc_t *svc, dict_t *options, char *name)
|
|
|
3604df |
ret = 0;
|
|
|
3604df |
out:
|
|
|
3604df |
if (!listener && trans) {
|
|
|
3604df |
- rpc_transport_disconnect (trans);
|
|
|
3604df |
+ rpc_transport_disconnect (trans, _gf_true);
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
return ret;
|
|
|
3604df |
diff --git a/rpc/rpc-transport/rdma/src/rdma.c b/rpc/rpc-transport/rdma/src/rdma.c
|
|
|
3604df |
index 551ac07..d2f04bd 100644
|
|
|
3604df |
--- a/rpc/rpc-transport/rdma/src/rdma.c
|
|
|
3604df |
+++ b/rpc/rpc-transport/rdma/src/rdma.c
|
|
|
3604df |
@@ -51,7 +51,7 @@ static int32_t
|
|
|
3604df |
gf_rdma_teardown (rpc_transport_t *this);
|
|
|
3604df |
|
|
|
3604df |
static int32_t
|
|
|
3604df |
-gf_rdma_disconnect (rpc_transport_t *this);
|
|
|
3604df |
+gf_rdma_disconnect (rpc_transport_t *this, gf_boolean_t wait);
|
|
|
3604df |
|
|
|
3604df |
static void
|
|
|
3604df |
gf_rdma_cm_handle_disconnect (rpc_transport_t *this);
|
|
|
3604df |
@@ -1209,7 +1209,7 @@ gf_rdma_cm_handle_connect_init (struct rdma_cm_event *event)
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
if (ret < 0) {
|
|
|
3604df |
- gf_rdma_disconnect (this);
|
|
|
3604df |
+ gf_rdma_disconnect (this, _gf_false);
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
return ret;
|
|
|
3604df |
@@ -3014,7 +3014,7 @@ gf_rdma_submit_request (rpc_transport_t *this, rpc_transport_req_t *req)
|
|
|
3604df |
RDMA_MSG_WRITE_PEER_FAILED,
|
|
|
3604df |
"sending request to peer (%s) failed",
|
|
|
3604df |
this->peerinfo.identifier);
|
|
|
3604df |
- rpc_transport_disconnect (this);
|
|
|
3604df |
+ rpc_transport_disconnect (this, _gf_false);
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
out:
|
|
|
3604df |
@@ -3051,7 +3051,7 @@ gf_rdma_submit_reply (rpc_transport_t *this, rpc_transport_reply_t *reply)
|
|
|
3604df |
RDMA_MSG_WRITE_PEER_FAILED,
|
|
|
3604df |
"sending request to peer (%s) failed",
|
|
|
3604df |
this->peerinfo.identifier);
|
|
|
3604df |
- rpc_transport_disconnect (this);
|
|
|
3604df |
+ rpc_transport_disconnect (this, _gf_false);
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
out:
|
|
|
3604df |
@@ -4095,7 +4095,7 @@ gf_rdma_process_recv (gf_rdma_peer_t *peer, struct ibv_wc *wc)
|
|
|
3604df |
|
|
|
3604df |
out:
|
|
|
3604df |
if (ret == -1) {
|
|
|
3604df |
- rpc_transport_disconnect (peer->trans);
|
|
|
3604df |
+ rpc_transport_disconnect (peer->trans, _gf_false);
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
return;
|
|
|
3604df |
@@ -4216,7 +4216,8 @@ gf_rdma_recv_completion_proc (void *data)
|
|
|
3604df |
if (peer) {
|
|
|
3604df |
ibv_ack_cq_events (event_cq, num_wr);
|
|
|
3604df |
rpc_transport_unref (peer->trans);
|
|
|
3604df |
- rpc_transport_disconnect (peer->trans);
|
|
|
3604df |
+ rpc_transport_disconnect (peer->trans,
|
|
|
3604df |
+ _gf_false);
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
if (post) {
|
|
|
3604df |
@@ -4292,7 +4293,7 @@ gf_rdma_handle_failed_send_completion (gf_rdma_peer_t *peer, struct ibv_wc *wc)
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
if (peer) {
|
|
|
3604df |
- rpc_transport_disconnect (peer->trans);
|
|
|
3604df |
+ rpc_transport_disconnect (peer->trans, _gf_false);
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
return;
|
|
|
3604df |
@@ -4343,7 +4344,7 @@ gf_rdma_handle_successful_send_completion (gf_rdma_peer_t *peer,
|
|
|
3604df |
|
|
|
3604df |
ret = gf_rdma_pollin_notify (peer, post);
|
|
|
3604df |
if ((ret == -1) && (peer != NULL)) {
|
|
|
3604df |
- rpc_transport_disconnect (peer->trans);
|
|
|
3604df |
+ rpc_transport_disconnect (peer->trans, _gf_false);
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
out:
|
|
|
3604df |
@@ -4657,7 +4658,7 @@ gf_rdma_init (rpc_transport_t *this)
|
|
|
3604df |
|
|
|
3604df |
|
|
|
3604df |
static int32_t
|
|
|
3604df |
-gf_rdma_disconnect (rpc_transport_t *this)
|
|
|
3604df |
+gf_rdma_disconnect (rpc_transport_t *this, gf_boolean_t wait)
|
|
|
3604df |
{
|
|
|
3604df |
gf_rdma_private_t *priv = NULL;
|
|
|
3604df |
int32_t ret = 0;
|
|
|
3604df |
diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c
|
|
|
3604df |
index ae551dc..da2f97f 100644
|
|
|
3604df |
--- a/rpc/rpc-transport/socket/src/socket.c
|
|
|
3604df |
+++ b/rpc/rpc-transport/socket/src/socket.c
|
|
|
3604df |
@@ -2346,7 +2346,7 @@ out:
|
|
|
3604df |
return ret;
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
-static int socket_disconnect (rpc_transport_t *this);
|
|
|
3604df |
+static int socket_disconnect (rpc_transport_t *this, gf_boolean_t wait);
|
|
|
3604df |
|
|
|
3604df |
/* reads rpc_requests during pollin */
|
|
|
3604df |
static int
|
|
|
3604df |
@@ -2377,7 +2377,7 @@ socket_event_handler (int fd, int idx, void *data,
|
|
|
3604df |
EINPROGRESS or ENOENT, so nothing more to do, fail
|
|
|
3604df |
reading/writing anything even if poll_in or poll_out
|
|
|
3604df |
is set */
|
|
|
3604df |
- ret = socket_disconnect (this);
|
|
|
3604df |
+ ret = socket_disconnect (this, _gf_false);
|
|
|
3604df |
|
|
|
3604df |
/* Force ret to be -1, as we are officially done with
|
|
|
3604df |
this socket */
|
|
|
3604df |
@@ -2426,6 +2426,13 @@ socket_poller (void *ctx)
|
|
|
3604df |
* conditionally
|
|
|
3604df |
*/
|
|
|
3604df |
THIS = this->xl;
|
|
|
3604df |
+ GF_REF_GET (priv);
|
|
|
3604df |
+
|
|
|
3604df |
+ if (priv->ot_state == OT_PLEASE_DIE) {
|
|
|
3604df |
+ gf_log (this->name, GF_LOG_DEBUG, "socket_poller is exiting "
|
|
|
3604df |
+ "because socket state is OT_PLEASE_DIE");
|
|
|
3604df |
+ goto err;
|
|
|
3604df |
+ }
|
|
|
3604df |
|
|
|
3604df |
priv->ot_state = OT_RUNNING;
|
|
|
3604df |
|
|
|
3604df |
@@ -2496,6 +2503,13 @@ socket_poller (void *ctx)
|
|
|
3604df |
break;
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
+ if (priv->ot_state == OT_PLEASE_DIE) {
|
|
|
3604df |
+ gf_log (this->name, GF_LOG_DEBUG,
|
|
|
3604df |
+ "OT_PLEASE_DIE on %p (exiting socket_poller)",
|
|
|
3604df |
+ this);
|
|
|
3604df |
+ break;
|
|
|
3604df |
+ }
|
|
|
3604df |
+
|
|
|
3604df |
if (pfd[1].revents & POLL_MASK_INPUT) {
|
|
|
3604df |
ret = socket_event_poll_in(this);
|
|
|
3604df |
if (ret >= 0) {
|
|
|
3604df |
@@ -2509,7 +2523,6 @@ socket_poller (void *ctx)
|
|
|
3604df |
gf_log (this->name, GF_LOG_TRACE,
|
|
|
3604df |
"OT_IDLE on %p (input request)",
|
|
|
3604df |
this);
|
|
|
3604df |
- priv->ot_state = OT_IDLE;
|
|
|
3604df |
break;
|
|
|
3604df |
}
|
|
|
3604df |
}
|
|
|
3604df |
@@ -2526,7 +2539,6 @@ socket_poller (void *ctx)
|
|
|
3604df |
gf_log (this->name, GF_LOG_TRACE,
|
|
|
3604df |
"OT_IDLE on %p (output request)",
|
|
|
3604df |
this);
|
|
|
3604df |
- priv->ot_state = OT_IDLE;
|
|
|
3604df |
break;
|
|
|
3604df |
}
|
|
|
3604df |
}
|
|
|
3604df |
@@ -2563,22 +2575,24 @@ socket_poller (void *ctx)
|
|
|
3604df |
err:
|
|
|
3604df |
/* All (and only) I/O errors should come here. */
|
|
|
3604df |
pthread_mutex_lock(&priv->lock);
|
|
|
3604df |
+ {
|
|
|
3604df |
+ __socket_teardown_connection (this);
|
|
|
3604df |
+ sys_close (priv->sock);
|
|
|
3604df |
+ priv->sock = -1;
|
|
|
3604df |
|
|
|
3604df |
- __socket_teardown_connection (this);
|
|
|
3604df |
- sys_close (priv->sock);
|
|
|
3604df |
- priv->sock = -1;
|
|
|
3604df |
-
|
|
|
3604df |
- sys_close (priv->pipe[0]);
|
|
|
3604df |
- sys_close (priv->pipe[1]);
|
|
|
3604df |
- priv->pipe[0] = -1;
|
|
|
3604df |
- priv->pipe[1] = -1;
|
|
|
3604df |
-
|
|
|
3604df |
- priv->ot_state = OT_IDLE;
|
|
|
3604df |
+ sys_close (priv->pipe[0]);
|
|
|
3604df |
+ sys_close (priv->pipe[1]);
|
|
|
3604df |
+ priv->pipe[0] = -1;
|
|
|
3604df |
+ priv->pipe[1] = -1;
|
|
|
3604df |
|
|
|
3604df |
+ priv->ot_state = OT_IDLE;
|
|
|
3604df |
+ }
|
|
|
3604df |
pthread_mutex_unlock(&priv->lock);
|
|
|
3604df |
|
|
|
3604df |
rpc_transport_notify (this, RPC_TRANSPORT_DISCONNECT, this);
|
|
|
3604df |
|
|
|
3604df |
+ GF_REF_PUT (priv);
|
|
|
3604df |
+
|
|
|
3604df |
rpc_transport_unref (this);
|
|
|
3604df |
|
|
|
3604df |
return NULL;
|
|
|
3604df |
@@ -2850,16 +2864,39 @@ out:
|
|
|
3604df |
|
|
|
3604df |
|
|
|
3604df |
static int
|
|
|
3604df |
-socket_disconnect (rpc_transport_t *this)
|
|
|
3604df |
+socket_disconnect (rpc_transport_t *this, gf_boolean_t wait)
|
|
|
3604df |
{
|
|
|
3604df |
- socket_private_t *priv = NULL;
|
|
|
3604df |
- int ret = -1;
|
|
|
3604df |
+ socket_private_t *priv = NULL;
|
|
|
3604df |
+ int ret = -1;
|
|
|
3604df |
+ char a_byte = 'r';
|
|
|
3604df |
|
|
|
3604df |
GF_VALIDATE_OR_GOTO ("socket", this, out);
|
|
|
3604df |
GF_VALIDATE_OR_GOTO ("socket", this->private, out);
|
|
|
3604df |
|
|
|
3604df |
priv = this->private;
|
|
|
3604df |
|
|
|
3604df |
+ if (wait && priv->own_thread) {
|
|
|
3604df |
+ pthread_mutex_lock (&priv->cond_lock);
|
|
|
3604df |
+ {
|
|
|
3604df |
+ GF_REF_PUT (priv);
|
|
|
3604df |
+ /* Change the state to OT_PLEASE_DIE so that
|
|
|
3604df |
+ * socket_poller can exit. */
|
|
|
3604df |
+ priv->ot_state = OT_PLEASE_DIE;
|
|
|
3604df |
+ /* Write something into the pipe so that poller
|
|
|
3604df |
+ * thread can wake up.*/
|
|
|
3604df |
+ if (sys_write (priv->pipe[1], &a_byte, 1) < 1) {
|
|
|
3604df |
+ gf_log (this->name, GF_LOG_WARNING,
|
|
|
3604df |
+ "write error on pipe");
|
|
|
3604df |
+ }
|
|
|
3604df |
+
|
|
|
3604df |
+ /* Wait for socket_poller to exit */
|
|
|
3604df |
+ if (!priv->own_thread_done)
|
|
|
3604df |
+ pthread_cond_wait (&priv->cond,
|
|
|
3604df |
+ &priv->cond_lock);
|
|
|
3604df |
+ }
|
|
|
3604df |
+ pthread_mutex_unlock (&priv->cond_lock);
|
|
|
3604df |
+ }
|
|
|
3604df |
+
|
|
|
3604df |
pthread_mutex_lock (&priv->lock);
|
|
|
3604df |
{
|
|
|
3604df |
ret = __socket_disconnect (this);
|
|
|
3604df |
@@ -2939,6 +2976,7 @@ socket_connect (rpc_transport_t *this, int port)
|
|
|
3604df |
|
|
|
3604df |
pthread_mutex_lock (&priv->lock);
|
|
|
3604df |
{
|
|
|
3604df |
+ priv->own_thread_done = _gf_false;
|
|
|
3604df |
if (priv->sock != -1) {
|
|
|
3604df |
gf_log_callingfn (this->name, GF_LOG_TRACE,
|
|
|
3604df |
"connect () called on transport "
|
|
|
3604df |
@@ -3807,6 +3845,26 @@ init_openssl_mt (void)
|
|
|
3604df |
SSL_load_error_strings();
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
+void
|
|
|
3604df |
+socket_poller_mayday (void *data)
|
|
|
3604df |
+{
|
|
|
3604df |
+ socket_private_t *priv = (socket_private_t *)data;
|
|
|
3604df |
+
|
|
|
3604df |
+ if (priv == NULL)
|
|
|
3604df |
+ return;
|
|
|
3604df |
+
|
|
|
3604df |
+ pthread_mutex_lock (&priv->cond_lock);
|
|
|
3604df |
+ {
|
|
|
3604df |
+ /* Signal waiting threads before exiting from socket_poller */
|
|
|
3604df |
+ if (!priv->own_thread_done) {
|
|
|
3604df |
+ gf_log ("socket", GF_LOG_TRACE, "priv->cond SIGNALED");
|
|
|
3604df |
+ pthread_cond_signal (&priv->cond);
|
|
|
3604df |
+ priv->own_thread_done = _gf_true;
|
|
|
3604df |
+ }
|
|
|
3604df |
+ }
|
|
|
3604df |
+ pthread_mutex_unlock (&priv->cond_lock);
|
|
|
3604df |
+}
|
|
|
3604df |
+
|
|
|
3604df |
static int
|
|
|
3604df |
socket_init (rpc_transport_t *this)
|
|
|
3604df |
{
|
|
|
3604df |
@@ -3837,6 +3895,10 @@ socket_init (rpc_transport_t *this)
|
|
|
3604df |
memset(priv,0,sizeof(*priv));
|
|
|
3604df |
|
|
|
3604df |
pthread_mutex_init (&priv->lock, NULL);
|
|
|
3604df |
+ pthread_mutex_init (&priv->cond_lock, NULL);
|
|
|
3604df |
+ pthread_cond_init (&priv->cond, NULL);
|
|
|
3604df |
+
|
|
|
3604df |
+ GF_REF_INIT (priv, socket_poller_mayday);
|
|
|
3604df |
|
|
|
3604df |
priv->sock = -1;
|
|
|
3604df |
priv->idx = -1;
|
|
|
3604df |
@@ -4267,6 +4329,8 @@ fini (rpc_transport_t *this)
|
|
|
3604df |
"transport %p destroyed", this);
|
|
|
3604df |
|
|
|
3604df |
pthread_mutex_destroy (&priv->lock);
|
|
|
3604df |
+ pthread_mutex_destroy (&priv->cond_lock);
|
|
|
3604df |
+ pthread_cond_destroy (&priv->cond);
|
|
|
3604df |
if (priv->ssl_private_key) {
|
|
|
3604df |
GF_FREE(priv->ssl_private_key);
|
|
|
3604df |
}
|
|
|
3604df |
diff --git a/rpc/rpc-transport/socket/src/socket.h b/rpc/rpc-transport/socket/src/socket.h
|
|
|
3604df |
index 7c7005b..8528bde 100644
|
|
|
3604df |
--- a/rpc/rpc-transport/socket/src/socket.h
|
|
|
3604df |
+++ b/rpc/rpc-transport/socket/src/socket.h
|
|
|
3604df |
@@ -27,6 +27,7 @@
|
|
|
3604df |
#include "dict.h"
|
|
|
3604df |
#include "mem-pool.h"
|
|
|
3604df |
#include "globals.h"
|
|
|
3604df |
+#include "refcount.h"
|
|
|
3604df |
|
|
|
3604df |
#ifndef MAX_IOVEC
|
|
|
3604df |
#define MAX_IOVEC 16
|
|
|
3604df |
@@ -215,6 +216,8 @@ typedef struct {
|
|
|
3604df |
};
|
|
|
3604df |
struct gf_sock_incoming incoming;
|
|
|
3604df |
pthread_mutex_t lock;
|
|
|
3604df |
+ pthread_mutex_t cond_lock;
|
|
|
3604df |
+ pthread_cond_t cond;
|
|
|
3604df |
int windowsize;
|
|
|
3604df |
char lowlat;
|
|
|
3604df |
char nodelay;
|
|
|
3604df |
@@ -239,10 +242,13 @@ typedef struct {
|
|
|
3604df |
pthread_t thread;
|
|
|
3604df |
int pipe[2];
|
|
|
3604df |
gf_boolean_t own_thread;
|
|
|
3604df |
+ gf_boolean_t own_thread_done;
|
|
|
3604df |
ot_state_t ot_state;
|
|
|
3604df |
uint32_t ot_gen;
|
|
|
3604df |
gf_boolean_t is_server;
|
|
|
3604df |
int log_ctr;
|
|
|
3604df |
+ GF_REF_DECL; /* refcount to keep track of socket_poller
|
|
|
3604df |
+ threads */
|
|
|
3604df |
} socket_private_t;
|
|
|
3604df |
|
|
|
3604df |
|
|
|
3604df |
diff --git a/xlators/mgmt/glusterd/src/glusterd-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c
|
|
|
3604df |
index 9f162d8..e9aa6b0 100644
|
|
|
3604df |
--- a/xlators/mgmt/glusterd/src/glusterd-handshake.c
|
|
|
3604df |
+++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c
|
|
|
3604df |
@@ -1821,7 +1821,7 @@ __glusterd_mgmt_hndsk_version_ack_cbk (struct rpc_req *req, struct iovec *iov,
|
|
|
3604df |
out:
|
|
|
3604df |
|
|
|
3604df |
if (ret != 0 && peerinfo)
|
|
|
3604df |
- rpc_transport_disconnect (peerinfo->rpc->conn.trans);
|
|
|
3604df |
+ rpc_transport_disconnect (peerinfo->rpc->conn.trans, _gf_false);
|
|
|
3604df |
|
|
|
3604df |
rcu_read_unlock ();
|
|
|
3604df |
|
|
|
3604df |
@@ -1946,7 +1946,8 @@ out:
|
|
|
3604df |
frame->local = NULL;
|
|
|
3604df |
STACK_DESTROY (frame->root);
|
|
|
3604df |
if (peerinfo)
|
|
|
3604df |
- rpc_transport_disconnect (peerinfo->rpc->conn.trans);
|
|
|
3604df |
+ rpc_transport_disconnect (peerinfo->rpc->conn.trans,
|
|
|
3604df |
+ _gf_false);
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
rcu_read_unlock ();
|
|
|
3604df |
@@ -2216,7 +2217,7 @@ __glusterd_peer_dump_version_cbk (struct rpc_req *req, struct iovec *iov,
|
|
|
3604df |
|
|
|
3604df |
out:
|
|
|
3604df |
if (ret != 0 && peerinfo)
|
|
|
3604df |
- rpc_transport_disconnect (peerinfo->rpc->conn.trans);
|
|
|
3604df |
+ rpc_transport_disconnect (peerinfo->rpc->conn.trans, _gf_false);
|
|
|
3604df |
|
|
|
3604df |
rcu_read_unlock ();
|
|
|
3604df |
|
|
|
3604df |
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
|
|
|
3604df |
index 98c0059..31ba68b 100644
|
|
|
3604df |
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
|
|
|
3604df |
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
|
|
|
3604df |
@@ -4058,7 +4058,8 @@ gd_check_and_update_rebalance_info (glusterd_volinfo_t *old_volinfo,
|
|
|
3604df |
|
|
|
3604df |
//Disconnect from rebalance process
|
|
|
3604df |
if (glusterd_defrag_rpc_get (old->defrag)) {
|
|
|
3604df |
- rpc_transport_disconnect (old->defrag->rpc->conn.trans);
|
|
|
3604df |
+ rpc_transport_disconnect (old->defrag->rpc->conn.trans,
|
|
|
3604df |
+ _gf_false);
|
|
|
3604df |
glusterd_defrag_rpc_put (old->defrag);
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
diff --git a/xlators/protocol/client/src/client-handshake.c b/xlators/protocol/client/src/client-handshake.c
|
|
|
3604df |
index 3284fac..74e7548 100644
|
|
|
3604df |
--- a/xlators/protocol/client/src/client-handshake.c
|
|
|
3604df |
+++ b/xlators/protocol/client/src/client-handshake.c
|
|
|
3604df |
@@ -1557,7 +1557,7 @@ out:
|
|
|
3604df |
if (conf) {
|
|
|
3604df |
/* Need this to connect the same transport on different port */
|
|
|
3604df |
/* ie, glusterd to glusterfsd */
|
|
|
3604df |
- rpc_transport_disconnect (conf->rpc->conn.trans);
|
|
|
3604df |
+ rpc_transport_disconnect (conf->rpc->conn.trans, _gf_false);
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
return ret;
|
|
|
3604df |
@@ -1678,7 +1678,7 @@ out:
|
|
|
3604df |
STACK_DESTROY (frame->root);
|
|
|
3604df |
|
|
|
3604df |
if (ret != 0)
|
|
|
3604df |
- rpc_transport_disconnect (conf->rpc->conn.trans);
|
|
|
3604df |
+ rpc_transport_disconnect (conf->rpc->conn.trans, _gf_false);
|
|
|
3604df |
|
|
|
3604df |
return ret;
|
|
|
3604df |
}
|
|
|
3604df |
diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c
|
|
|
3604df |
index 726ab69..3c3664d 100644
|
|
|
3604df |
--- a/xlators/protocol/server/src/server.c
|
|
|
3604df |
+++ b/xlators/protocol/server/src/server.c
|
|
|
3604df |
@@ -899,7 +899,8 @@ reconfigure (xlator_t *this, dict_t *options)
|
|
|
3604df |
"unauthorized client, hence "
|
|
|
3604df |
"terminating the connection %s",
|
|
|
3604df |
xprt->peerinfo.identifier);
|
|
|
3604df |
- rpc_transport_disconnect(xprt);
|
|
|
3604df |
+ rpc_transport_disconnect(xprt,
|
|
|
3604df |
+ _gf_false);
|
|
|
3604df |
}
|
|
|
3604df |
}
|
|
|
3604df |
}
|
|
|
3604df |
--
|
|
|
3604df |
2.9.3
|
|
|
3604df |
|