ProxySQL源码分析2-Main流程

时间:2021-09-02 16:40:11   收藏:0   阅读:8

Main流程图

技术分享图片

源码

Main函数

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;
}

初始化-阶段2-not_started

void ProxySQL_Main_init_phase2___not_started()
{
    LoadPlugins();
    ProxySQL_Main_init_main_modules();
    ProxySQL_Main_init_Admin_module();
    ProxySQL_Main_init_Auth_module();
}

初始化-阶段3-start_all

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

评论(0)
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!