Skip to content

Commit bb0a608

Browse files
committed
No longer using the SIGRTMIN signal; instead, the logs will be reopened upon receiving SIGWINCH. SIGRTMIN is a feature unique to Linux.
1 parent f51efd0 commit bb0a608

File tree

7 files changed

+67
-40
lines changed

7 files changed

+67
-40
lines changed

ext-src/swoole_process_pool.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,10 @@ static void process_pool_signal_handler(int sig) {
310310
current_pool->reload();
311311
break;
312312
case SIGIO:
313-
current_pool->read_message = true;
313+
current_pool->rigger_read_message_event();
314+
break;
315+
case SIGWINCH:
316+
current_pool->reopen_logger();
314317
break;
315318
default:
316319
break;

include/swoole_process_pool.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,12 @@ struct ProcessPool {
400400
int start();
401401
bool shutdown();
402402
bool reload();
403+
void reopen_logger();
404+
405+
void rigger_read_message_event() {
406+
read_message = true;
407+
}
408+
403409
pid_t spawn(Worker *worker);
404410
void stop(Worker *worker);
405411
void kill_all_workers(int signo = SIGKILL);

src/os/process_pool.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,14 @@ void ProcessPool::stop(Worker *worker) {
442442
}
443443
}
444444

445+
void ProcessPool::reopen_logger() {
446+
sw_logger()->reopen();
447+
448+
if (is_master()) {
449+
kill_all_workers(SIGWINCH);
450+
}
451+
}
452+
445453
void ProcessPool::kill_all_workers(int signo) {
446454
SW_LOOP_N(worker_num) {
447455
swoole_kill(workers[i].pid, signo);

src/server/manager.cc

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@
2727
#endif
2828

2929
namespace swoole {
30+
/**
31+
* The functionality of the Manager class is similar to that of the ProcessPool,
32+
* but due to the more complex management requirements for processes in the Server module, the ProcessPool falls short.
33+
* Therefore, we ad an new class, and the Manager class should reuse the ProcessPool code as much as possible.
34+
*/
3035
struct Manager {
3136
bool reload_all_worker;
3237
bool reload_task_worker;
@@ -37,6 +42,7 @@ struct Manager {
3742

3843
void wait(Server *_server);
3944
void terminate_all_worker();
45+
void reopen_logger() const;
4046

4147
static void signal_handler(int sig);
4248
static void timer_callback(Timer *timer, TimerNode *tnode);
@@ -122,14 +128,14 @@ void Manager::wait(Server *_server) {
122128

123129
swoole_event_free();
124130

125-
// for reload
126131
swoole_signal_set(SIGHUP, nullptr);
127-
swoole_signal_set(SIGCHLD, signal_handler);
128-
swoole_signal_set(SIGTERM, signal_handler);
129-
swoole_signal_set(SIGUSR1, signal_handler);
130-
swoole_signal_set(SIGUSR2, signal_handler);
131-
swoole_signal_set(SIGIO, signal_handler);
132-
swoole_signal_set(SIGALRM, signal_handler);
132+
swoole_signal_set(SIGCHLD, signal_handler); // child process exit
133+
swoole_signal_set(SIGTERM, signal_handler); // shutdown
134+
swoole_signal_set(SIGUSR1, signal_handler); // reload all workers
135+
swoole_signal_set(SIGUSR2, signal_handler); // reload task workers
136+
swoole_signal_set(SIGIO, signal_handler); // read message
137+
swoole_signal_set(SIGALRM, signal_handler); // timer
138+
swoole_signal_set(SIGWINCH, signal_handler); // reopen log file
133139
#ifdef SIGRTMIN
134140
swoole_signal_set(SIGRTMIN, signal_handler);
135141
#endif
@@ -331,6 +337,15 @@ void Manager::terminate_all_worker() {
331337
}
332338
}
333339

340+
void Manager::reopen_logger() const {
341+
sw_logger()->reopen();
342+
343+
SW_LOOP_N(server_->get_all_worker_num()) {
344+
const auto worker = server_->get_worker(i);
345+
swoole_kill(worker->pid, SIGWINCH);
346+
}
347+
}
348+
334349
void Manager::signal_handler(int signo) {
335350
Server *_server = sw_server();
336351
if (!_server || !_server->manager) {
@@ -346,7 +361,6 @@ void Manager::signal_handler(int signo) {
346361
case SIGUSR1:
347362
case SIGUSR2:
348363
_server->reload(signo == SIGUSR1);
349-
sw_logger()->reopen();
350364
break;
351365
case SIGIO:
352366
pool->read_message = true;
@@ -356,10 +370,13 @@ void Manager::signal_handler(int signo) {
356370
manager->terminate_all_worker();
357371
}
358372
break;
373+
case SIGWINCH:
374+
manager->reopen_logger();
375+
break;
359376
default:
360377
#ifdef SIGRTMIN
361378
if (signo == SIGRTMIN) {
362-
sw_logger()->reopen();
379+
manager->reopen_logger();
363380
}
364381
#endif
365382
break;

src/server/master.cc

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -931,20 +931,16 @@ bool Server::signal_handler_read_message() {
931931
return true;
932932
}
933933

934-
#ifdef SIGRTMIN
935934
bool Server::signal_handler_reopen_logger() {
936935
swoole_trace_log(SW_TRACE_SERVER, "reopen log file ['%s']", sw_logger()->get_file());
937-
for (uint32_t i = 0; i < worker_num + task_worker_num + get_user_worker_num(); i++) {
938-
Worker *worker = get_worker(i);
939-
swoole_kill(worker->pid, SIGRTMIN);
940-
}
936+
sw_logger()->reopen();
937+
941938
if (is_process_mode()) {
942-
swoole_kill(gs->manager_pid, SIGRTMIN);
939+
swoole_kill(gs->manager_pid, SIGWINCH);
943940
}
944-
sw_logger()->reopen();
941+
945942
return true;
946943
}
947-
#endif
948944

949945
void Server::stop_master_thread() {
950946
Reactor *reactor = SwooleTG.reactor;
@@ -1644,11 +1640,10 @@ void Server::init_signal_handler() {
16441640
swoole_signal_set(SIGUSR1, master_signal_handler);
16451641
swoole_signal_set(SIGUSR2, master_signal_handler);
16461642
swoole_signal_set(SIGTERM, master_signal_handler);
1643+
swoole_signal_set(SIGWINCH, master_signal_handler);
16471644
#ifdef SIGRTMIN
16481645
swoole_signal_set(SIGRTMIN, master_signal_handler);
16491646
#endif
1650-
// for test
1651-
swoole_signal_set(SIGVTALRM, master_signal_handler);
16521647

16531648
if (SwooleG.signal_fd > 0) {
16541649
set_minfd(SwooleG.signal_fd);
@@ -1864,16 +1859,16 @@ void Server::master_signal_handler(int signo) {
18641859
case SIGCHLD:
18651860
serv->signal_handler_child_exit();
18661861
break;
1867-
case SIGVTALRM:
1868-
swoole_warning("SIGVTALRM coming");
1869-
break;
18701862
case SIGUSR1:
18711863
case SIGUSR2:
18721864
serv->signal_handler_reload(signo == SIGUSR1);
18731865
break;
18741866
case SIGIO:
18751867
serv->signal_handler_read_message();
18761868
break;
1869+
case SIGWINCH:
1870+
serv->signal_handler_reopen_logger();
1871+
break;
18771872
default:
18781873
#ifdef SIGRTMIN
18791874
if (signo == SIGRTMIN) {

src/server/task_worker.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,9 +233,10 @@ static void TaskWorker_signal_init(ProcessPool *pool) {
233233
}
234234
swoole_signal_set(SIGHUP, nullptr);
235235
swoole_signal_set(SIGPIPE, nullptr);
236-
swoole_signal_set(SIGUSR1, Server::worker_signal_handler);
236+
swoole_signal_set(SIGUSR1, nullptr);
237237
swoole_signal_set(SIGUSR2, nullptr);
238238
swoole_signal_set(SIGTERM, Server::worker_signal_handler);
239+
swoole_signal_set(SIGWINCH, Server::worker_signal_handler);
239240
#ifdef SIGRTMIN
240241
swoole_signal_set(SIGRTMIN, Server::worker_signal_handler);
241242
#endif

src/server/worker.cc

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ using namespace network;
2929
static int Worker_onPipeReceive(Reactor *reactor, Event *event);
3030
static void Worker_reactor_try_to_exit(Reactor *reactor);
3131

32+
static void Worker_reopen_logger() {
33+
if (sw_logger()) {
34+
sw_logger()->reopen();
35+
}
36+
}
37+
3238
void Server::worker_signal_init() {
3339
if (is_thread_mode()) {
3440
return;
@@ -37,12 +43,10 @@ void Server::worker_signal_init() {
3743
swoole_signal_set(SIGPIPE, SIG_IGN);
3844
swoole_signal_set(SIGUSR1, nullptr);
3945
swoole_signal_set(SIGUSR2, nullptr);
40-
// swSignal_set(SIGINT, Server::worker_signal_handler);
41-
swoole_signal_set(SIGTERM, Server::worker_signal_handler);
42-
// for test
43-
swoole_signal_set(SIGVTALRM, Server::worker_signal_handler);
46+
swoole_signal_set(SIGTERM, worker_signal_handler);
47+
swoole_signal_set(SIGWINCH, worker_signal_handler);
4448
#ifdef SIGRTMIN
45-
swoole_signal_set(SIGRTMIN, Server::worker_signal_handler);
49+
swoole_signal_set(SIGRTMIN, worker_signal_handler);
4650
#endif
4751
}
4852

@@ -60,20 +64,13 @@ void Server::worker_signal_handler(int signo) {
6064
sw_worker()->shutdown();
6165
}
6266
break;
63-
// for test
64-
case SIGVTALRM:
65-
swoole_warning("SIGVTALRM coming");
66-
break;
67-
case SIGUSR1:
68-
case SIGUSR2:
69-
if (sw_logger()) {
70-
sw_logger()->reopen();
71-
}
67+
case SIGWINCH:
68+
Worker_reopen_logger();
7269
break;
7370
default:
7471
#ifdef SIGRTMIN
75-
if (signo == SIGRTMIN && sw_logger()) {
76-
sw_logger()->reopen();
72+
if (signo == SIGRTMIN ) {
73+
Worker_reopen_logger();
7774
}
7875
#endif
7976
break;

0 commit comments

Comments
 (0)