summaryrefslogtreecommitdiff
path: root/src/osdc
diff options
context:
space:
mode:
authorJosh Durgin <josh.durgin@inktank.com>2012-05-16 13:40:43 -0700
committerJosh Durgin <josh.durgin@inktank.com>2012-05-16 13:40:43 -0700
commit2f1f808811bd55b299b3477fc580eed62d3c1c25 (patch)
treeefba65b14982646a29020ef47bd46aa0e3b2876f /src/osdc
parentf2380f4d4f08e6f95bbe0925ac1c96c04e399810 (diff)
downloadceph-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.cc10
-rw-r--r--src/osdc/ObjectCacher.h5
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;