From: Varsha Rao Date: Thu, 16 Apr 2020 14:58:54 +0000 (+0530) Subject: Filer: Add error handler in _do_purge_range() X-Git-Tag: v15.2.4~28^2~2^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=da97ebe78d9b05e3ace817ba8b9e33cd853b5d8f;p=ceph.git Filer: Add error handler in _do_purge_range() Signed-off-by: Varsha Rao (cherry picked from commit 39b25efb26963180a7e0403174868f5a9940ff55) --- diff --git a/src/osdc/Filer.cc b/src/osdc/Filer.cc index 93abbb7cdb1c..4a82ea6c2ca1 100644 --- a/src/osdc/Filer.cc +++ b/src/osdc/Filer.cc @@ -302,6 +302,7 @@ struct PurgeRange { int flags; Context *oncommit; int uncommitted; + int err = 0; PurgeRange(inodeno_t i, const file_layout_t& l, const SnapContext& sc, uint64_t fo, uint64_t no, ceph::real_time t, int fl, Context *fin) @@ -331,7 +332,7 @@ int Filer::purge_range(inodeno_t ino, PurgeRange *pr = new PurgeRange(ino, *layout, snapc, first_obj, num_obj, mtime, flags, oncommit); - _do_purge_range(pr, 0); + _do_purge_range(pr, 0, 0); return 0; } @@ -340,20 +341,22 @@ struct C_PurgeRange : public Context { PurgeRange *pr; C_PurgeRange(Filer *f, PurgeRange *p) : filer(f), pr(p) {} void finish(int r) override { - filer->_do_purge_range(pr, 1); + filer->_do_purge_range(pr, 1, r); } }; -void Filer::_do_purge_range(PurgeRange *pr, int fin) +void Filer::_do_purge_range(PurgeRange *pr, int fin, int err) { PurgeRange::unique_lock prl(pr->lock); + if (err && err != -ENOENT) + pr->err = err; pr->uncommitted -= fin; ldout(cct, 10) << "_do_purge_range " << pr->ino << " objects " << pr->first << "~" << pr->num << " uncommitted " << pr->uncommitted << dendl; if (pr->num == 0 && pr->uncommitted == 0) { - pr->oncommit->complete(0); + pr->oncommit->complete(pr->err); prl.unlock(); delete pr; return; diff --git a/src/osdc/Filer.h b/src/osdc/Filer.h index 05525904ec57..cedb710c2345 100644 --- a/src/osdc/Filer.h +++ b/src/osdc/Filer.h @@ -253,7 +253,7 @@ class Filer { uint64_t first_obj, uint64_t num_obj, ceph::real_time mtime, int flags, Context *oncommit); - void _do_purge_range(struct PurgeRange *pr, int fin); + void _do_purge_range(struct PurgeRange *pr, int fin, int err); /* * probe