From 2f1f808811bd55b299b3477fc580eed62d3c1c25 Mon Sep 17 00:00:00 2001 From: Josh Durgin Date: Wed, 16 May 2012 13:40:43 -0700 Subject: [PATCH] ObjectCacher: only perfcount reads requested by the client _readx is called again after each bh is read by C_RetryRead. This resulted in the read being counted many times for the internal caller that was just checking whether it was done yet. Signed-off-by: Josh Durgin --- src/osdc/ObjectCacher.cc | 10 ++++++++-- src/osdc/ObjectCacher.h | 5 ++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index 13c1d60573c9c..944cef51fb3d8 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -846,6 +846,12 @@ bool ObjectCacher::is_cached(ObjectSet *oset, vector& extents, sna * returns 0 if doing async read */ int ObjectCacher::readx(OSDRead *rd, ObjectSet *oset, Context *onfinish) +{ + return _readx(rd, oset, onfinish, true); +} + +int ObjectCacher::_readx(OSDRead *rd, ObjectSet *oset, Context *onfinish, + bool external_call) { assert(lock.is_locked()); bool success = true; @@ -964,7 +970,7 @@ int ObjectCacher::readx(OSDRead *rd, ObjectSet *oset, Context *onfinish) touch_bh(*bhit); if (!success) { - if (perfcounter) { + if (perfcounter && external_call) { perfcounter->inc(l_objectcacher_data_read, total_bytes_read); perfcounter->inc(l_objectcacher_cache_bytes_hit, bytes_in_cache); perfcounter->inc(l_objectcacher_cache_bytes_miss, bytes_not_in_cache); @@ -972,7 +978,7 @@ int ObjectCacher::readx(OSDRead *rd, ObjectSet *oset, Context *onfinish) } return 0; // wait! } - if (perfcounter) { + if (perfcounter && external_call) { perfcounter->inc(l_objectcacher_data_read, total_bytes_read); perfcounter->inc(l_objectcacher_cache_bytes_hit, bytes_in_cache); perfcounter->inc(l_objectcacher_cache_ops_hit); diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index 0728a1f2920eb..0c326a6a0186d 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -406,6 +406,9 @@ class ObjectCacher { void wrlock(Object *o); void wrunlock(Object *o); + int _readx(OSDRead *rd, ObjectSet *oset, Context *onfinish, + bool external_call); + public: void bh_read_finish(int64_t poolid, sobject_t oid, loff_t offset, uint64_t length, bufferlist &bl, int r); @@ -489,7 +492,7 @@ class ObjectCacher { public: C_RetryRead(ObjectCacher *_oc, OSDRead *r, ObjectSet *os, Context *c) : oc(_oc), rd(r), oset(os), onfinish(c) {} void finish(int) { - int r = oc->readx(rd, oset, onfinish); + int r = oc->_readx(rd, oset, onfinish, false); if (r > 0 && onfinish) { onfinish->finish(r); delete onfinish; -- 2.39.5