sd_create_hyper_volume--->opcode:SD_OP_NEW_VDI
exec_local_req
submit_local_request--->添加req到sys->local_req_queue
|
|
V
local_req_handler--->处理本地消息
queue_request--->根据Op Type选择处理方式
queue_cluster_request--->调用cluster driver(zookeeper)来全局发送消息
sys->cdrv->block<--->zk_block
add_event--->type:EVENT_BLOCK
zk_queue_push
zk_create_seq_node--->添加zk事件,事件序号单调增加
|
|
|
V
zk_event_handler--->调用zk_event_handlers
zk_handle_block--->取出头结点的请求,在有unblock到来之前这个请求不从链表上摘除
sd_block_handler--->非本节点处理的消息直接返回,注册操作函数do_process_work和cluster_op_done,
设置cluster_op_running为true,保证阻塞的请求串行执行
queue_work--->将req消息添加到sys->block_wqueue,唤醒工作线程
|
|
|
V
-------worker_routine--->工作线程回调函数,完成后添加到finished_list中
| work->fn(work)<---->do_process_work
| req->op->process_work(req)<--->cluster_new_vdi
| vdi_create--->获取可用vid,创建vdi
|
|------>worker_thread_request_done处理finished_list上的任务
work->done(work)<---->cluster_op_done
prepare_cluster_msg--->构建需要发送的消息
sys->cdrv->unblock<---->zk_unblock
add_event--->添加EVENT_UNBLOCK事件,发送构建的消息
|
|
|
V
zk_event_handler--->调用zk_event_handlers
zk_handle_unblock
sd_notify_handler--->本节点消息req需要put,非本节点消息进行main处理,设置sd_notify_handler为false
do_process_main--->调用注册的main函数
op->process_main<---->post_cluster_new_vdi
atomic_set_bit(nr, sys->vdi_inuse)--->成功时将相应的位置位
exec_local_req
submit_local_request--->添加req到sys->local_req_queue
|
|
V
local_req_handler--->处理本地消息
queue_request--->根据Op Type选择处理方式
queue_cluster_request--->调用cluster driver(zookeeper)来全局发送消息
sys->cdrv->block<--->zk_block
add_event--->type:EVENT_BLOCK
zk_queue_push
zk_create_seq_node--->添加zk事件,事件序号单调增加
|
|
|
V
zk_event_handler--->调用zk_event_handlers
zk_handle_block--->取出头结点的请求,在有unblock到来之前这个请求不从链表上摘除
sd_block_handler--->非本节点处理的消息直接返回,注册操作函数do_process_work和cluster_op_done,
设置cluster_op_running为true,保证阻塞的请求串行执行
queue_work--->将req消息添加到sys->block_wqueue,唤醒工作线程
|
|
|
V
-------worker_routine--->工作线程回调函数,完成后添加到finished_list中
| work->fn(work)<---->do_process_work
| req->op->process_work(req)<--->cluster_new_vdi
| vdi_create--->获取可用vid,创建vdi
|
|------>worker_thread_request_done处理finished_list上的任务
work->done(work)<---->cluster_op_done
prepare_cluster_msg--->构建需要发送的消息
sys->cdrv->unblock<---->zk_unblock
add_event--->添加EVENT_UNBLOCK事件,发送构建的消息
|
|
|
V
zk_event_handler--->调用zk_event_handlers
zk_handle_unblock
sd_notify_handler--->本节点消息req需要put,非本节点消息进行main处理,设置sd_notify_handler为false
do_process_main--->调用注册的main函数
op->process_main<---->post_cluster_new_vdi
atomic_set_bit(nr, sys->vdi_inuse)--->成功时将相应的位置位