From f338f8513ec9ffbe26ba9fe4de000331dc2c2789 Mon Sep 17 00:00:00 2001 From: Krishnan Parthasarathi Date: Thu, 13 Aug 2015 14:39:58 +0530 Subject: [PATCH 314/320] event-epoll: Use pollers[] to check if event_pool_dispatch was called Backport of http://review.gluster.org/12004 This patch allows event_pool to change the no. of worker threads handling events independent of event_dispatch() being called. NB This patch is not a straight backport of the above patch. It telescopes the following patches upstream, [1] http://review.gluster.com/11911 [2] http://review.gluster.com/12004 [1] - uses an extra flag to change behaviour of reconfiguring the no. of worker threads. This wasn't complete. [2] - makes event_reconfigure_threads() implementation of epoll-based eventing independent of when event_dispatch() is called , without the extra flag introduced in [1]. BUG: 1241336 Change-Id: Ia8df3c958545324472262c555ed84b71797f002e Signed-off-by: Krishnan Parthasarathi Reviewed-on: https://code.engineering.redhat.com/gerrit/56626 Reviewed-by: Atin Mukherjee Tested-by: Atin Mukherjee --- libglusterfs/src/event-epoll.c | 24 +++++++++++++++++++++++- 1 files changed, 23 insertions(+), 1 deletions(-) diff --git a/libglusterfs/src/event-epoll.c b/libglusterfs/src/event-epoll.c index 9403217..fc3099d 100644 --- a/libglusterfs/src/event-epoll.c +++ b/libglusterfs/src/event-epoll.c @@ -770,6 +770,23 @@ event_dispatch_epoll (struct event_pool *event_pool) return ret; } +/** + * @param event_pool event_pool on which fds of interest are registered for + * events. + * + * @return 1 if at least one epoll worker thread is spawned, 0 otherwise + * + * NB This function SHOULD be called under event_pool->mutex. + */ + +static int +event_pool_dispatched_unlocked (struct event_pool *event_pool) +{ + return (event_pool->pollers[0] != 0); + +} + + int event_reconfigure_threads_epoll (struct event_pool *event_pool, int value) { @@ -796,7 +813,12 @@ event_reconfigure_threads_epoll (struct event_pool *event_pool, int value) oldthreadcount = event_pool->eventthreadcount; - if (oldthreadcount < value) { + /* Start 'worker' threads as necessary only if event_dispatch() + * was called before. If event_dispatch() was not called, there + * will be no epoll 'worker' threads running yet. */ + + if (event_pool_dispatched_unlocked(event_pool) + && (oldthreadcount < value)) { /* create more poll threads */ for (i = oldthreadcount; i < value; i++) { /* Start a thread if the index at this location -- 1.7.1