dtm_master_worker_flow_rough
2016-04-28 16:24:58   0  举报             
     
         
 dtm_master_worker_flow_rough是一种分布式计算框架,它采用了主从模式和工作流的方式。在这个框架中,有一个主节点负责协调和分配任务,多个从节点负责执行任务。主节点会根据任务的复杂程度和数据量,将任务分解成多个子任务,并将这些子任务分配给从节点。从节点在执行完子任务后,会将结果返回给主节点。主节点收集到所有从节点的结果后,再进行汇总和分析,最终得到最终结果。这种工作流的方式可以有效地提高系统的并发性和吞吐量,适用于处理大规模数据集和复杂计算任务。
    作者其他创作
 大纲/内容
 if(proc_info[i].graceful_shutdown == 1)如果是被master显式kill的
  关闭g_srv=service_socket
  Y
  将自己的channel作为EPOLLIN放入本WORKER的epoll
  如果是channel
  for 0 ~ g_srv-config-basic_config.max_threadsfork WORKER记录channeladd_accept_worker
  代码中通过声明控制action变量来注册控制action放入action_vector
  直接read channel,做处理不write back
  connect to global_config_db_node配置中心db测活
  如果是client fd
  调用dtm_event_channel处理事件
  现在的signal handler没有区分角色难道每种角色收到同样信号的处理都一样吗?难道不应该是某些信号只能给worker发不能给master发以免无操作吗?
  N
  将proc_info中现有所有子进程均标记为graceful_shutdown=1,包括worker和func
  epid  0
  创建g_srv
  遍历proc_info,向所有子进程均发送kill SIGTERMprocess_type = -1process_num = 0
  将master中的配置中心逻辑抑制此处执行,总体思路不变每个循环,都将某一个active的action向前推进一个state
  如果是control_socket
  每个client fd按照各自状态机继续流转
  将g_srv=service_socket作为EPOLLIN放入本WORKER的epoll
  初始化signal handlers
  创建g_srv-control_socket
  有超时的阻塞epoll_wait
  初始化shm
  return
  这里会read/write db并真正执行控制操作这里逻辑,文庆实现需要依赖我提供的controller与master/worker的通信机制来完成控制行为
  子进程收到SIGUSR1或者SIGTERM就g_gracefully_shutdown=1
  每个循环后的epoll事件集合
  g_gracefullly_child_shutdown = 1
  直接write给各个worker的channel不再read
  绝大情况下,这个地方会simply超时,没有事件所以正常情况下,controller主要是执行的控制中心的逻辑
  遍历本次epoll返回的ready fd
  将新client 和service_socket均放回epoll
  更新conf_modify_time读取config
  这里不关闭channeldel accept和设置shutdown=0wait到了再做这些
  reload_dtm
  for 0 ~ func_process[i]  LOCKGUARD_PROCESSfork FUNC新增一个CONTROL_PROCESS角色记录master侧的channel
  如果client fd状态机到终态,则不再放回epoll如果未到终态,则放回epoll
  子进程收到SIGUSR1或者SIGTERM就g_gracefully_shutdown=1不再有all_finished这个条件
  while (g_gracefully_shutdown == 0)
  主循环while (! (g_gracefully_shutdown == 1) )
  将proc_info中现有所有子进程均kill SIGUSR1,包括worker和funcprocess_type = -1process_num = 0
  遍历proc_info寻找是否dead child是哪个子进程
  for 0 ~ func_process[i]  LOCKGUARD_PROCESSfork FUNC记录channel
  WIFSIGNALED(statloc)如果是被信号干掉的child,log一下继续
  将proc_info中现有所有graceful_shutdown=0的子进程均kill SIGUSR1,均标记为graceful_shutdown=1
  关闭g_srv=control_socket
  子进程收到SIGTERM就g_gracefully_shutdown=1
  g_gracefully_reload == 1
  for 0 ~ g_srv-config-basic_config.max_threadsfork WORKER记录master侧的channeladd_accept_worker
  将g_srv=control_socket作为EPOLLIN放入本WORKER的epoll
  del_accept_worker(epid);
  1 == g_gracefully_loadconf
  此时新老子进程均在proc_info里面均与master有channel均在accept队列里面
  记录自己的channel关掉master侧用的channel
  关掉从master处继承的所有与其他worker通信的channel
  遍历proc_info当前所有子进程如果仍有alive且shutdown=0的,则什么都不做,否则:
  这里不再wait所有worker真的退出吗?
  accept出client fd设置client fd为初始值
  初始化proc_info数组包括每个channel
  子进程收到SIGUSR1就g_gracefully_shutdown=1
  更新conf_modify_time重新load_config_from_file
  init_accept_manager
  dtm_unlock_mutexes(epid);
  主循环while (! (g_gracefully_shutdown == 1 && all_finished == 1) )
  sleep 100ms
  dtm_config_action_manager::manager_run每次执行要么当前cur_action的action要么新设action的preaction每次执行都read db获取每个action的执行phase每次执行都write db更新每个action的执行phase
  channel的另一端因为child死掉而closeonexec但是我们这边的channel因为没有exec而没有close不需要显示close吗?会浪费fd,socketpair的系统资源也不会释放
  reset proc_info[i]不会重启,不会close channel直接置为-1
  这里的状态机流转由文庆负责从现有worker状态机改进本质目的是将client的请求内容解读为控制行为,并依赖我提供的controller与master/worker的通信机制来完成控制行为
  end of while
  如果是service_socket
  创建g_srv-service_socket
  不是worker也执行这个,好吗?
  accept_worker_manager由master来均匀调度哪个worker来持有accept锁
  g_gracefullly_child_start = 1
   
 
 
 
 
  0 条评论
 下一页
 为你推荐
 查看更多
    
   
   
   
   
   
  
  
  
  
  
  
  
  
 