本文结论
- 写流程
- rbd_open获取ImageCtx,获取过程中根据配置注册队列、cache、journal等。
- 使用ImageCtx调用写接口,IO入队。
- IO出队,抢exclusive-lock。
- 根据stripe_unit、stripe_num、order配置计算写入的rados对象。
- 写rados对象。
- 若打开cache功能,写cache
- 若能写cache,直接写cache后返回,脏数据后台刷盘。
- 若不能写cache,依次写journal、写librados后返回。
- 若未打开cache功能,跳过写cache
- 若打开journal功能,写journal后继续写librados。
- 写librados后返回。
- 若打开cache功能,写cache
写流程
入队
rbd_aio_write
ImageRequestWQ<I>::aio_write // 执行异步写,这里的ImageRequestWQ,是ImageCtx中已经获取的。
ImageRequestWQ<I>::queue // 加入队列
ThreadPool::PointerWQ<ImageDispatchSpec<I> >::queue // 加入线程池中队列
ThreadPool::PointerWQ<ImageDispatchSpec<I> >::_void_dequeue // 从线程池中出队
ImageRequestWQ<I>::_void_dequeue // 出队
ImageRequestWQ<I>::is_lock_required // 判断是否已经获取到锁
AsyncOperation::start_op
ImageRequestWQ<I>::process
出队抢exclusive-lock
抢锁流程详见