dtm_master_running_flow
2016-08-03 15:29:56 0 举报
dtm_master_running_flow 是一个关键流程,用于确保数据传输的高效和准确。该流程由数据转换主进程(DTM)负责,主要包含以下步骤:首先,主进程会启动并初始化所有必要的组件;然后,它会检查数据的质量和完整性,对不完整的或质量不佳的数据进行清洗和修复;接下来,主进程会将数据转换为预定的格式,以便于后续的处理和分析;最后,主进程会监控整个转换过程,确保数据的安全和稳定传输。这个流程是数据处理的核心环节,对于保证数据的准确性和可用性至关重要。
作者其他创作
大纲/内容
while 没有收到shutdown或reload的signal
将子进程在共享内存中注销
为新子进程在共享内存中登记
创建Nonblock控制Socket开始Listen
有Control指令?
复用上一个子进程的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
从master继承过来的所有socket pair关掉所有master侧socket记录自己对应的socket为g_srv-channel关掉其它所有worker侧socket
是否有子进程退出
在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
将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按照各自状态机继续流转
对已存在子进程进行标记
打开日志文件
如果是service_socket
这里会read/write db并真正执行控制操作这里逻辑,文庆实现需要依赖我提供的controller与master/worker的通信机制来完成控制行为
是否收到loadconf的signal
执行accept调度让队列中的下一个Worker持有锁
Nonblock地读与Control进程相连的管道
直接read channel根据控制命令做处理
如果是control_socket
0 条评论
下一页