From: Ronen Friedman Date: Tue, 23 Aug 2022 14:16:09 +0000 (+0000) Subject: osd/scrub: modify SnapMapper.cc to use ceph::buffer::list X-Git-Tag: v17.2.7~203^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=53f1440a09098b67897c2be59d2482f77f7fceff;p=ceph.git osd/scrub: modify SnapMapper.cc to use ceph::buffer::list ... systematically, over ceph::bufferlist. Signed-off-by: Ronen Friedman (cherry picked from commit a85ef8e7980b30c60cf5f85acff153ae2c267fa2) Manual change: osd-mapper.sh: That file wasn't supposed to be in this original commit; I did not merge its changes to the correct commit in order to maintain compatibility with the original PR. I did reduce that debug level, which was mistakenly set to dev level. --- diff --git a/qa/standalone/scrub/osd-mapper.sh b/qa/standalone/scrub/osd-mapper.sh index 989271b9158c..5a13b109a34f 100755 --- a/qa/standalone/scrub/osd-mapper.sh +++ b/qa/standalone/scrub/osd-mapper.sh @@ -100,6 +100,8 @@ function TEST_truncated_sna_record() { (( extr_dbg >= 2 )) && ceph-kvstore-tool bluestore-kv $dir/2 dump "p" | grep -a SNA_ (( extr_dbg >= 2 )) && grep -a SNA_ /tmp/oo2.dump (( extr_dbg >= 2 )) && ceph-kvstore-tool bluestore-kv $dir/2 dump p 2> /dev/null + local num_sna_b4=`ceph-kvstore-tool bluestore-kv $dir/$osd dump p 2> /dev/null | grep -a -e 'SNA_[0-9]_000000000000000[0-9]_000000000000000' \ + | awk -e '{print $2;}' | wc -l` for sdn in $(seq 0 $(expr $osdn - 1)) do @@ -137,6 +139,7 @@ function TEST_truncated_sna_record() { do timeout 60 ceph tell osd.$sdn version done + rados --format json-pretty -p $poolname listsnaps $objname # when scrubbing now - we expect the scrub to emit a cluster log ERR message regarding SnapMapper internal inconsistency ceph osd unset nodeep-scrub || return 1 @@ -151,8 +154,29 @@ function TEST_truncated_sna_record() { ceph pg dump pgs (( extr_dbg >= 1 )) && grep -a "ERR" $dir/osd.$cur_prim.log grep -a -q "ERR" $dir/osd.$cur_prim.log || return 1 -} + # but did we fix the snap issue? let's try scrubbing again + + local prev_err_cnt=`grep -a "ERR" $dir/osd.$cur_prim.log | wc -l` + echo "prev count: $prev_err_cnt" + + # scrub again. No errors expected this time + ceph pg $pgid deep_scrub || return 1 + sleep 5 + ceph pg dump pgs + (( extr_dbg >= 1 )) && grep -a "ERR" $dir/osd.$cur_prim.log + local current_err_cnt=`grep -a "ERR" $dir/osd.$cur_prim.log | wc -l` + (( extr_dbg >= 1 )) && echo "current count: $current_err_cnt" + (( current_err_cnt == prev_err_cnt )) || return 1 + kill_daemons $dir TERM osd || return 1 + kvdir=$dir/$cur_prim + (( extr_dbg >= 2 )) && ceph-kvstore-tool bluestore-kv $kvdir dump p 2> /dev/null | grep -a -e 'SNA_[0-9]_' \ + | awk -e '{print $2;}' + local num_sna_full=`ceph-kvstore-tool bluestore-kv $kvdir dump p 2> /dev/null | grep -a -e 'SNA_[0-9]_000000000000000[0-9]_000000000000000' \ + | awk -e '{print $2;}' | wc -l` + (( num_sna_full == num_sna_b4 )) || return 1 + return 0 +} main osd-mapper "$@" diff --git a/src/osd/SnapMapper.cc b/src/osd/SnapMapper.cc index 5d4e5f18abbd..4feabcda4590 100644 --- a/src/osd/SnapMapper.cc +++ b/src/osd/SnapMapper.cc @@ -32,7 +32,6 @@ using std::set; using std::string; using std::vector; -using ceph::bufferlist; using ceph::decode; using ceph::encode; using ceph::timespan_str; @@ -81,14 +80,14 @@ const char *SnapMapper::PURGED_SNAP_PREFIX = "PSN_"; int OSDriver::get_keys( const std::set &keys, - std::map *out) + std::map *out) { return os->omap_get_values(ch, hoid, keys, out); } int OSDriver::get_next( const std::string &key, - pair *next) + pair *next) { ObjectMap::ObjectMapIterator iter = os->get_omap_iterator(ch, hoid); @@ -128,20 +127,20 @@ std::string SnapMapper::to_raw_key(snapid_t snap, const hobject_t &clone) const return get_prefix(clone.pool, snap) + shard_prefix + clone.to_str(); } -pair SnapMapper::to_raw( +pair SnapMapper::to_raw( const pair &in) const { - bufferlist bl; + ceph::buffer::list bl; encode(Mapping(in), bl); return make_pair(to_raw_key(in), bl); } pair SnapMapper::from_raw( - const pair &image) + const pair &image) { using ceph::decode; Mapping map; - bufferlist bl(image.second); + ceph::buffer::list bl(image.second); auto bp = bl.cbegin(); decode(map, bp); return make_pair(map.snap, map.hoid); @@ -167,7 +166,7 @@ string SnapMapper::to_object_key(const hobject_t &hoid) const return OBJECT_PREFIX + shard_prefix + hoid.to_str(); } -void SnapMapper::object_snaps::encode(bufferlist &bl) const +void SnapMapper::object_snaps::encode(ceph::buffer::list &bl) const { ENCODE_START(1, 1, bl); encode(oid, bl); @@ -175,7 +174,7 @@ void SnapMapper::object_snaps::encode(bufferlist &bl) const ENCODE_FINISH(bl); } -void SnapMapper::object_snaps::decode(bufferlist::const_iterator &bl) +void SnapMapper::object_snaps::decode(ceph::buffer::list::const_iterator &bl) { DECODE_START(1, bl); decode(oid, bl); @@ -234,7 +233,7 @@ SnapMapper::get_snaps_common(const hobject_t &oid) const dout(20) << fmt::format("{}: key string: {} oid:{}", __func__, keys, oid) << dendl; - map got; + map got; int r = backend.get_keys(keys, &got); if (r < 0) { dout(10) << __func__ << " " << oid << " got err " << r << dendl; @@ -290,8 +289,8 @@ SnapMapper::get_snaps_check_consistency(const hobject_t &hoid) const // we have the clone oid and the set of snaps relevant to this clone. // Let's construct all expected SNA_ key, then fetch them. - map kvmap; auto mapping_keys = to_raw_keys(hoid, *obj_snaps); + map kvmap; auto r = backend.get_keys(mapping_keys, &kvmap); if (r < 0) { dout(10) << fmt::format( @@ -333,7 +332,7 @@ SnapMapper::get_snaps_check_consistency(const hobject_t &hoid) const void SnapMapper::clear_snaps( const hobject_t &oid, - MapCacher::Transaction *t) + MapCacher::Transaction *t) { dout(20) << __func__ << " " << oid << dendl; ceph_assert(check(oid)); @@ -350,11 +349,11 @@ void SnapMapper::clear_snaps( void SnapMapper::set_snaps( const hobject_t &oid, const object_snaps &in, - MapCacher::Transaction *t) + MapCacher::Transaction *t) { ceph_assert(check(oid)); - map to_set; - bufferlist bl; + map to_set; + ceph::buffer::list bl; encode(in, bl); to_set[to_object_key(oid)] = bl; dout(20) << __func__ << " " << oid << " " << in.snaps << dendl; @@ -370,7 +369,7 @@ int SnapMapper::update_snaps( const hobject_t &oid, const set &new_snaps, const set *old_snaps_check, - MapCacher::Transaction *t) + MapCacher::Transaction *t) { dout(20) << __func__ << " " << oid << " " << new_snaps << " was " << (old_snaps_check ? *old_snaps_check : set()) @@ -410,7 +409,7 @@ int SnapMapper::update_snaps( void SnapMapper::add_oid( const hobject_t &oid, const set& snaps, - MapCacher::Transaction *t) + MapCacher::Transaction *t) { dout(20) << __func__ << " " << oid << " " << snaps << dendl; ceph_assert(!snaps.empty()); @@ -429,7 +428,7 @@ void SnapMapper::add_oid( object_snaps _snaps(oid, snaps); set_snaps(oid, _snaps, t); - map to_add; + map to_add; for (set::iterator i = snaps.begin(); i != snaps.end(); ++i) { @@ -463,7 +462,7 @@ int SnapMapper::get_next_objects_to_trim( string prefix(get_prefix(pool, snap) + *i); string pos = prefix; while (out->size() < max) { - pair next; + pair next; r = backend.get_next(pos, &next); dout(20) << __func__ << " get_next(" << pos << ") returns " << r << " " << next << dendl; @@ -497,7 +496,7 @@ int SnapMapper::get_next_objects_to_trim( int SnapMapper::remove_oid( const hobject_t &oid, - MapCacher::Transaction *t) + MapCacher::Transaction *t) { dout(20) << __func__ << " " << oid << dendl; ceph_assert(check(oid)); @@ -506,7 +505,7 @@ int SnapMapper::remove_oid( int SnapMapper::_remove_oid( const hobject_t &oid, - MapCacher::Transaction *t) + MapCacher::Transaction *t) { dout(20) << __func__ << " " << oid << dendl; object_snaps out; @@ -557,7 +556,7 @@ string SnapMapper::make_purged_snap_key(int64_t pool, snapid_t last) } void SnapMapper::make_purged_snap_key_value( - int64_t pool, snapid_t begin, snapid_t end, map *m) + int64_t pool, snapid_t begin, snapid_t end, map *m) { string k = make_purged_snap_key(pool, end - 1); auto& v = (*m)[k]; @@ -588,7 +587,7 @@ int SnapMapper::_lookup_purged_snap( << it->key() << "'" << dendl; return -ENOENT; } - bufferlist v = it->value(); + ceph::buffer::list v = it->value(); auto p = v.cbegin(); int64_t gotpool; decode(gotpool, p); @@ -611,7 +610,7 @@ void SnapMapper::record_purged_snaps( map> purged_snaps) { dout(10) << __func__ << " purged_snaps " << purged_snaps << dendl; - map m; + map m; set rm; for (auto& [epoch, bypool] : purged_snaps) { // index by (pool, snap) @@ -670,7 +669,7 @@ bool SnapMapper::Scrubber::_parse_p() pool = -1; return false; } - bufferlist v = psit->value(); + ceph::buffer::list v = psit->value(); auto p = v.cbegin(); ceph::decode(pool, p); ceph::decode(begin, p); @@ -813,7 +812,7 @@ bool SnapMapper::is_legacy_mapping(const string &to_test) */ std::string SnapMapper::convert_legacy_key( const std::string& old_key, - const bufferlist& value) + const ceph::buffer::list& value) { auto old = from_raw(make_pair(old_key, value)); std::string object_suffix = old_key.substr( @@ -839,7 +838,7 @@ int SnapMapper::convert_legacy( auto start = ceph::mono_clock::now(); iter->upper_bound(SnapMapper::LEGACY_MAPPING_PREFIX); - map to_set; + map to_set; while (iter->valid()) { bool valid = SnapMapper::is_legacy_mapping(iter->key()); if (valid) { diff --git a/src/osd/SnapMapper.h b/src/osd/SnapMapper.h index 45d03298b2fb..01879c6e15b8 100644 --- a/src/osd/SnapMapper.h +++ b/src/osd/SnapMapper.h @@ -60,11 +60,6 @@ public: } }; - OSTransaction get_transaction( - ObjectStore::Transaction *t) { - return OSTransaction(ch->cid, hoid, t); - } - OSTransaction get_transaction( ObjectStore::Transaction *t) const { return OSTransaction(ch->cid, hoid, t);