['pool_name']="test"
)
- local extr_dbg=1
+ local extr_dbg=3
(( extr_dbg > 1 )) && echo "Dir: $dir"
standard_scrub_cluster $dir cluster_conf
ceph tell osd.* config set osd_stats_update_period_not_scrubbing "1"
(( 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
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
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 "$@"
using std::string;
using std::vector;
-using ceph::bufferlist;
using ceph::decode;
using ceph::encode;
using ceph::timespan_str;
int OSDriver::get_keys(
const std::set<std::string> &keys,
- std::map<std::string, bufferlist> *out)
+ std::map<std::string, ceph::buffer::list> *out)
{
return os->omap_get_values(ch, hoid, keys, out);
}
int OSDriver::get_next(
const std::string &key,
- pair<std::string, bufferlist> *next)
+ pair<std::string, ceph::buffer::list> *next)
{
ObjectMap::ObjectMapIterator iter =
os->get_omap_iterator(ch, hoid);
return get_prefix(clone.pool, snap) + shard_prefix + clone.to_str();
}
-pair<string, bufferlist> SnapMapper::to_raw(
+pair<string, ceph::buffer::list> SnapMapper::to_raw(
const pair<snapid_t, hobject_t> &in) const
{
- bufferlist bl;
+ ceph::buffer::list bl;
encode(Mapping(in), bl);
return make_pair(to_raw_key(in), bl);
}
pair<snapid_t, hobject_t> SnapMapper::from_raw(
- const pair<std::string, bufferlist> &image)
+ const pair<std::string, ceph::buffer::list> &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);
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);
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);
dout(20) << fmt::format("{}: key string: {} oid:{}", __func__, keys, oid)
<< dendl;
- map<string, bufferlist> got;
+ map<string, ceph::buffer::list> got;
int r = backend.get_keys(keys, &got);
if (r < 0) {
dout(10) << __func__ << " " << oid << " got err " << r << dendl;
// 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<string, bufferlist> kvmap;
auto mapping_keys = to_raw_keys(hoid, *obj_snaps);
+ map<string, ceph::buffer::list> kvmap;
auto r = backend.get_keys(mapping_keys, &kvmap);
if (r < 0) {
dout(10) << fmt::format(
void SnapMapper::clear_snaps(
const hobject_t &oid,
- MapCacher::Transaction<std::string, bufferlist> *t)
+ MapCacher::Transaction<std::string, ceph::buffer::list> *t)
{
dout(20) << __func__ << " " << oid << dendl;
ceph_assert(check(oid));
void SnapMapper::set_snaps(
const hobject_t &oid,
const object_snaps &in,
- MapCacher::Transaction<std::string, bufferlist> *t)
+ MapCacher::Transaction<std::string, ceph::buffer::list> *t)
{
ceph_assert(check(oid));
- map<string, bufferlist> to_set;
- bufferlist bl;
+ map<string, ceph::buffer::list> to_set;
+ ceph::buffer::list bl;
encode(in, bl);
to_set[to_object_key(oid)] = bl;
dout(20) << __func__ << " " << oid << " " << in.snaps << dendl;
const hobject_t &oid,
const set<snapid_t> &new_snaps,
const set<snapid_t> *old_snaps_check,
- MapCacher::Transaction<std::string, bufferlist> *t)
+ MapCacher::Transaction<std::string, ceph::buffer::list> *t)
{
dout(20) << __func__ << " " << oid << " " << new_snaps
<< " was " << (old_snaps_check ? *old_snaps_check : set<snapid_t>())
void SnapMapper::add_oid(
const hobject_t &oid,
const set<snapid_t>& snaps,
- MapCacher::Transaction<std::string, bufferlist> *t)
+ MapCacher::Transaction<std::string, ceph::buffer::list> *t)
{
dout(20) << __func__ << " " << oid << " " << snaps << dendl;
ceph_assert(!snaps.empty());
object_snaps _snaps(oid, snaps);
set_snaps(oid, _snaps, t);
- map<string, bufferlist> to_add;
+ map<string, ceph::buffer::list> to_add;
for (set<snapid_t>::iterator i = snaps.begin();
i != snaps.end();
++i) {
string prefix(get_prefix(pool, snap) + *i);
string pos = prefix;
while (out->size() < max) {
- pair<string, bufferlist> next;
+ pair<string, ceph::buffer::list> next;
r = backend.get_next(pos, &next);
dout(20) << __func__ << " get_next(" << pos << ") returns " << r
<< " " << next << dendl;
int SnapMapper::remove_oid(
const hobject_t &oid,
- MapCacher::Transaction<std::string, bufferlist> *t)
+ MapCacher::Transaction<std::string, ceph::buffer::list> *t)
{
dout(20) << __func__ << " " << oid << dendl;
ceph_assert(check(oid));
int SnapMapper::_remove_oid(
const hobject_t &oid,
- MapCacher::Transaction<std::string, bufferlist> *t)
+ MapCacher::Transaction<std::string, ceph::buffer::list> *t)
{
dout(20) << __func__ << " " << oid << dendl;
object_snaps out;
}
void SnapMapper::make_purged_snap_key_value(
- int64_t pool, snapid_t begin, snapid_t end, map<string,bufferlist> *m)
+ int64_t pool, snapid_t begin, snapid_t end, map<string,ceph::buffer::list> *m)
{
string k = make_purged_snap_key(pool, end - 1);
auto& v = (*m)[k];
<< 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);
map<epoch_t,mempool::osdmap::map<int64_t,snap_interval_set_t>> purged_snaps)
{
dout(10) << __func__ << " purged_snaps " << purged_snaps << dendl;
- map<string,bufferlist> m;
+ map<string,ceph::buffer::list> m;
set<string> rm;
for (auto& [epoch, bypool] : purged_snaps) {
// index by (pool, snap)
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);
*/
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(
auto start = ceph::mono_clock::now();
iter->upper_bound(SnapMapper::LEGACY_MAPPING_PREFIX);
- map<string,bufferlist> to_set;
+ map<string,ceph::buffer::list> to_set;
while (iter->valid()) {
bool valid = SnapMapper::is_legacy_mapping(iter->key());
if (valid) {