From 16dd1b3ead17339a1addf2edb6dff5f731876c54 Mon Sep 17 00:00:00 2001 From: William Lallemand Date: Mon, 19 Nov 2018 18:46:18 +0100 Subject: [PATCH] MINOR: cli: show master information in 'show proc' Displays the master information in show proc. --- include/types/global.h | 3 +++ src/cli.c | 18 +++++++++++++++--- src/haproxy.c | 42 ++++++++++++++++++++++++++++++++---------- 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/include/types/global.h b/include/types/global.h index be4d7c533..effc51c2c 100644 --- a/include/types/global.h +++ b/include/types/global.h @@ -209,6 +209,8 @@ struct activity { */ struct mworker_proc { int pid; + char type; /* m(aster), w(orker) */ + /* 3 bytes hole here */ int ipc_fd[2]; /* 0 is master side, 1 is worker side */ int relative_pid; int reloads; @@ -242,6 +244,7 @@ extern struct task *global_listener_queue_task; extern unsigned int warned; /* bitfield of a few warnings to emit just once */ extern volatile unsigned long sleeping_thread_mask; extern struct list proc_list; /* list of process in mworker mode */ +extern struct mworker_proc *proc_self; /* process structure of current process */ /* bit values to go with "warned" above */ #define WARN_BLOCK_DEPRECATED 0x00000001 diff --git a/src/cli.c b/src/cli.c index 24cb2a48f..4356586bf 100644 --- a/src/cli.c +++ b/src/cli.c @@ -1399,6 +1399,7 @@ static int cli_io_handler_show_proc(struct appctx *appctx) struct stream_interface *si = appctx->owner; struct mworker_proc *child; int old = 0; + int up = now.tv_sec - proc_self->timestamp; if (unlikely(si_ic(si)->flags & (CF_WRITE_ERROR|CF_SHUTW))) return 1; @@ -1406,13 +1407,16 @@ static int cli_io_handler_show_proc(struct appctx *appctx) chunk_reset(&trash); chunk_printf(&trash, "#%-14s %-15s %-15s %-15s %s\n", "", "", "", "", ""); - chunk_appendf(&trash, "%-15u %-15s %-15u %-15s %s\n", getpid(), "master", 0, "-", "-"); + chunk_appendf(&trash, "%-15u %-15s %-15u %-15d %dd %02dh%02dm%02ds\n", getpid(), "master", 0, proc_self->reloads, up / 86400, (up % 86400) / 3600, (up % 3600) / 60, (up % 60)); /* displays current processes */ chunk_appendf(&trash, "# workers\n"); list_for_each_entry(child, &proc_list, list) { - int up = now.tv_sec - child->timestamp; + up = now.tv_sec - child->timestamp; + + if (child->type != 'w') + continue; if (child->reloads > 0) { old++; @@ -1426,7 +1430,11 @@ static int cli_io_handler_show_proc(struct appctx *appctx) if (old) { chunk_appendf(&trash, "# old workers\n"); list_for_each_entry(child, &proc_list, list) { - int up = now.tv_sec - child->timestamp; + up = now.tv_sec - child->timestamp; + + if (child->type != 'w') + continue; + if (child->reloads > 0) chunk_appendf(&trash, "%-15u %-15s %-15u %-15d %dd %02dh%02dm%02ds\n", child->pid, "worker", child->relative_pid, child->reloads, up / 86400, (up % 86400) / 3600, (up % 3600) / 60, (up % 60)); } @@ -1707,6 +1715,8 @@ static int pcli_prefix_to_pid(const char *prefix) if (*errtol != '\0') return -1; list_for_each_entry(child, &proc_list, list) { + if (child->type != 'w') + continue; if (child->pid == proc_pid){ return child->pid; } @@ -1725,6 +1735,8 @@ static int pcli_prefix_to_pid(const char *prefix) /* chose the right process, the current one is the one with the least number of reloads */ list_for_each_entry(child, &proc_list, list) { + if (child->type != 'w') + continue; if (child->relative_pid == proc_pid){ if (child->reloads == 0) return child->pid; diff --git a/src/haproxy.c b/src/haproxy.c index 276652b99..225dc6933 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -219,7 +219,7 @@ struct list proc_list = LIST_HEAD_INIT(proc_list); int master = 0; /* 1 if in master, 0 if in child */ -struct mworker_proc *proc_self; +struct mworker_proc *proc_self = NULL; /* list of the temporarily limited listeners because of lack of resource */ struct list global_listener_queue = LIST_HEAD_INIT(global_listener_queue); @@ -540,13 +540,10 @@ static void mworker_proc_list_to_env() struct mworker_proc *child; list_for_each_entry(child, &proc_list, list) { - if (msg) - memprintf(&msg, "%s|type=worker;fd=%d;pid=%d;rpid=%d;reloads=%d;timestamp=%d", msg, child->ipc_fd[0], child->pid, child->relative_pid, child->reloads, child->timestamp); - else - memprintf(&msg, "type=worker;fd=%d;pid=%d;rpid=%d;reloads=%d;timestamp=%d", child->ipc_fd[0], child->pid, child->relative_pid, child->reloads, child->timestamp); + memprintf(&msg, "%s|type=%c;fd=%d;pid=%d;rpid=%d;reloads=%d;timestamp=%d", msg ? msg : "", child->type, child->ipc_fd[0], child->pid, child->relative_pid, child->reloads, child->timestamp); } if (msg) - setenv("HAPROXY_CHILDREN", msg, 1); + setenv("HAPROXY_PROCESSES", msg, 1); } /* @@ -556,7 +553,7 @@ static void mworker_env_to_proc_list() { char *msg, *token = NULL, *s1; - msg = getenv("HAPROXY_CHILDREN"); + msg = getenv("HAPROXY_PROCESSES"); if (!msg) return; @@ -573,7 +570,11 @@ static void mworker_env_to_proc_list() token = NULL; - if (strncmp(subtoken, "fd=", 3) == 0) { + if (strncmp(subtoken, "type=", 5) == 0) { + child->type = *(subtoken+5); + if (child->type == 'm') /* we are in the master, assign it */ + proc_self = child; + } else if (strncmp(subtoken, "fd=", 3) == 0) { child->ipc_fd[0] = atoi(subtoken+3); } else if (strncmp(subtoken, "pid=", 4) == 0) { child->pid = atoi(subtoken+4); @@ -592,7 +593,7 @@ static void mworker_env_to_proc_list() free(child); } - unsetenv("HAPROXY_CHILDREN"); + unsetenv("HAPROXY_PROCESSES"); } /* @@ -1735,9 +1736,29 @@ static void init(int argc, char **argv) if (global.mode & MODE_MWORKER) { int proc; struct wordlist *it, *c; + struct mworker_proc *tmproc; + + if (getenv("HAPROXY_MWORKER_REEXEC") == NULL) { + + tmproc = malloc(sizeof(*tmproc)); + if (!tmproc) { + ha_alert("Cannot allocate process structures.\n"); + exit(EXIT_FAILURE); + } + tmproc->type = 'm'; /* master */ + tmproc->reloads = 0; + tmproc->relative_pid = 0; + tmproc->pid = pid; + tmproc->timestamp = start_date.tv_sec; + tmproc->ipc_fd[0] = -1; + tmproc->ipc_fd[1] = -1; + + proc_self = tmproc; + + LIST_ADDQ(&proc_list, &tmproc->list); + } for (proc = 0; proc < global.nbproc; proc++) { - struct mworker_proc *tmproc; tmproc = malloc(sizeof(*tmproc)); if (!tmproc) { @@ -1745,6 +1766,7 @@ static void init(int argc, char **argv) exit(EXIT_FAILURE); } + tmproc->type = 'w'; /* worker */ tmproc->pid = -1; tmproc->reloads = 0; tmproc->timestamp = -1;