]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: correctly account for Client::WriteEncMgr() ref counts
authorVenky Shankar <vshankar@redhat.com>
Mon, 7 Apr 2025 04:50:58 +0000 (04:50 +0000)
committerChristopher Hoffman <choffman@redhat.com>
Wed, 5 Nov 2025 13:59:35 +0000 (13:59 +0000)
Signed-off-by: Venky Shankar <vshankar@redhat.com>
src/client/Client.cc
src/client/Client.h

index 609a1aefd53f10eae08f96a6a550cb3bd93421fc..949a4ff3035e6cea5eb21716f32c59b5317c5dcc 100644 (file)
@@ -12262,6 +12262,7 @@ int Client::WriteEncMgr::init()
 int Client::WriteEncMgr::read_async(uint64_t off, uint64_t len, bufferlist *bl,
                                      iofinish_method_ctx<WriteEncMgr> *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<WriteEncMgr_Buffered>(this, f,
-                                           offset, size, bl,
-                                           !!onfinish);
+                                                  offset, size, bl,
+                                                  !!onfinish);
   } else {
     enc_mgr = ceph::make_ref<WriteEncMgr_NotBuffered>(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<Context> iofinish = nullptr;
index c70482ae4b800d1c9c61896f6f6ad9c1f35f2020..c89fbeb51739079d341ab96a08f1f2144cd87516 100644 (file)
@@ -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) {