diff options
author | Josh Durgin <josh.durgin@inktank.com> | 2012-05-16 13:40:43 -0700 |
---|---|---|
committer | Josh Durgin <josh.durgin@inktank.com> | 2012-05-16 13:40:43 -0700 |
commit | 2f1f808811bd55b299b3477fc580eed62d3c1c25 (patch) | |
tree | efba65b14982646a29020ef47bd46aa0e3b2876f /src/osdc | |
parent | f2380f4d4f08e6f95bbe0925ac1c96c04e399810 (diff) | |
download | ceph-2f1f808811bd55b299b3477fc580eed62d3c1c25.tar.gz |
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 <josh.durgin@inktank.com>
Diffstat (limited to 'src/osdc')
-rw-r--r-- | src/osdc/ObjectCacher.cc | 10 | ||||
-rw-r--r-- | 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 13c1d60573c..944cef51fb3 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -847,6 +847,12 @@ bool ObjectCacher::is_cached(ObjectSet *oset, vector<ObjectExtent>& extents, sna */ 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; list<BufferHead*> hit_ls; @@ -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 0728a1f2920..0c326a6a018 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; |