diff --git a/core/fifo.c b/core/fifo.c index 1e67bd8d..1a92d9bc 100644 --- a/core/fifo.c +++ b/core/fifo.c @@ -14,6 +14,27 @@ extern struct uwsgi_server uwsgi; // this var can be accessed by plugins and hooks void (*uwsgi_fifo_table[256])(int); +static char *uwsgi_fifo_by_slot() { + int count = 0; + struct uwsgi_string_list *usl; + uwsgi_foreach(usl, uwsgi.master_fifo) { + if (count == uwsgi.master_fifo_slot) return usl->value; + count++; + } + return uwsgi.master_fifo->value; +} + +static void uwsgi_fifo_set_slot_zero() { uwsgi.master_fifo_slot = 0; } +static void uwsgi_fifo_set_slot_one() { uwsgi.master_fifo_slot = 1; } +static void uwsgi_fifo_set_slot_two() { uwsgi.master_fifo_slot = 2; } +static void uwsgi_fifo_set_slot_three() { uwsgi.master_fifo_slot = 3; } +static void uwsgi_fifo_set_slot_four() { uwsgi.master_fifo_slot = 4; } +static void uwsgi_fifo_set_slot_five() { uwsgi.master_fifo_slot = 5; } +static void uwsgi_fifo_set_slot_six() { uwsgi.master_fifo_slot = 6; } +static void uwsgi_fifo_set_slot_seven() { uwsgi.master_fifo_slot = 7; } +static void uwsgi_fifo_set_slot_eight() { uwsgi.master_fifo_slot = 8; } +static void uwsgi_fifo_set_slot_nine() { uwsgi.master_fifo_slot = 9; } + /* this is called as soon as possibile allowing plugins (or hooks) to override it @@ -25,6 +46,17 @@ void uwsgi_master_fifo_prepare() { uwsgi_fifo_table[i] = NULL; } + uwsgi_fifo_table['0'] = uwsgi_fifo_set_slot_zero; + uwsgi_fifo_table['1'] = uwsgi_fifo_set_slot_one; + uwsgi_fifo_table['2'] = uwsgi_fifo_set_slot_two; + uwsgi_fifo_table['3'] = uwsgi_fifo_set_slot_three; + uwsgi_fifo_table['4'] = uwsgi_fifo_set_slot_four; + uwsgi_fifo_table['5'] = uwsgi_fifo_set_slot_five; + uwsgi_fifo_table['6'] = uwsgi_fifo_set_slot_six; + uwsgi_fifo_table['7'] = uwsgi_fifo_set_slot_seven; + uwsgi_fifo_table['8'] = uwsgi_fifo_set_slot_eight; + uwsgi_fifo_table['9'] = uwsgi_fifo_set_slot_nine; + uwsgi_fifo_table['-'] = uwsgi_cheaper_decrease; uwsgi_fifo_table['+'] = uwsgi_cheaper_increase; uwsgi_fifo_table['c'] = uwsgi_chain_reload; @@ -44,7 +76,9 @@ void uwsgi_master_fifo_prepare() { } -int uwsgi_master_fifo(char *path) { +int uwsgi_master_fifo() { + + char *path = uwsgi_fifo_by_slot(); unlink(path); @@ -75,7 +109,7 @@ int uwsgi_master_fifo_manage(int fd) { // fifo destroyed, recreate it else if (rlen == 0) { close(fd); - uwsgi.master_fifo_fd = uwsgi_master_fifo(uwsgi.master_fifo); + uwsgi.master_fifo_fd = uwsgi_master_fifo(); event_queue_add_fd_read(uwsgi.master_queue, uwsgi.master_fifo_fd); return 0; } diff --git a/core/master.c b/core/master.c index c9fe9bc9..d6c61bcf 100644 --- a/core/master.c +++ b/core/master.c @@ -346,7 +346,7 @@ int master_loop(char **argv, char **environ) { event_queue_add_fd_read(uwsgi.master_queue, uwsgi.shared->worker_signal_pipe[0]); if (uwsgi.master_fifo) { - uwsgi.master_fifo_fd = uwsgi_master_fifo(uwsgi.master_fifo); + uwsgi.master_fifo_fd = uwsgi_master_fifo(); event_queue_add_fd_read(uwsgi.master_queue, uwsgi.master_fifo_fd); } diff --git a/core/master_checks.c b/core/master_checks.c index 8e0fd22b..b3409e04 100644 --- a/core/master_checks.c +++ b/core/master_checks.c @@ -35,11 +35,17 @@ int uwsgi_master_check_reload(char **argv) { // check for chain reload void uwsgi_master_check_chain() { if (!uwsgi.status.chain_reloading) return; - if (uwsgi.status.chain_reloading > uwsgi.numproc) { + int i; + int needed_procs = 0; + for(i=1;i<=uwsgi.numproc;i++) { + if (uwsgi.workers[i].pid > 0 && uwsgi.workers[i].cheaped == 0) { + needed_procs++; + } + } + if (uwsgi.status.chain_reloading > needed_procs) { uwsgi.status.chain_reloading = 0; uwsgi_log_verbose("chain reloading complete\n"); } - int i; uwsgi_block_signal(SIGHUP); for(i=1;i<=uwsgi.numproc;i++) { if (uwsgi.workers[i].pid > 0 && uwsgi.workers[i].cheaped == 0 && uwsgi.workers[i].cursed_at == 0 && i == uwsgi.status.chain_reloading) { diff --git a/core/uwsgi.c b/core/uwsgi.c index 2704ad32..9f198d1e 100644 --- a/core/uwsgi.c +++ b/core/uwsgi.c @@ -495,7 +495,7 @@ static struct uwsgi_option uwsgi_base_options[] = { {"multicast-ttl", required_argument, 0, "set multicast ttl", uwsgi_opt_set_int, &uwsgi.multicast_ttl, 0}, {"multicast-loop", required_argument, 0, "set multicast loop (default 1)", uwsgi_opt_set_int, &uwsgi.multicast_loop, 0}, - {"master-fifo", required_argument, 0, "enable the master fifo", uwsgi_opt_set_str, &uwsgi.master_fifo, UWSGI_OPT_MASTER}, + {"master-fifo", required_argument, 0, "enable the master fifo", uwsgi_opt_add_string_list, &uwsgi.master_fifo, UWSGI_OPT_MASTER}, #ifdef UWSGI_SSL {"legion", required_argument, 0, "became a member of a legion", uwsgi_opt_legion, NULL, UWSGI_OPT_MASTER}, diff --git a/uwsgi.h b/uwsgi.h index 897703ca..f96dc20a 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -1689,8 +1689,10 @@ struct uwsgi_server { int master_is_reforked; - char *master_fifo; + struct uwsgi_string_list *master_fifo; int master_fifo_fd; + int master_fifo_slot; + // kill the stack on SIGTERM (instead of brutal reloading) int die_on_term; @@ -4321,7 +4323,7 @@ int uwsgi_accept(int); void suspend_resume_them_all(int); void uwsgi_master_fifo_prepare(); -int uwsgi_master_fifo(char *); +int uwsgi_master_fifo(); int uwsgi_master_fifo_manage(int); void uwsgi_log_rotate();