Skip to content

Commit 3931598

Browse files
authored
implement special pre-fork run once mode (#1349)
1 parent d331e9c commit 3931598

4 files changed

Lines changed: 28 additions & 23 deletions

File tree

server/database-drivers/adaptor.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
class PhpWorker;
2424
struct net_event_t;
2525
struct external_driver_connect;
26-
void generic_event_loop(WorkerType, bool) noexcept;
26+
void generic_event_loop(WorkerType, bool, bool) noexcept;
2727
void php_worker_run_net_queue(PhpWorker *);
2828
bool process_net_event(net_event_t *);
2929
// endregion
@@ -104,7 +104,7 @@ class Adaptor : vk::not_copyable {
104104
friend struct ::external_driver_connect;
105105

106106
void create_outbound_connections() noexcept;
107-
friend void ::generic_event_loop(WorkerType, bool) noexcept;
107+
friend void ::generic_event_loop(WorkerType, bool, bool) noexcept;
108108

109109
void process_external_db_request_net_query(std::unique_ptr<Request> &&request) noexcept;
110110
friend void ::php_worker_run_net_queue(PhpWorker *);

server/php-engine-vars.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ int master_pid = -1;
2727
ProcessType process_type = ProcessType::master;
2828

2929
int master_flag = 0; // 1 -- master, 0 -- single process, -1 -- child
30-
30+
bool run_once_prefork_mode = false;
3131
bool run_once = false;
3232
int run_once_return_code = 0;
3333

server/php-engine-vars.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ extern int master_pid;
3737
extern ProcessType process_type;
3838

3939
extern int master_flag;
40-
40+
extern bool run_once_prefork_mode;
4141
extern bool run_once;
4242
extern int run_once_return_code;
4343

server/php-engine.cpp

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,7 +1437,7 @@ void reopen_json_log() {
14371437
}
14381438
}
14391439

1440-
void generic_event_loop(WorkerType worker_type, bool init_and_listen_rpc_port) noexcept {
1440+
void generic_event_loop(WorkerType worker_type, bool init_and_listen_rpc_port, bool invoke_dummy_self_rpc_request) noexcept {
14411441
if (master_flag && logname_pattern != nullptr) {
14421442
reopen_logs();
14431443
reopen_json_log();
@@ -1468,24 +1468,24 @@ void generic_event_loop(WorkerType worker_type, bool init_and_listen_rpc_port) n
14681468
if (rpc_sfd >= 0) {
14691469
init_listening_connection(rpc_sfd, &ct_php_engine_rpc_server, &rpc_methods);
14701470
}
1471+
}
14711472

1472-
if (run_once) {
1473-
int pipe_fd[2];
1474-
pipe(pipe_fd);
1473+
if (invoke_dummy_self_rpc_request) {
1474+
int pipe_fd[2];
1475+
pipe(pipe_fd);
14751476

1476-
int read_fd = pipe_fd[0];
1477-
int write_fd = pipe_fd[1];
1477+
int read_fd = pipe_fd[0];
1478+
int write_fd = pipe_fd[1];
14781479

1479-
rpc_client_methods.rpc_ready = nullptr;
1480-
epoll_insert_pipe(pipe_for_read, read_fd, &ct_php_rpc_client, &rpc_client_methods);
1480+
rpc_client_methods.rpc_ready = nullptr;
1481+
epoll_insert_pipe(pipe_for_read, read_fd, &ct_php_rpc_client, &rpc_client_methods);
14811482

1482-
int q[6];
1483-
int qsize = 6 * sizeof(int);
1484-
q[2] = TL_RPC_INVOKE_REQ;
1485-
for (int i = 0; i < run_once_count; i++) {
1486-
prepare_rpc_query_raw(i, q, qsize, crc32c_partial);
1487-
assert (write(write_fd, q, (size_t)qsize) == qsize);
1488-
}
1483+
int q[6];
1484+
int qsize = 6 * sizeof(int);
1485+
q[2] = TL_RPC_INVOKE_REQ;
1486+
for (int i = 0; i < run_once_count; i++) {
1487+
prepare_rpc_query_raw(i, q, qsize, crc32c_partial);
1488+
assert(write(write_fd, q, (size_t)qsize) == qsize);
14891489
}
14901490
}
14911491

@@ -1633,7 +1633,7 @@ void start_server() {
16331633
}
16341634

16351635
worker_global_init(worker_type);
1636-
generic_event_loop(worker_type, !master_flag);
1636+
generic_event_loop(worker_type, !master_flag, run_once || run_once_prefork_mode);
16371637
}
16381638

16391639
void set_instance_cache_memory_limit(size_t limit);
@@ -2454,9 +2454,14 @@ int run_main(int argc, char **argv, php_mode mode) {
24542454
parse_main_args(argc, argv);
24552455

24562456
if (run_once) {
2457-
master_flag = 0;
2458-
rpc_port = -1;
2459-
setvbuf(stdout, nullptr, _IONBF, 0);
2457+
if (master_flag) {
2458+
kprintf("running in special run once pre-fork mode\n");
2459+
run_once_prefork_mode = true;
2460+
} else {
2461+
master_flag = 0;
2462+
rpc_port = -1;
2463+
setvbuf(stdout, nullptr, _IONBF, 0);
2464+
}
24602465
}
24612466

24622467
if (!master_flag && vk::singleton<HttpServerContext>::get().http_server_enabled()) {

0 commit comments

Comments
 (0)