[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