关闭

sheepdog创建vdi流程

185人阅读 评论(0) 收藏 举报
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)--->成功时将相应的位置位
                                
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:225次
    • 积分:21
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档