]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ObjectCacher: only perfcount reads requested by the client
authorJosh Durgin <josh.durgin@inktank.com>
Wed, 16 May 2012 20:40:43 +0000 (13:40 -0700)
committerJosh Durgin <josh.durgin@inktank.com>
Wed, 16 May 2012 20:40:43 +0000 (13:40 -0700)
_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>
src/osdc/ObjectCacher.cc
src/osdc/ObjectCacher.h

index 13c1d60573c9c7feaacb77df8dbe0f5844ebbcf6..944cef51fb3d875f1a9599d89fe16dbd2cdec020 100644 (file)
@@ -846,6 +846,12 @@ bool ObjectCacher::is_cached(ObjectSet *oset, vector<ObjectExtent>& 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);
index 0728a1f2920eb664e0150d1f6f14fcc86b89ce4d..0c326a6a0186dc4af8911be7af0feb95443e929d 100644 (file)
@@ -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;