dtm_master_running_flow
2016-08-03 15:29:56 0 举报
`dtm_master_running_flow` 是一个流程名称,通常用于描述数据时间戳管理(DTM)的主节点正在运行的流程。在计算机系统中,DTM是一种用于同步和对齐不同数据源的时间戳的技术。主节点是指负责管理和控制整个流程的节点。 在这个流程中,主节点会执行一系列的操作,如收集来自各个数据源的时间戳信息,进行比较和校准,以确保数据的一致性和准确性。这个过程可能涉及数据的读取、转换、计算和写入等操作。 总之,`dtm_master_running_flow` 描述了数据时间戳管理的主节点正在执行的流程,旨在确保数据的同步和对齐。
作者其他创作
大纲/内容
while 没有收到shutdown或reload的signal
将子进程在共享内存中注销
为新子进程在共享内存中登记
创建Nonblock控制Socket开始Listen
有Control指令?
从Master继承过来的所有Pipe关掉所有Master侧Pipe关掉除自己外其它所有Worker侧Pipe
复用上一个子进程的Pipe
初始化accept锁调度队列
将每个Worker进程放入accept锁调度队列
end of while
Y
N
while 没有收到shutdown信号或有未处理完成请求
若为Worker且当前持有accept锁强制释放并移出调度队列
向所有子进程发送shutdown信号
是否是有标记的子进程
框架调用update_new_worker函数传入新worker的通信socket,函数内部由文庆实现目的是将新worker update至可“开门接客”的最新状态
子进程收到SIGUSR1或者SIGTERM就g_gracefully_shutdown=1不再有all_finished这个条件
读取配置文件更新内存中的配置信息
对退出子进程进行收割
创建Nonblock主服务Socket开始Listen
是否有子进程退出
调用dtm_event_channel处理事件
绝大情况下,这个地方会simply超时,没有事件所以正常情况下,controller主要是执行的控制中心的逻辑
是否start所有子进程(Control指令之一)
收割所有退出的子进程
Master
accept出client fd设置client fd为初始值
创建新一批子进程
将新client 和service_socket均放回epoll
清空子进程对应的Pipe两端
处理Control指令
从master继承过来的所有socket pair关掉所有worker侧socket记录与master通信的socket为master_fd
遍历本次epoll返回的ready fd
如果有更新
为每个子进程创建一副Pipe
将服务Socket和channel放入epoll,监听IN事件
向当前所有非Control的子进程发送shutdown信号
有超时的阻塞epoll_wait
为每个子进程在共享内存中登记
如果是client fd
读取共享内存,更新controller维护的alive worker信息
将master中的配置中心逻辑抑制此处执行,总体思路不变每个循环,都将某一个active的action向前推进一个state
如果client fd状态机到终态,则不再放回epoll如果未到终态,则放回epoll
初始化共享内存,作用:进程间抢锁、子进程登记
每个循环后的epoll事件集合
将自己侧Pipe标为channel
向与Control相连的管道write响应
对整个进程组Nonblock地waitpid
读入配置文件将全部MySQL、Redis连接信息存入内存
主循环while (! (g_gracefully_shutdown == 1) )
每次循环都试图更新含义是保证在进行本轮配置中心或者控制指令之前拿到最新最准确的worker信息
标记当前所有非Control的子进程
是否shutdown所有子进程(Control指令之一)
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 条评论
下一页