MySql Slave Io_Thread Start 二

调试环境和具体的截图请看MySql Slave Io_Thread Start 一,本章节主要描述数据库是如何建立与master建立连接的
https://blog.csdn.net/m0_37895458/article/details/115129978
数据库的统一入口函数是mysqld_main,客户端向服务端发起申请,会通过handle_connections_sockets为新的连接分配线程进行处理。
分配过程中涉及到io多路复用技术,感兴趣的可以自行百度。
handle_connections_sockets创建新的线程来处理传入的连接,此处涉及到一个大家比较常见的变量max_connections,判断逻辑如下:
创建的连接总数大于等于max_connections+1将不在分配新的连接,客户端会提示Too many connections错误
if (connection_count >= max_connections + 1 || abort_loop)
{
mysql_mutex_unlock(&LOCK_connection_count);

DBUG_PRINT("error",("Too many connections"));

}

在宏定义中,定义了如下结构体,结构体中是操作线程时使用的函数
struct scheduler_functions
{
uint max_threads;
bool (*init)(void);
bool (*init_new_connection_thread)(void);
void (*add_connection)(THD *thd);
void (*thd_wait_begin)(THD *thd, int wait_type);
void (*thd_wait_end)(THD *thd);
void (*post_kill_notification)(THD *thd);
bool (*end_thread)(THD *thd, bool cache_thread);
void (*end)(void);
};

在创建新的连接的时候会进行回调
static void create_new_thread(THD *thd)
{

MYSQL_CALLBACK(thread_scheduler, add_connection, (thd));

}

thread_scheduler是一个scheduler_functions类型的指针型变量,从截图中看到,传递add_connection回调的函数
是create_thread_to_handle_connection
在这里插入图片描述

伪代码如下:
/*
Scheduler that uses one thread per connection
*/

void create_thread_to_handle_connection(THD *thd)
{

if ((error= mysql_thread_create(key_thread_one_connection,
                                &thd->real_id, &connection_attrib,
                                handle_one_connection,
                                (void*) thd)))
{

}

}

创建线程的时候会调用handle_one_connection为连接提供处理线程。
pthread_handler_t handle_one_connection(void *arg)
{
THD thd= (THD) arg;

mysql_thread_set_psi_id(thd->thread_id);

do_handle_one_connection(thd);
return 0;
}
实际操作是在do_handle_one_connection函数中完成。从线程12的堆栈调用过程中不能发现,我在客户端发送的请求,会进入到do_command进行处理。
do_command函数通过my_net_read函数读取客户端或者服务端发送过来的packet。

因为调用的是connection-level (COM_XXXX) 级别的命令,需要调用dispatch_command函数进行处理,dispatch_command函数处理的命令如下:
enum enum_server_command
{
COM_SLEEP, COM_QUIT, COM_INIT_DB, COM_QUERY, COM_FIELD_LIST,
COM_CREATE_DB, COM_DROP_DB, COM_REFRESH, COM_SHUTDOWN, COM_STATISTICS,
COM_PROCESS_INFO, COM_CONNECT, COM_PROCESS_KILL, COM_DEBUG, COM_PING,
COM_TIME, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP,
COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE,
COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_SEND_LONG_DATA, COM_STMT_CLOSE,
COM_STMT_RESET, COM_SET_OPTION, COM_STMT_FETCH, COM_DAEMON,
COM_BINLOG_DUMP_GTID,
/* don’t forget to update const char *command_name[] in sql_parse.cc */

/* Must be last */
COM_END
};

调用net_write_packet向网络处理器写一个MySQL协议包。通过inline_mysql_socket_send发送写好的协议包。梳理mysqld_main函数发现
创建完线程后可以调用init_slave(),init_slave函数调用start_slave_threads创建一个slave线程,start_slave_threads调用start_slave_thread
启动一个slave线程,启动参数中调用handle_slave_io入口函数中的safe_connect,通过connect_to_master函数建立与master的连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值