int uwsgi_calc_cheaper(void) { int i; static time_t last_check = 0; int check_interval = uwsgi.shared->options[UWSGI_OPTION_MASTER_INTERVAL]; if (!last_check) last_check = uwsgi_now(); time_t now = uwsgi_now(); if (!check_interval) check_interval = 1; if ((now - last_check) < check_interval) return 1; last_check = now; int needed_workers = uwsgi.cheaper_algo(); if (needed_workers > 0) { for (i = 1; i <= uwsgi.numproc; i++) { if (uwsgi.workers[i].cheaped == 1 && uwsgi.workers[i].pid == 0) { if (uwsgi_respawn_worker(i)) return 0; needed_workers--; } if (needed_workers == 0) break; } } else if (needed_workers < 0) { int oldest_worker = 0; time_t oldest_worker_spawn = INT_MAX; for (i = 1; i <= uwsgi.numproc; i++) { if (uwsgi.workers[i].cheaped == 0 && uwsgi.workers[i].pid > 0) { if (uwsgi.workers[i].last_spawn < oldest_worker_spawn) { oldest_worker_spawn = uwsgi.workers[i].last_spawn; oldest_worker = i; } } } if (oldest_worker > 0) { #ifdef UWSGI_DEBUG uwsgi_log("worker %d should die...\n", oldest_worker); #endif uwsgi.workers[oldest_worker].cheaped = 1; uwsgi.workers[oldest_worker].manage_next_request = 0; uwsgi_curse(oldest_worker, SIGWINCH); } } return 1; }
void uwsgi_master_check_mercy() { int i; for (i = 1; i <= uwsgi.numproc; i++) { if (uwsgi.workers[i].pid > 0 && uwsgi.workers[i].cursed_at) { if (uwsgi_now() > uwsgi.workers[i].no_mercy_at) { uwsgi_log_verbose("worker %d (pid: %d) is taking too much time to die...NO MERCY !!!\n", i, uwsgi.workers[i].pid); // yes that look strangem but we avoid callign it again if we skip waitpid() call below uwsgi_curse(i, SIGKILL); } } } }
// check for chain reload void uwsgi_master_check_chain() { if (!uwsgi.status.chain_reloading) return; if (uwsgi.status.chain_reloading > uwsgi.numproc) { 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) { uwsgi_curse(i, SIGHUP); break; } } uwsgi_unblock_signal(SIGHUP); }