[sheepdog] [PATCH] logger: make thread id more human readable
MORITA Kazutaka
morita.kazutaka at lab.ntt.co.jp
Mon Jun 18 23:27:45 CEST 2012
Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
include/logger.h | 2 +-
lib/logger.c | 15 +++++++++++----
sheep/cluster/accord.c | 2 +-
sheep/sheep.c | 12 ++++++------
sheep/work.c | 28 +++++++++++++---------------
sheep/work.h | 9 +++------
6 files changed, 35 insertions(+), 33 deletions(-)
diff --git a/include/logger.h b/include/logger.h
index 7f7a5ec..7c8ddd2 100644
--- a/include/logger.h
+++ b/include/logger.h
@@ -52,7 +52,7 @@ extern void log_close(void);
extern void dump_logmsg(void *);
extern void log_write(int prio, const char *func, int line, const char *fmt, ...)
__attribute__ ((format (printf, 4, 5)));
-extern void set_thread_id(int tid);
+extern void set_thread_name(const char *name, int idx);
/*
+ * sheep log priorities, comliant with syslog spec
diff --git a/lib/logger.c b/lib/logger.c
index ef02305..e16ac8a 100644
--- a/lib/logger.c
+++ b/lib/logger.c
@@ -47,7 +47,8 @@ static int log_enqueue(int prio, const char *func, int line, const char *fmt,
static void dolog(int prio, const char *func, int line, const char *fmt,
va_list ap) __attribute__ ((format (printf, 4, 0)));
-static __thread int thread_id;
+static __thread const char *worker_name;
+static __thread int worker_idx;
static struct logarea *la;
static char *log_name;
static char *log_nowname;
@@ -201,7 +202,12 @@ static notrace int log_enqueue(int prio, const char *func, int line, const char
strftime(p, MAX_MSG_SIZE, "%b %2d %H:%M:%S", tmp);
p += strlen(p);
- snprintf(p, MAX_MSG_SIZE - strlen(buff), "|%d|", thread_id);
+ if (worker_name)
+ snprintf(p, MAX_MSG_SIZE - strlen(buff), " [%s %d] ",
+ worker_name, worker_idx);
+ else
+ strncpy(p, " [main] ", MAX_MSG_SIZE - strlen(buff));
+
p += strlen(p);
}
@@ -526,7 +532,8 @@ notrace void log_close(void)
}
}
-notrace void set_thread_id(int tid)
+notrace void set_thread_name(const char *name, int idx)
{
- thread_id = tid;
+ worker_name = name;
+ worker_idx = idx;
}
diff --git a/sheep/cluster/accord.c b/sheep/cluster/accord.c
index 3633a4c..ae75ced 100644
--- a/sheep/cluster/accord.c
+++ b/sheep/cluster/accord.c
@@ -544,7 +544,7 @@ static int accord_init(const char *option)
return -1;
}
- acrd_wq = init_work_queue(1);
+ acrd_wq = init_work_queue("accord", 1);
if (!acrd_wq) {
eprintf("failed to create accord workqueue: %m\n");
return -1;
diff --git a/sheep/sheep.c b/sheep/sheep.c
index 323419f..a2cd43e 100644
--- a/sheep/sheep.c
+++ b/sheep/sheep.c
@@ -275,12 +275,12 @@ int main(int argc, char **argv)
exit(1);
}
- sys->gateway_wqueue = init_work_queue(nr_gateway_worker);
- sys->io_wqueue = init_work_queue(nr_io_worker);
- sys->recovery_wqueue = init_work_queue(1);
- sys->deletion_wqueue = init_work_queue(1);
- sys->flush_wqueue = init_work_queue(1);
- sys->block_wqueue = init_work_queue(1);
+ sys->gateway_wqueue = init_work_queue("gateway", nr_gateway_worker);
+ sys->io_wqueue = init_work_queue("io", nr_io_worker);
+ sys->recovery_wqueue = init_work_queue("recovery", 1);
+ sys->deletion_wqueue = init_work_queue("deletion", 1);
+ sys->flush_wqueue = init_work_queue("flush", 1);
+ sys->block_wqueue = init_work_queue("block", 1);
if (!sys->gateway_wqueue || !sys->io_wqueue ||
!sys->recovery_wqueue || !sys->deletion_wqueue ||
!sys->flush_wqueue || !sys->block_wqueue)
diff --git a/sheep/work.c b/sheep/work.c
index ae08525..6bebada 100644
--- a/sheep/work.c
+++ b/sheep/work.c
@@ -78,13 +78,19 @@ static void bs_thread_request_done(int fd, int events, void *data)
static void *worker_routine(void *arg)
{
- struct worker_info_ext *wie = arg;
- struct worker_info *wi = wie->wi;
+ struct worker_info *wi = arg;
struct work *work;
eventfd_t value = 1;
+ int i, idx;
- set_thread_id(wie->thread_id);
- free(wie);
+ for (i = 0; i < wi->nr_threads; i++) {
+ if (wi->worker_thread[i] == pthread_self()) {
+ idx = i;
+ break;
+ }
+ }
+
+ set_thread_name(wi->name, idx);
pthread_mutex_lock(&wi->startup_lock);
/* started this thread */
@@ -145,12 +151,10 @@ static int init_eventfd(void)
return 0;
}
-struct work_queue *init_work_queue(int nr)
+struct work_queue *init_work_queue(const char *name, int nr)
{
int i, ret;
struct worker_info *wi;
- struct worker_info_ext *wie;
- static int thread_id;
ret = init_eventfd();
if (ret)
@@ -160,6 +164,7 @@ struct work_queue *init_work_queue(int nr)
if (!wi)
return NULL;
+ wi->name = name;
wi->nr_threads = nr;
INIT_LIST_HEAD(&wi->q.pending_list);
@@ -174,15 +179,8 @@ struct work_queue *init_work_queue(int nr)
pthread_mutex_lock(&wi->startup_lock);
for (i = 0; i < wi->nr_threads; i++) {
- wie = zalloc(sizeof(*wie));
- if (!wie)
- return NULL;
-
- wie->wi = wi;
- wie->thread_id = ++thread_id;
-
ret = pthread_create(&wi->worker_thread[i], NULL,
- worker_routine, wie);
+ worker_routine, wi);
if (ret) {
eprintf("failed to create worker thread #%d: %s\n",
diff --git a/sheep/work.h b/sheep/work.h
index 0a1727c..8e0beba 100644
--- a/sheep/work.h
+++ b/sheep/work.h
@@ -20,6 +20,8 @@ struct work_queue {
};
struct worker_info {
+ const char *name;
+
struct list_head worker_info_siblings;
int nr_threads;
@@ -39,15 +41,10 @@ struct worker_info {
pthread_t worker_thread[0];
};
-struct worker_info_ext {
- int thread_id;
- struct worker_info *wi;
-};
-
extern struct list_head worker_info_list;
extern int total_nr_workers;
-struct work_queue *init_work_queue(int nr);
+struct work_queue *init_work_queue(const char *name, int nr);
void queue_work(struct work_queue *q, struct work *work);
#endif
--
1.7.2.5
More information about the sheepdog
mailing list