源码
int main_test(int argc, const char *argv[])
{
// 初始化全局变量GloVar
ProxySQL_Main_process_global_variables(argc, argv);
// 初始化SSL模块
ProxySQL_Main_init_SSL_module();
// daemon_fork进程
if (GloVars.global.foreground == false)
{
ProxySQL_daemonize_phase1((char *)argv[0]);
/* Do the fork */
if ((pid = daemon_fork()) < 0)
{ /* Exit on error */
daemon_retval_done();
exit(EXIT_FAILURE);
}
else if (pid)
{ /* The parent */
ProxySQL_daemonize_wait_daemon();
}
else
{ /* The daemon */
cpu_timer t;
GloVars.global.start_time = monotonic_time();
GloVars.install_signal_handler();
if (ProxySQL_daemonize_phase2() == false)
{
goto finish;
}
}
}
__start_label:
// 初始化-阶段2-not_started
ProxySQL_Main_init_phase2___not_started();
// 初始化-阶段3-start_all
ProxySQL_Main_init_phase3___start_all();
// 处理threads_missing_heartbeat
{
while (glovars.shutdown == 0)
{
if (GloMTH)
{
if (GloMTH->mysql_threads)
{
for (i = 0; i < GloMTH->num_threads; i++)
{
if (GloMTH->mysql_threads[i].worker)
{
atomic_curtime = GloMTH->mysql_threads[i].worker->atomic_curtime;
// 判断进程heartbeat
if (curtime > atomic_curtime + poll_timeout)
{
threads_missing_heartbeat++;
}
}
}
}
if (threads_missing_heartbeat)
{
missed_heartbeats++;
if (missed_heartbeats >= (unsigned int)GloVars.restart_on_missing_heartbeats)
{
// 如果配置进程hangs重启,则重启ProxySQL
if (GloVars.restart_on_missing_heartbeats)
{
proxy_error("Watchdog: reached %u missed heartbeats. Aborting!\n", missed_heartbeats);
proxy_error("Watchdog: see details at https://github.com/sysown/proxysql/wiki/Watchdog\n");
assert(0);
}
}
}
}
}
}
__shutdown:
// 初始化-阶段4-shutdown
UnloadPlugins();
ProxySQL_Main_init_phase4___shutdown();
return 0;
}
void ProxySQL_Main_init_phase2___not_started()
{
LoadPlugins();
ProxySQL_Main_init_main_modules();
ProxySQL_Main_init_Admin_module();
ProxySQL_Main_init_Auth_module();
}
void ProxySQL_Main_init_phase3___start_all()
{
GloMyMon = new MySQL_Monitor();
// load all mysql servers to GloHGH
{
GloAdmin->init_mysql_servers();
GloAdmin->init_proxysql_servers();
GloAdmin->load_scheduler_to_runtime();
GloAdmin->proxysql_restapi().load_restapi_to_runtime();
}
ProxySQL_Main_init_Query_module();
ProxySQL_Main_init_MySQL_Threads_Handler_module();
ProxySQL_Main_init_Query_Cache_module();
GloMTH->start_listeners();
ProxySQL_Main_init_MySQL_Monitor_module();
}
原文:https://www.cnblogs.com/Alpes/p/15218068.html