cello monitor实现

在collector.cpp的main函数里面会启动一个Monitor线程,这个线程的入口是Monitor的Entry(),主要做的事情就是从自身的m_queue阻塞队列里面取出机器(是由Monitor::AddEvent在接收心跳时放入),然后调用ForwardEvent,该函数找到这个机器上报的所有executor的状态,在相应的Framework(与Scheduler中的Framework不是一个函数)中找:

1)如果有,调用相应Framework::AddEvent函数。

2)如果没有,就新建一个Framework插入池中(这里初始化了FrameworkInMachine的结构),(是因为Scheduler和Collector是分开进程导致的)。并调用Framework::AddEvent函数,然后把调用Framework::Start函数,将这个Framework线程启动起来(应该是作为framework的整体触发器的线程),这个函数创建了一个CpuTrigger,加入到m_trigger_list中,最后启动一个Framework::Entry线程。

其中Framework::AddEvent函数:

1.如果这个Machine不在这个Framework中,就创建一个ExecutorInMachine结构,并放入m_executor_pool中,并创建  一个Idle Trigger给这个executor,再将这个Trigger加入到这个Framework的m_trigger__mlist中去(这个是为单个Executor的Trigger)。

2.然后将这个ExecutorStat加入到自身的m_queue中去。(为了Framework整体的Trigger),这个m_queue中的东西是在Framework::Entry中被pop出来处理的。

其中Framework::Entry函数:

 周期的从m_queue(所有的ExecutorState)里面取出ExecutorState, 将取出的ExecutorState加入相应FrameworkInMachine中的ExecutorInMachine的m_resource_list中去,该list记录了这个executor所有的状态(我要不要自己弄一个环形的buffer?),调用m_trigger_list的Map,该函数使trigger开始工作和Flush函数,去除没有用的trigger

原文地址:https://www.cnblogs.com/zhangzhang/p/2938184.html