From 7fea0297ad87627900a3acd2a3ae032420d8f55f Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Mon, 7 Apr 2025 04:50:58 +0000 Subject: [PATCH] client: correctly account for Client::WriteEncMgr() ref counts Signed-off-by: Venky Shankar --- src/client/Client.cc | 23 +++++++++++++++++------ src/client/Client.h | 6 ++++-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 609a1aefd53f1..949a4ff3035e6 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -12262,6 +12262,7 @@ int Client::WriteEncMgr::init() int Client::WriteEncMgr::read_async(uint64_t off, uint64_t len, bufferlist *bl, iofinish_method_ctx *ioctx) { + ldout(cct, 10) << __func__ << dendl; get(); if (off >= in->size) { @@ -12282,7 +12283,11 @@ int Client::WriteEncMgr::read_async(uint64_t off, uint64_t len, bufferlist *bl, int Client::WriteEncMgr::read_modify_write(Context *_iofinish) { - iofinish = _iofinish; + get(); + iofinish = new LambdaContext([this, _iofinish](int r) { + this->put(); + _iofinish->complete(r); + }); if (!denc) { return do_write(); @@ -12370,6 +12375,7 @@ done: void Client::WriteEncMgr::finish_read_start(int r) { ceph_assert(ceph_mutex_is_locked_by_me(clnt->client_lock)); + ldout(cct, 10) << __func__ << dendl; if (r >= 0) { std::lock_guard l{lock}; @@ -12407,6 +12413,7 @@ void Client::WriteEncMgr::finish_read_start(int r) void Client::WriteEncMgr::finish_read_end(int r) { ceph_assert(ceph_mutex_is_locked_by_me(clnt->client_lock)); + ldout(cct, 10) << __func__ << dendl; if (r >= 0) { std::lock_guard l{lock}; @@ -12424,6 +12431,7 @@ void Client::WriteEncMgr::finish_read_end(int r) bool Client::WriteEncMgr::do_try_finish(int r) { ceph_assert(ceph_mutex_is_locked_by_me(clnt->client_lock)); + ldout(cct, 10) << __func__ << dendl; if (!aioc.is_complete()) { return false; @@ -12447,7 +12455,6 @@ bool Client::WriteEncMgr::do_try_finish(int r) update_write_params(); r = do_write(); - return true; } @@ -12460,6 +12467,7 @@ void Client::WriteEncMgr_Buffered::update_write_params() int Client::WriteEncMgr_Buffered::do_write() { + ldout(cct, 10) << __func__ << dendl; int r = 0; // do buffered write @@ -12482,6 +12490,7 @@ int Client::WriteEncMgr_Buffered::do_write() int Client::WriteEncMgr_NotBuffered::do_write() { + ldout(cct, 10) << __func__ << dendl; clnt->get_cap_ref(in, CEPH_CAP_FILE_BUFFER); clnt->filer->write_trunc(in->ino, &in->layout, in->snaprealm->get_snap_context(), @@ -12592,12 +12601,12 @@ int64_t Client::_write(Fh *f, int64_t offset, uint64_t size, bufferlist bl, if (buffered_write) { enc_mgr = ceph::make_ref(this, f, - offset, size, bl, - !!onfinish); + offset, size, bl, + !!onfinish); } else { enc_mgr = ceph::make_ref(this, f, - offset, size, bl, - !!onfinish); + offset, size, bl, + !!onfinish); } @@ -12608,6 +12617,8 @@ int64_t Client::_write(Fh *f, int64_t offset, uint64_t size, bufferlist bl, return r; } + ldout(cct, 10) << __func__ << ": enc_mgr=" << enc_mgr << dendl; + ldout(cct, 10) << " snaprealm " << *in->snaprealm << dendl; std::unique_ptr iofinish = nullptr; diff --git a/src/client/Client.h b/src/client/Client.h index c70482ae4b800..c89fbeb517390 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -1630,8 +1630,10 @@ private: aio_collection *aioc; int io_id; - iofinish_method_ctx(T& _t, void (T::*_call)(int), aio_collection *_aioc) : t(_t), call(_call), - aioc(_aioc) { + iofinish_method_ctx(T& _t, void (T::*_call)(int), aio_collection *_aioc) + : t(_t), + call(_call), + aioc(_aioc) { _ctx.reset(new _Ctx(this)); if (aioc) { -- 2.39.5