[sheepdog] [PATCH v2 05/10] work: try to create worker threads in worker_thread_request_done

MORITA Kazutaka morita.kazutaka at gmail.com
Mon May 13 17:11:13 CEST 2013


From: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>

Currently, even if the number of nodes is increased, the dynamic work
queue doesn't create worker threads until new work is added to the
queue.  This tries to create threads just after the work queue detect
that the cluster is expanded.

Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 lib/work.c |   18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/lib/work.c b/lib/work.c
index a68eabd..f457cd7 100644
--- a/lib/work.c
+++ b/lib/work.c
@@ -174,15 +174,29 @@ static void worker_thread_request_done(int fd, int events, void *data)
 	struct work *work;
 	eventfd_t value;
 	LIST_HEAD(list);
+	bool cluster_is_expanded = false;
 
-	if (wq_get_nr_nodes)
-		nr_nodes = wq_get_nr_nodes();
+	if (wq_get_nr_nodes) {
+		size_t cur_nr_nodes = wq_get_nr_nodes();
+		if (nr_nodes < cur_nr_nodes)
+			cluster_is_expanded = true;
+		nr_nodes = cur_nr_nodes;
+	}
 
 	ret = eventfd_read(fd, &value);
 	if (ret < 0)
 		return;
 
 	list_for_each_entry(wi, &worker_info_list, worker_info_siblings) {
+		if (cluster_is_expanded) {
+			pthread_mutex_lock(&wi->pending_lock);
+
+			if (wq_need_grow(wi))
+				/* double the thread pool size */
+				create_worker_threads(wi, wi->nr_threads * 2);
+
+			pthread_mutex_unlock(&wi->pending_lock);
+		}
 		pthread_mutex_lock(&wi->finished_lock);
 		list_splice_init(&wi->finished_list, &list);
 		pthread_mutex_unlock(&wi->finished_lock);
-- 
1.7.9.5




More information about the sheepdog mailing list