dtm_master_running_flow
2016-08-03 15:29:56 0 举报
`dtm_master_running_flow` 是一个用于描述分布式事务管理器(DTM)主节点运行流程的概念。在分布式系统中,为了确保数据的一致性和完整性,通常需要使用分布式事务管理器来协调多个节点之间的事务操作。在这个过程中,`dtm_master_running_flow` 描述了主节点如何接收并处理来自各个从节点的事务请求,以及如何将这些请求转换为全局事务并在所有节点上执行。这个过程可能包括事务的提交、回滚、恢复等操作,以确保整个系统的正常运行。总之,`dtm_master_running_flow` 是分布式事务管理的关键部分,对于保证系统的稳定性和可靠性具有重要意义。
作者其他创作
大纲/内容
while 没有收到shutdown或reload的signal
将子进程在共享内存中注销
为新子进程在共享内存中登记
创建Nonblock控制Socket开始Listen
有Control指令?
从Master继承过来的所有Pipe关掉所有Master侧Pipe关掉除自己外其它所有Worker侧Pipe
复用上一个子进程的Pipe
初始化accept锁调度队列
接到controller的update通知后Worker会进行相应的操作,由文庆负责开发应该可以复用worker主循环内收到控制命令后的操作
将每个Worker进程放入accept锁调度队列
end of while
Y
N
若为Worker且当前持有accept锁强制释放并移出调度队列
向所有子进程发送shutdown信号
是否是有标记的子进程
框架调用update_new_worker函数传入新worker的通信socket,函数内部由文庆实现目的是将新worker update至可“开门接客”的最新状态
子进程收到SIGUSR1或者SIGTERM就g_gracefully_shutdown=1不再有all_finished这个条件
读取配置文件更新内存中的配置信息
对退出子进程进行收割
创建Nonblock主服务Socket开始Listen
是否有子进程退出
在g_srv-channel上阻塞等待controller的update通知
调用dtm_event_channel处理事件
绝大情况下,这个地方会simply超时,没有事件所以正常情况下,controller主要是执行的控制中心的逻辑
是否start所有子进程(Control指令之一)
收割所有退出的子进程
Master
accept出client fd设置client fd为初始值
主循环while (! (g_gracefully_shutdown == 1 && all_finished == 1) )
创建新一批子进程
将新client 和service_socket均放回epoll
清空子进程对应的Pipe两端
处理Control指令
从master继承过来的所有socket pair关掉所有worker侧socket记录与master通信的socket为master_fd
遍历本次epoll返回的ready fd
如果有更新
为每个子进程创建一副Pipe
向当前所有非Control的子进程发送shutdown信号
有超时的阻塞epoll_wait
为每个子进程在共享内存中登记
关闭g_srv=control_socket
如果是client fd
读取共享内存,更新controller维护的alive worker信息
将master中的配置中心逻辑抑制此处执行,总体思路不变每个循环,都将某一个active的action向前推进一个state
如果client fd状态机到终态,则不再放回epoll如果未到终态,则放回epoll
初始化共享内存,作用:进程间抢锁、子进程登记
每个循环后的epoll事件集合
将g_srv-channel作为EPOLLIN放入本WORKER的epoll
将自己侧Pipe标为channel
将g_srv=service_socket作为EPOLLIN放入本WORKER的epoll
向与Control相连的管道write响应
对整个进程组Nonblock地waitpid
读入配置文件将全部MySQL、Redis连接信息存入内存
主循环while (! (g_gracefully_shutdown == 1) )
每次循环都试图更新含义是保证在进行本轮配置中心或者控制指令之前拿到最新最准确的worker信息
标记当前所有非Control的子进程
是否shutdown所有子进程(Control指令之一)
子进程收到SIGUSR1或者SIGTERM就g_gracefully_shutdown=1
end of Master
初始化signal handlersSIGTERM - shutdownSIGWINCH - reloadSIGALRM - loadconf
创建全部子进程
如果收到reload信号则exec新的binary进行重启
如果为Worker则放入accept锁调度队列
当前是否没有任何子进程Control除外
如果client fd状态机到终态,则不再放回epoll如果未到终态,则放回epoll如需要操作master,通过master fd
重启一个与退出子进程同类的子进程
创建全部子进程Control除外,因为已存在
如果是g_srv-channel
向有标记的子进程(即老子进程)发送shutdown信号
这里的状态机流转由文庆负责从现有worker状态机改进本质目的是将client的请求内容解读为控制行为,并依赖我提供的controller与master/worker的通信机制来完成控制行为
关闭g_srv=service_socket
有标记的子进程说明是被Master显式有意杀死的无需重启
将g_srv=control_socket作为EPOLLIN放入本WORKER的epoll
每个client fd按照各自状态机继续流转
对已存在子进程进行标记
打开日志文件
关闭控制Socket
如果是service_socket
这里会read/write db并真正执行控制操作这里逻辑,文庆实现需要依赖我提供的controller与master/worker的通信机制来完成控制行为
是否收到loadconf的signal
执行accept调度让队列中的下一个Worker持有锁
在channel上阻塞read来自Control的通知(Control会将每一个新生的Worker更新到最新状态)
Nonblock地读与Control进程相连的管道
直接read channel根据控制命令做处理
如果是control_socket
0 条评论
下一页