From: David Zafman Date: Sat, 25 Jan 2014 02:11:52 +0000 (-0800) Subject: osd: Move PG::_scan_list() to backend as ReplicatedBackend::be_scan_list() X-Git-Tag: v0.78~237^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f9128e89a3e24bdfd6cb1a61e84bcfd0f069f58e;p=ceph.git osd: Move PG::_scan_list() to backend as ReplicatedBackend::be_scan_list() Signed-off-by: David Zafman --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 83fa35b710d1..7ca1d1616a24 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -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 &ls, bool deep, - ThreadPool::TPHandle &handle) -{ - dout(10) << "_scan_list scanning " << ls.size() << " objects" - << (deep ? " deeply" : "") << dendl; - int i = 0; - for (vector::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 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); } diff --git a/src/osd/PG.h b/src/osd/PG.h index 5dac855a4fa8..af2a3ce19bb8 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -966,9 +966,6 @@ public: void scrub_finish(); void scrub_clear_state(); bool scrub_gather_replica_maps(); - void _scan_list( - ScrubMap &map, vector &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, diff --git a/src/osd/PGBackend.h b/src/osd/PGBackend.h index 81a0ee5d1fd5..d380f5a04489 100644 --- a/src/osd/PGBackend.h +++ b/src/osd/PGBackend.h @@ -431,6 +431,8 @@ Context *on_complete) = 0; virtual bool scrub_supported() { return false; } + virtual void be_scan_list(ScrubMap &map, vector &ls, bool deep, + ThreadPool::TPHandle &handle) { assert(0); } }; #endif diff --git a/src/osd/ReplicatedBackend.cc b/src/osd/ReplicatedBackend.cc index 54b593eaa207..92b019abf9c3 100644 --- a/src/osd/ReplicatedBackend.cc +++ b/src/osd/ReplicatedBackend.cc @@ -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 &ls, bool deep, + ThreadPool::TPHandle &handle) +{ + dout(10) << "_scan_list scanning " << ls.size() << " objects" + << (deep ? " deeply" : "") << dendl; + int i = 0; + for (vector::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); + } + } +} diff --git a/src/osd/ReplicatedBackend.h b/src/osd/ReplicatedBackend.h index 867ffa33b8be..c53b5de91112 100644 --- a/src/osd/ReplicatedBackend.h +++ b/src/osd/ReplicatedBackend.h @@ -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 &ls, bool deep, + ThreadPool::TPHandle &handle); }; #endif