ceph I/O 路径 -- rbd 写

本文详细介绍了 RADOS Block Device (RBD) 中异步 I/O (AIO) 的写操作流程,包括从用户调用 ssize_trbd_write2 开始到最终向 RADOS 发送写请求的整个过程。涉及 AioImageRequestWQ 类的 write 方法、AioImageWrite 对象的创建及发送等关键步骤。

ssize_t rbd_write2(rbd_image_t image, uint64_t ofs, size_t len, const char *buf, int op_flags)
        int r = ictx->aio_work_queue->write(ofs, len, buf, op_flags);[ ssize_t AioImageRequestWQ::write(uint64_t off, uint64_t len, const char *buf, int op_flags) ]
                aio_write(c, off, len, buf, op_flags, false);[ void AioImageRequestWQ::aio_write(AioCompletion *c, uint64_t off, uint64_t len, const char *buf, int op_flags, bool native_async) ]
                        queue(new AioImageWrite<>(m_image_ctx, c, off, len, buf, op_flags));
                        AioImageRequest<>::aio_write(&m_image_ctx, c, off, len, buf, op_flags);



void AioImageRequest<I>::send()
        send_request();[ void AbstractAioImageWrite<I>::send_request() ]
                Striper::file_to_extents(cct, image_ctx.format_string, &image_ctx.layout, extent.first, extent.second, 0, object_extents);
                send_object_requests(object_extents, snapc, (journaling ? &requests : nullptr));[ void AioImageWrite<I>::send_object_requests(const ObjectExtents &object_extents, const ::SnapContext &snapc, AioObjectRequests *aio_object_requests) ]
                        AbstractAioImageWrite<I>::send_object_requests(object_extents, snapc, aio_object_requests);
                                AioObjectRequestHandle *request = create_object_request(*p, snapc, req_comp);
                                request->send();




void AbstractAioObjectWrite::send()
        send_write();[ void AbstractAioObjectWrite::send_write() ]
                send_pre_object_map_update();[ void AbstractAioObjectWrite::send_pre_object_map_update() ]



int librados::IoCtx::aio_operate(const std::string& oid, AioCompletion *c, librados::ObjectWriteOperation *o)
        return io_ctx_impl->aio_operate(obj, &o->impl->o, c->pc, io_ctx_impl->snapc, 0);[ int librados::IoCtxImpl::aio_operate(const object_t& oid, ::ObjectOperation *o, AioCompletionImpl *c, const SnapContext& snap_context, int flags) ]
                Objecter::Op *op = objecter->prepare_mutate_op(oid, oloc, *o, snap_context, ut, flags, onack, &c->objver);
                objecter->op_submit(op, &c->tid);[ void Objecter::op_submit(Op *op, ceph_tid_t *ptid, int *ctx_budget) ]
                        _op_submit_with_budget(op, rl, ptid, ctx_budget);[ void Objecter::_op_submit_with_budget(Op *op, shunique_lock& sul, ceph_tid_t *ptid, int *ctx_budget) ]
                                _op_submit(op, sul, ptid);[ void Objecter::_op_submit(Op *op, shunique_lock& sul, ceph_tid_t *ptid) ]
                                        bool check_for_latest_map = _calc_target(&op->target) == RECALC_OP_TARGET_POOL_DNE;[ int Objecter::_calc_target(op_target_t *t, bool any_change) ]



bool AbstractAioObjectWrite::should_complete(int r)
        send_write_op();[ void AbstractAioObjectWrite::send_write_op() ]
                int r = m_ictx->data_ctx.aio_operate(m_oid, rados_completion, &m_write, m_snap_seq, m_snaps, flags);[ int librados::IoCtx::aio_operate(const std::string& oid, AioCompletion *c, librados::ObjectWriteOperation *o, snap_t snap_seq, std::vector<snap_t>& snaps, int flags) ]

[root@compute1 yum.repos.d]# systemctl status libvirtd ● libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled) Active: active (running) since 日 2025-11-09 14:05:39 CST; 7h ago Docs: man:libvirtd(8) https://libvirt.org Main PID: 53932 (libvirtd) Tasks: 19 (limit: 32768) CGroup: /system.slice/libvirtd.service ├─53932 /usr/sbin/libvirtd ├─54057 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper └─54058 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper 11月 09 20:12:24 compute1 libvirtd[53932]: 2025-11-09 12:12:24.761+0000: 53932: error : virNetSocketReadWire:1806 : 读取数据时进入文件终点: 输入/输出错误 11月 09 20:29:31 compute1 libvirtd[53932]: 2025-11-09 12:29:31.927+0000: 53937: error : virSecretLookupParseSecret:88 : XML 错误:invalid secret uuid '123456' 11月 09 20:37:32 compute1 libvirtd[53932]: 2025-11-09 12:37:32.636+0000: 53937: error : virSecretLookupParseSecret:88 : XML 错误:invalid secret uuid '123456' 11月 09 20:39:18 compute1 libvirtd[53932]: 2025-11-09 12:39:18.314+0000: 53941: error : virSecretLookupParseSecret:88 : XML 错误:invalid secret uuid '123456' 11月 09 20:47:28 compute1 libvirtd[53932]: 2025-11-09 12:47:28.445+0000: 53935: error : virSecretLookupParseSecret:88 : XML 错误:invalid secret uuid '123456' 11月 09 20:49:15 compute1 libvirtd[53932]: 2025-11-09 12:49:15.961+0000: 53940: error : virSecretLookupParseSecret:88 : XML 错误:invalid secret uuid '123456' 11月 09 20:51:56 compute1 libvirtd[53932]: 2025-11-09 12:51:56.967+0000: 53932: error : virNetSocketReadWire:1806 : 读取数据时进入文件终点: 输入/输出错误 11月 09 20:52:17 compute1 libvirtd[53932]: 2025-11-09 12:52:17.437+0000: 53932: error : virNetSocketReadWire:1806 : 读取数据时进入文件终点: 输入/输出错误 11月 09 20:53:25 compute1 libvirtd[53932]: 2025-11-09 12:53:25.882+0000: 53942: error : virSecretLookupParseSecret:88 : XML 错误:invalid secret uuid '123456' 11月 09 21:11:29 compute1 libvirtd[53932]: 2025-11-09 13:11:29.556+0000: 53940: error : virSecretLookupParseSecret:88 : XML 错误:invalid secret uuid '123456' 怎么解决
最新发布
11-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值