编程技术分享

  • 首页
  1. 首页
  2. MySQL
  3. 正文

MySQL源码分析系列2——启动流程

2021年12月25日 26816点热度 0人点赞 0条评论

以下介绍服务启动调用流程及注释

//文件main.cc
int main(int argc, char **argv)
{
  return mysqld_main(argc, argv);
}
//文件mysqld.cc
int mysqld_main(int argc, char **argv) {
    ...
    //初始化
    my_init()
    //启动服务
    mysql_service(NULL);
    ...
}
//文件mysqld.cc
int mysql_service(void *p) {
    ...
    win_main(Service.my_argc, Service.my_argv);
    ...
}
//文件mysqld.cc
int win_main(int argc, char **argv) {
    ...
    //加载参数,加载顺序:先加载配置文件,后加载命令行参数,命令行参数会覆盖配置文件相同参数
    load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv)
    ...
    //启动监听线程
    setup_conn_event_handler_threads();
    ...
}
//文件mysqld.cc
void setup_conn_event_handler_threads() {
    ...
    //创建监听线程,启动函数为socket_conn_event_handler
    int error= mysql_thread_create(key_thread_handle_con_sockets,
                                   &hThread, &connection_attrib,
                                   socket_conn_event_handler,
                                   mysqld_socket_acceptor);
    ...
    //主线程等待监听线程退出
}
//文件mysqld.cc
extern "C" void *socket_conn_event_handler(void *arg) {
    ...
    //进入等待连接循环
    conn_acceptor->connection_event_loop();
    ...
}
//文件connection_acceptor.h
//监听线程循环等待连接请求
void connection_event_loop() {
    ...
    while (!abort_loop) {
        //等待连接请求,调用socket_connection.cc中函数listen_for_connection_event,使用poll或select等待连接
        Channel_info *channel_info= m_listener->listen_for_connection_event();
        //处理新请求
        mgr->process_new_connection(channel_info);
    }
}
//文件connection_handler_manager.cc
void Connection_handler_manager::process_new_connection(Channel_info* channel_info) {
    ...
    //根据参数--thread-handling调用不同处理函数,默认是one-thread-per-connection,即每个连接一个线程,会调用connection_handler_per_thread.cc中函数add_connection
    m_connection_handler->add_connection(channel_info)
    ...
}
//文件connection_handler_per_thread.cc
bool Per_thread_connection_handler::add_connection(Channel_info* channel_info) {
    ...
    //创建线程处理连接
    error= mysql_thread_create(key_thread_one_connection, &id,
                             &connection_attrib,
                             handle_connection,
                             (void*) channel_info);
    ...
}
//文件connection_handler_per_thread.cc
extern "C" void *handle_connection(void *arg) {
    ...
    //循环处理命令
    for (;;) {
        ...
        //处理登录
        thd_prepare_connection(thd)
        //处理命令
        while (thd_connection_alive(thd))
        {
            if (do_command(thd))
                break;
        }
        ...
    }
    ...
}

 

标签: 暂无
最后更新:2022年8月12日

jemuel

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论
最新 热点 随机
最新 热点 随机
Volcano源码分析系列—调度篇 K8S源码分析系列1—搭建K8S调试集群 K8S Controller开发 6.5840 Lab 1: MapReduce MongoDB源码分析系列1——编译环境搭建 GraphQL介绍及使用
Java热更新 Golang优先级调度 K8S源码分析系列1—搭建K8S调试集群 MySQL源码分析系列3——登录协议解析 Java Profile 大数据平台之binlog采集方案

COPYRIGHT © 2021 www.miaozhouguang.com. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

粤ICP备2022006024号

粤公网安备 44030602006568号