1:入口为:queue_transactions,会传入一个事务列表
2:根据事务列表,创建一个txc,事务上下文
3:每个事务可能有多个op,存放在Transaction的op_bl字段中。op的数据存放在data_bl_p
4:通过oid获取onode
5:调用BlueStore::_write(TransContext * txc, CollectionRef & c, OnodeRef & o, uint64_t offset, size_t length, bufferlist & bl, uint32_t,fadvise_flags)
5:调用BlueStore::__do_write函数,创建一个wctx
6:调用_do_write_data根据min_alloc_size开始拆分大小写
1)大写:首先摘除冲突的blob挂到wctx->old_extents,根据extent_map查找可用的blob,如果没有新建一个,写入wctx->writes数组
2)小写:1:根据extent_map查找可用的blob,存储存在可以用的unuse,如果小于prefer_deferred_size,强制deferred,否则KernelDevice::aio_write,写入ioc->pending_aios
2:blob部分数据存在,同步的方式读取数据,将数据写入deferred。
3:新写数据的offset和end判断blob是否可用复用,可用复用,将blob写入wctx->writes数组
BlueStore写流程
最新推荐文章于 2023-10-30 10:54:49 发布