From: Hitoshi Mitake <mitake.hito...@lab.ntt.co.jp> Currently some components of sheepdog uses pthread_create() directly. But this usage introduces diagnose unfriendly log. The below line is an example:
Jul 27 20:59:36 INFO [main] http_main_loop(325) http main loop The function http_main_loop() is called in a worker thread but its prefix is [main]. Because The worker thread doesn't change its TLS variable worker_name (which is initialized by set_thread_name()). This patch adds a new wrapper sd_thread_create(), which wraps pthread_create() and let the worker threads set correct worker_name. Below line is a changed one: Jul 27 21:33:27 INFO [http] http_main_loop(325) http main loop This patch also introduces below wrappers: - sd_thread_join(): a wrapper for pthread_join(), because pthread_t is not used directly anymore - sd_thread_create_with_idx(): another wrapper of pthread_create() which produces several threads from single function Signed-off-by: Hitoshi Mitake <mitake.hito...@lab.ntt.co.jp> --- include/work.h | 7 +++++++ lib/work.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ sheep/http/http.c | 5 +++-- sheep/md.c | 13 +++++++------ sheep/nfs/nfsd.c | 4 ++-- 5 files changed, 76 insertions(+), 10 deletions(-) diff --git a/include/work.h b/include/work.h index e26cb65..b2fa0cf 100644 --- a/include/work.h +++ b/include/work.h @@ -69,4 +69,11 @@ void suspend_worker_threads(void); void resume_worker_threads(void); #endif /* HAVE_TRACE */ +typedef pthread_t sd_thread_t; +int sd_thread_create(const char *, sd_thread_t *, + void *(*start_routine)(void *), void *); +int sd_thread_create_with_idx(const char *, sd_thread_t *, + void *(*start_routine)(void *), void *); +int sd_thread_join(sd_thread_t , void **); + #endif diff --git a/lib/work.c b/lib/work.c index 35413ff..bb919a4 100644 --- a/lib/work.c +++ b/lib/work.c @@ -444,3 +444,60 @@ bool work_queue_empty(struct work_queue *q) return uatomic_read(&wi->nr_queued_work) == 0; } + +struct thread_args { + const char *name; + void *(*start_routine)(void *); + void *arg; + bool show_idx; +}; + +static void *thread_starter(void *arg) +{ + struct thread_args *args = (struct thread_args *)arg; + void *ret; + + set_thread_name(args->name, args->show_idx); + ret = args->start_routine(args->arg); + free(arg); + + return ret; +} + +static int __sd_thread_create(const char *name, sd_thread_t *thread, + void *(*start_routine)(void *), void *arg, + bool show_idx) +{ + struct thread_args *args; + + + args = xzalloc(sizeof(*args)); + args->name = name; + args->start_routine = start_routine; + args->arg = arg; + args->show_idx = show_idx; + + /* + * currently, there isn't a thread which uses ptread_attr_t + * in sheepdog + */ + return pthread_create(thread, NULL, thread_starter, args); +} + +int sd_thread_create(const char *name, sd_thread_t *thread, + void *(*start_routine)(void *), void *arg) +{ + return __sd_thread_create(name, thread, start_routine, arg, false); +} + +int sd_thread_create_with_idx(const char *name, sd_thread_t *thread, + void *(*start_routine)(void *), void *arg) +{ + return __sd_thread_create(name, thread, start_routine, arg, true); +} + +int sd_thread_join(sd_thread_t thread, void **retval) +{ + return pthread_join(thread, retval); +} + diff --git a/sheep/http/http.c b/sheep/http/http.c index 382937f..5786e90 100644 --- a/sheep/http/http.c +++ b/sheep/http/http.c @@ -322,6 +322,7 @@ static void *http_main_loop(void *ignored) { int err; + sd_info("http main loop"); for (;;) { struct http_request *req = http_new_request(http_sockfd); int ret; @@ -414,7 +415,7 @@ static struct option_parser http_opt_parsers[] = { int http_init(const char *options) { - pthread_t t; + sd_thread_t t; int err; char *s, address[HOST_NAME_MAX + 8]; @@ -446,7 +447,7 @@ int http_init(const char *options) return -1; } sd_info("http service listen at %s", address); - err = pthread_create(&t, NULL, http_main_loop, NULL); + err = sd_thread_create("http", &t, http_main_loop, NULL); if (err) { sd_err("%s", strerror(err)); return -1; diff --git a/sheep/md.c b/sheep/md.c index d7724c0..8f4d5be 100644 --- a/sheep/md.c +++ b/sheep/md.c @@ -413,7 +413,7 @@ main_fn int for_each_object_in_wd(int (*func)(uint64_t oid, const char *path, struct process_path_arg *thread_args, *path_arg; struct vnode_info *vinfo; void *ret_arg; - pthread_t *thread_array; + sd_thread_t *thread_array; int nr_thread = 0, idx = 0; sd_read_lock(&md.lock); @@ -423,7 +423,7 @@ main_fn int for_each_object_in_wd(int (*func)(uint64_t oid, const char *path, } thread_args = xmalloc(nr_thread * sizeof(struct process_path_arg)); - thread_array = xmalloc(nr_thread * sizeof(pthread_t)); + thread_array = xmalloc(nr_thread * sizeof(sd_thread_t)); vinfo = get_vnode_info(); @@ -434,9 +434,10 @@ main_fn int for_each_object_in_wd(int (*func)(uint64_t oid, const char *path, thread_args[idx].cleanup = cleanup; thread_args[idx].opaque = arg; thread_args[idx].result = SD_RES_SUCCESS; - ret = pthread_create(thread_array + idx, NULL, - thread_process_path, - (void *)(thread_args + idx)); + ret = sd_thread_create_with_idx("foreach wd", + thread_array + idx, + thread_process_path, + (void *)(thread_args + idx)); if (ret) { /* * If we can't create enough threads to process @@ -452,7 +453,7 @@ main_fn int for_each_object_in_wd(int (*func)(uint64_t oid, const char *path, sd_debug("Create %d threads for all path", nr_thread); /* wait for all threads to exit */ for (idx = 0; idx < nr_thread; idx++) { - ret = pthread_join(thread_array[idx], &ret_arg); + ret = sd_thread_join(thread_array[idx], &ret_arg); if (ret) sd_err("Failed to join thread"); if (ret_arg) { diff --git a/sheep/nfs/nfsd.c b/sheep/nfs/nfsd.c index 8ac8625..5cb87af 100644 --- a/sheep/nfs/nfsd.c +++ b/sheep/nfs/nfsd.c @@ -198,10 +198,10 @@ uint64_t nfs_boot_time; int nfs_init(const char *options) { - pthread_t t; + sd_thread_t t; int err; - err = pthread_create(&t, NULL, nfsd, NULL); + err = sd_thread_create("nfs, "&t, nfsd, NULL); if (err) { sd_err("%s", strerror(err)); return -1; -- 1.9.1 -- sheepdog mailing list sheepdog@lists.wpkg.org http://lists.wpkg.org/mailman/listinfo/sheepdog