From: Samuel Just Date: Sat, 8 Feb 2014 21:40:50 +0000 (-0800) Subject: ReplicatedBackend: factor out be_deep-scrub X-Git-Tag: v0.78~163^2~17 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1835c29f6d919cb3066a5f643ca81f29b70e3c9f;p=ceph.git ReplicatedBackend: factor out be_deep-scrub Signed-off-by: Samuel Just --- diff --git a/src/osd/ReplicatedBackend.cc b/src/osd/ReplicatedBackend.cc index 8dc86b4965c..3bb17c540e9 100644 --- a/src/osd/ReplicatedBackend.cc +++ b/src/osd/ReplicatedBackend.cc @@ -654,6 +654,84 @@ void ReplicatedBackend::sub_op_modify_reply(OpRequestRef op) } } +void ReplicatedBackend::be_deep_scrub( + const hobject_t &poid, + ScrubMap::object &o, + ThreadPool::TPHandle &handle) { + bufferhash h, oh; + bufferlist bl, hdrbl; + int r; + __u64 pos = 0; + while ( (r = store->read( + coll, + ghobject_t( + poid, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard), + 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 = store->omap_get_header( + coll, + ghobject_t( + poid, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard), + &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 = store->get_omap_iterator( + coll, + ghobject_t( + poid, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard)); + 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; + } + + //Store final calculated CRC32 of omap header & key/values + o.omap_digest = oh.digest(); + o.omap_digest_present = true; +} + /* * pg lock may or may not be held */ @@ -689,80 +767,7 @@ void ReplicatedBackend::be_scan_list( // calculate the CRC32 on deep scrubs if (deep) { - bufferhash h, oh; - bufferlist bl, hdrbl; - int r; - __u64 pos = 0; - while ( ( - r = store->read( - coll, - ghobject_t( - poid, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard), - 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 = store->omap_get_header( - coll, - ghobject_t( - poid, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard), - &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 = store->get_omap_iterator( - coll, - ghobject_t( - poid, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard)); - 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; + be_deep_scrub(*p, o, handle); } dout(25) << "_scan_list " << poid << dendl; diff --git a/src/osd/ReplicatedBackend.h b/src/osd/ReplicatedBackend.h index 78ec6b4b6d6..4dca081f7a6 100644 --- a/src/osd/ReplicatedBackend.h +++ b/src/osd/ReplicatedBackend.h @@ -423,6 +423,10 @@ private: const spg_t pgid, const vector &acting, ostream &errorstream); + void be_deep_scrub( + const hobject_t &obj, + ScrubMap::object &o, + ThreadPool::TPHandle &handle); }; #endif