diff options
author | Vijaikumar M <vmallika@redhat.com> | 2014-06-19 15:41:22 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2015-02-07 13:17:30 -0800 |
commit | c61074400a45e69c6edbf82b8ed02568726d37ae (patch) | |
tree | c9c826414bcd3da0e1f30edbaaf79ac0c716a371 /rpc | |
parent | 5e25569ed0717aa8636ad708430a823d39f9aa60 (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')
-rw-r--r-- | rpc/rpc-transport/socket/src/socket.c | 33 |
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; } |