]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: Move PG::_scan_list() to backend as ReplicatedBackend::be_scan_list()
authorDavid Zafman <david.zafman@inktank.com>
Sat, 25 Jan 2014 02:11:52 +0000 (18:11 -0800)
committerDavid Zafman <david.zafman@inktank.com>
Fri, 31 Jan 2014 19:00:22 +0000 (11:00 -0800)
Signed-off-by: David Zafman <david.zafman@inktank.com>
src/osd/PG.cc
src/osd/PG.h
src/osd/PGBackend.h
src/osd/ReplicatedBackend.cc
src/osd/ReplicatedBackend.h

index 83fa35b710d1cb60cf8cd88cd7fdfb5c9fb57ad5..7ca1d1616a2441dcff960cbc5cbb9c6489bac254 100644 (file)
@@ -2776,111 +2776,6 @@ void PG::sub_op_scrub_map(OpRequestRef op)
   }
 }
 
-/* 
- * pg lock may or may not be held
- */
-void PG::_scan_list(
-  ScrubMap &map, vector<hobject_t> &ls, bool deep,
-  ThreadPool::TPHandle &handle)
-{
-  dout(10) << "_scan_list scanning " << ls.size() << " objects"
-           << (deep ? " deeply" : "") << dendl;
-  int i = 0;
-  for (vector<hobject_t>::iterator p = ls.begin(); 
-       p != ls.end(); 
-       ++p, i++) {
-    handle.reset_tp_timeout();
-    hobject_t poid = *p;
-
-    struct stat st;
-    int r = osd->store->stat(coll, poid, &st, true);
-    if (r == 0) {
-      ScrubMap::object &o = map.objects[poid];
-      o.size = st.st_size;
-      assert(!o.negative);
-      osd->store->getattrs(coll, poid, o.attrs);
-
-      // calculate the CRC32 on deep scrubs
-      if (deep) {
-        bufferhash h, oh;
-        bufferlist bl, hdrbl;
-        int r;
-        __u64 pos = 0;
-        while ( (r = osd->store->read(coll, poid, pos,
-                                       cct->_conf->osd_deep_scrub_stride, bl,
-                                     true)) > 0) {
-         handle.reset_tp_timeout();
-          h << bl;
-          pos += bl.length();
-          bl.clear();
-        }
-       if (r == -EIO) {
-         dout(25) << "_scan_list  " << poid << " got "
-                  << r << " on read, read_error" << dendl;
-         o.read_error = true;
-       }
-        o.digest = h.digest();
-        o.digest_present = true;
-
-        bl.clear();
-        r = osd->store->omap_get_header(coll, poid, &hdrbl, true);
-        if (r == 0) {
-          dout(25) << "CRC header " << string(hdrbl.c_str(), hdrbl.length())
-             << dendl;
-          ::encode(hdrbl, bl);
-          oh << bl;
-          bl.clear();
-        } else if (r == -EIO) {
-         dout(25) << "_scan_list  " << poid << " got "
-                  << r << " on omap header read, read_error" << dendl;
-         o.read_error = true;
-       }
-
-        ObjectMap::ObjectMapIterator iter = osd->store->get_omap_iterator(
-          coll, poid);
-        assert(iter);
-       uint64_t keys_scanned = 0;
-        for (iter->seek_to_first(); iter->valid() ; iter->next()) {
-         if (cct->_conf->osd_scan_list_ping_tp_interval &&
-             (keys_scanned % cct->_conf->osd_scan_list_ping_tp_interval == 0)) {
-           handle.reset_tp_timeout();
-         }
-         ++keys_scanned;
-
-          dout(25) << "CRC key " << iter->key() << " value "
-            << string(iter->value().c_str(), iter->value().length()) << dendl;
-
-          ::encode(iter->key(), bl);
-          ::encode(iter->value(), bl);
-          oh << bl;
-          bl.clear();
-        }
-       if (iter->status() == -EIO) {
-         dout(25) << "_scan_list  " << poid << " got "
-                  << r << " on omap scan, read_error" << dendl;
-         o.read_error = true;
-         break;
-       }
-
-        //Store final calculated CRC32 of omap header & key/values
-        o.omap_digest = oh.digest();
-        o.omap_digest_present = true;
-      }
-
-      dout(25) << "_scan_list  " << poid << dendl;
-    } else if (r == -ENOENT) {
-      dout(25) << "_scan_list  " << poid << " got " << r << ", skipping" << dendl;
-    } else if (r == -EIO) {
-      dout(25) << "_scan_list  " << poid << " got " << r << ", read_error" << dendl;
-      ScrubMap::object &o = map.objects[poid];
-      o.read_error = true;
-    } else {
-      derr << "_scan_list got: " << cpp_strerror(r) << dendl;
-      assert(0);
-    }
-  }
-}
-
 // send scrub v2-compatible messages (classic scrub)
 void PG::_request_scrub_map_classic(int replica, eversion_t version)
 {
@@ -3143,7 +3038,7 @@ int PG::build_scrub_map_chunk(
     return ret;
   }
 
-  _scan_list(map, ls, deep, handle);
+  get_pgbackend()->be_scan_list(map, ls, deep, handle);
   _scan_snaps(map);
 
   // pg attrs
@@ -3174,7 +3069,7 @@ void PG::build_scrub_map(ScrubMap &map, ThreadPool::TPHandle &handle)
   vector<hobject_t> ls;
   osd->store->collection_list(coll, ls);
 
-  _scan_list(map, ls, false, handle);
+  get_pgbackend()->be_scan_list(map, ls, false, handle);
   lock();
   _scan_snaps(map);
 
@@ -3223,7 +3118,7 @@ void PG::build_inc_scrub_map(
     }
   }
 
-  _scan_list(map, ls, false, handle);
+  get_pgbackend()->be_scan_list(map, ls, false, handle);
   // pg attrs
   osd->store->collection_getattrs(coll, map.attrs);
 }
index 5dac855a4fa8772cd2e85d8f41ad116f0e76761e..af2a3ce19bb8acb5c2e98ce97b1b310110cfbd34 100644 (file)
@@ -966,9 +966,6 @@ public:
   void scrub_finish();
   void scrub_clear_state();
   bool scrub_gather_replica_maps();
-  void _scan_list(
-    ScrubMap &map, vector<hobject_t> &ls, bool deep,
-    ThreadPool::TPHandle &handle);
   void _scan_snaps(ScrubMap &map);
   void _request_scrub_map_classic(int replica, eversion_t version);
   void _request_scrub_map(int replica, eversion_t version,
index 81a0ee5d1fd5ee3ebc159ff4fb7ce676d4950bd5..d380f5a044893f4034dcb57e566dbb0420242438 100644 (file)
      Context *on_complete) = 0;
 
    virtual bool scrub_supported() { return false; }
+   virtual void be_scan_list(ScrubMap &map, vector<hobject_t> &ls, bool deep,
+     ThreadPool::TPHandle &handle) { assert(0); }
  };
 
 #endif
index 54b593eaa2074857d4d87de738301a297868d726..92b019abf9c3cc74b5224ac344133b7cd083cca5 100644 (file)
@@ -11,6 +11,7 @@
  * Foundation.  See file COPYING.
  *
  */
+#include "common/errno.h"
 #include "ReplicatedBackend.h"
 #include "messages/MOSDOp.h"
 #include "messages/MOSDSubOp.h"
@@ -761,3 +762,108 @@ void ReplicatedBackend::sub_op_modify_reply(OpRequestRef op)
     }
   }
 }
+
+/*
+ * pg lock may or may not be held
+ */
+void ReplicatedBackend::be_scan_list(
+  ScrubMap &map, vector<hobject_t> &ls, bool deep,
+  ThreadPool::TPHandle &handle)
+{
+  dout(10) << "_scan_list scanning " << ls.size() << " objects"
+           << (deep ? " deeply" : "") << dendl;
+  int i = 0;
+  for (vector<hobject_t>::iterator p = ls.begin();
+       p != ls.end();
+       ++p, i++) {
+    handle.reset_tp_timeout();
+    hobject_t poid = *p;
+
+    struct stat st;
+    int r = osd->store->stat(coll, poid, &st, true);
+    if (r == 0) {
+      ScrubMap::object &o = map.objects[poid];
+      o.size = st.st_size;
+      assert(!o.negative);
+      osd->store->getattrs(coll, poid, o.attrs);
+
+      // calculate the CRC32 on deep scrubs
+      if (deep) {
+        bufferhash h, oh;
+        bufferlist bl, hdrbl;
+        int r;
+        __u64 pos = 0;
+        while ( (r = osd->store->read(coll, poid, pos,
+                                       cct->_conf->osd_deep_scrub_stride, bl,
+                                     true)) > 0) {
+         handle.reset_tp_timeout();
+          h << bl;
+          pos += bl.length();
+          bl.clear();
+        }
+       if (r == -EIO) {
+         dout(25) << "_scan_list  " << poid << " got "
+                  << r << " on read, read_error" << dendl;
+         o.read_error = true;
+       }
+        o.digest = h.digest();
+        o.digest_present = true;
+
+        bl.clear();
+        r = osd->store->omap_get_header(coll, poid, &hdrbl, true);
+        if (r == 0) {
+          dout(25) << "CRC header " << string(hdrbl.c_str(), hdrbl.length())
+             << dendl;
+          ::encode(hdrbl, bl);
+          oh << bl;
+          bl.clear();
+        } else if (r == -EIO) {
+         dout(25) << "_scan_list  " << poid << " got "
+                  << r << " on omap header read, read_error" << dendl;
+         o.read_error = true;
+       }
+
+        ObjectMap::ObjectMapIterator iter = osd->store->get_omap_iterator(
+          coll, poid);
+        assert(iter);
+       uint64_t keys_scanned = 0;
+        for (iter->seek_to_first(); iter->valid() ; iter->next()) {
+         if (cct->_conf->osd_scan_list_ping_tp_interval &&
+             (keys_scanned % cct->_conf->osd_scan_list_ping_tp_interval == 0)) {
+           handle.reset_tp_timeout();
+         }
+         ++keys_scanned;
+
+          dout(25) << "CRC key " << iter->key() << " value "
+            << string(iter->value().c_str(), iter->value().length()) << dendl;
+
+          ::encode(iter->key(), bl);
+          ::encode(iter->value(), bl);
+          oh << bl;
+          bl.clear();
+        }
+       if (iter->status() == -EIO) {
+         dout(25) << "_scan_list  " << poid << " got "
+                  << r << " on omap scan, read_error" << dendl;
+         o.read_error = true;
+         break;
+       }
+
+        //Store final calculated CRC32 of omap header & key/values
+        o.omap_digest = oh.digest();
+        o.omap_digest_present = true;
+      }
+
+      dout(25) << "_scan_list  " << poid << dendl;
+    } else if (r == -ENOENT) {
+      dout(25) << "_scan_list  " << poid << " got " << r << ", skipping" << dendl;
+    } else if (r == -EIO) {
+      dout(25) << "_scan_list  " << poid << " got " << r << ", read_error" << dendl;
+      ScrubMap::object &o = map.objects[poid];
+      o.read_error = true;
+    } else {
+      derr << "_scan_list got: " << cpp_strerror(r) << dendl;
+      assert(0);
+    }
+  }
+}
index 867ffa33b8beb072d401300548c9abb21dc86b0b..c53b5de911127ed8137db06cabbf9623b4c169a2 100644 (file)
@@ -490,6 +490,8 @@ private:
   void sub_op_modify_applied(RepModifyRef rm);
   void sub_op_modify_commit(RepModifyRef rm);
   bool scrub_supported() { return true; }
+  void be_scan_list(ScrubMap &map, vector<hobject_t> &ls, bool deep,
+    ThreadPool::TPHandle &handle);
 };
 
 #endif