summaryrefslogtreecommitdiffstats
path: root/rpc/rpc-transport
diff options
context:
space:
mode:
authorVijaikumar M <vmallika@redhat.com>2014-06-19 15:41:22 +0530
committerVijay Bellur <vbellur@redhat.com>2015-02-07 13:17:30 -0800
commitc61074400a45e69c6edbf82b8ed02568726d37ae (patch)
treec9c826414bcd3da0e1f30edbaaf79ac0c716a371 /rpc/rpc-transport
parent5e25569ed0717aa8636ad708430a823d39f9aa60 (diff)
epoll: edge triggered and multi-threaded epoll
- edge triggered (oneshot) polling with epoll - pick one event to avoid multiple events getting picked up by same thread and so get better distribution of events against multiple threads - wire support for multiple poll threads to epoll_wait in parallel - evdata to store absolute index and not hint for epoll - store index and gen of slot instead of fd and index hint - perform fd close asynchronously inside event.c for multithread safety - poll is still single threaded Change-Id: I536851dda0ab224c5d5a1b130a571397c9cace8f BUG: 1104462 Signed-off-by: Anand Avati <avati@redhat.com> Signed-off-by: Vijaikumar M <vmallika@redhat.com> Signed-off-by: Jeff Darcy <jdarcy@redhat.com> Signed-off-by: Shyam <srangana@redhat.com> Reviewed-on: http://review.gluster.org/3842 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Raghavendra G <rgowdapp@redhat.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'rpc/rpc-transport')
-rw-r--r--rpc/rpc-transport/socket/src/socket.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c
index 107590b0273..0a3a5812a91 100644
--- a/rpc/rpc-transport/socket/src/socket.c
+++ b/rpc/rpc-transport/socket/src/socket.c
@@ -291,6 +291,22 @@ ssl_do (rpc_transport_t *this, void *buf, size_t len, SSL_trinary_func *func)
case SSL_ERROR_NONE:
return r;
case SSL_ERROR_WANT_READ:
+ /* If we are attempting to connect/accept then we
+ * should wait here on the poll, for the SSL
+ * (re)negotiation to complete, else we would error out
+ * on the accept/connect.
+ * If we are here when attempting to read/write
+ * then we return r (or -1) as the socket is always
+ * primed for the read event, and it would eventually
+ * call one of the SSL routines */
+ /* NOTE: Only way to determine this is a accept/connect
+ * is to examine buf or func, which is not very
+ * clean */
+ if ((func == (SSL_trinary_func *)SSL_read)
+ || (func == (SSL_trinary_func *) SSL_write)) {
+ return r;
+ }
+
pfd.fd = priv->sock;
pfd.events = POLLIN;
if (poll(&pfd,1,-1) < 0) {
@@ -944,9 +960,8 @@ __socket_reset (rpc_transport_t *this)
memset (&priv->incoming, 0, sizeof (priv->incoming));
- event_unregister (this->ctx->event_pool, priv->sock, priv->idx);
+ event_unregister_close (this->ctx->event_pool, priv->sock, priv->idx);
- close (priv->sock);
priv->sock = -1;
priv->idx = -1;
priv->connected = -1;
@@ -2236,9 +2251,16 @@ socket_event_poll_in (rpc_transport_t *this)
rpc_transport_pollin_t *pollin = NULL;
socket_private_t *priv = this->private;
- ret = socket_proto_state_machine (this, &pollin);
+ do {
+ /* consume all we can, this is our only chance
+ (Edge Triggered polling in epoll)
+ */
+ pollin = NULL;
+ ret = socket_proto_state_machine (this, &pollin);
+
+ if (!pollin)
+ break;
- if (pollin != NULL) {
priv->ot_state = OT_CALLBACK;
ret = rpc_transport_notify (this, RPC_TRANSPORT_MSG_RECEIVED,
pollin);
@@ -2246,7 +2268,8 @@ socket_event_poll_in (rpc_transport_t *this)
priv->ot_state = OT_RUNNING;
}
rpc_transport_pollin_destroy (pollin);
- }
+
+ } while (pollin);
return ret;
}