// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab #pragma once #include #include #include "include/encoding.h" struct creating_pgs_t { epoch_t last_scan_epoch = 0; /// pgs we are currently creating std::map > pgs; struct create_info { epoch_t created; utime_t modified; uint64_t start = 0; uint64_t end = 0; bool done() const { return start >= end; } void encode(bufferlist& bl) const { ::encode(created, bl); ::encode(modified, bl); ::encode(start, bl); ::encode(end, bl); } void decode(bufferlist::iterator& p) { ::decode(created, p); ::decode(modified, p); ::decode(start, p); ::decode(end, p); } }; /// queue of pgs we still need to create (poolid -> ) map queue; /// pools that exist in the osdmap for which at least one pg has been created std::set created_pools; bool create_pool(int64_t poolid, uint32_t pg_num, epoch_t created, utime_t modified) { if (created_pools.count(poolid) == 0) { auto& c = queue[poolid]; c.created = created; c.modified = modified; c.end = pg_num; created_pools.insert(poolid); return true; } else { return false; } } unsigned remove_pool(int64_t removed_pool) { const unsigned total = pgs.size(); auto first = pgs.lower_bound(pg_t{0, (uint64_t)removed_pool}); auto last = pgs.lower_bound(pg_t{0, (uint64_t)removed_pool + 1}); pgs.erase(first, last); created_pools.erase(removed_pool); queue.erase(removed_pool); return total - pgs.size(); } void encode(bufferlist& bl) const { ENCODE_START(2, 1, bl); ::encode(last_scan_epoch, bl); ::encode(pgs, bl); ::encode(created_pools, bl); ::encode(queue, bl); ENCODE_FINISH(bl); } void decode(bufferlist::iterator& bl) { DECODE_START(2, bl); ::decode(last_scan_epoch, bl); ::decode(pgs, bl); ::decode(created_pools, bl); if (struct_v >= 2) ::decode(queue, bl); DECODE_FINISH(bl); } void dump(ceph::Formatter *f) const { f->dump_unsigned("last_scan_epoch", last_scan_epoch); f->open_array_section("creating_pgs"); for (auto& pg : pgs) { f->open_object_section("pg"); f->dump_stream("pgid") << pg.first; f->dump_unsigned("epoch", pg.second.first); f->dump_stream("ctime") << pg.second.second; f->close_section(); } f->close_section(); f->open_array_section("queue"); for (auto& p : queue) { f->open_object_section("pool"); f->dump_unsigned("pool", p.first); f->dump_unsigned("created", p.second.created); f->dump_stream("modified") << p.second.modified; f->dump_unsigned("ps_start", p.second.start); f->dump_unsigned("ps_end", p.second.end); f->close_section(); } f->close_section(); f->open_array_section("created_pools"); for (auto pool : created_pools) { f->dump_unsigned("pool", pool); } f->close_section(); } static void generate_test_instances(list& o) { auto c = new creating_pgs_t; c->last_scan_epoch = 17; c->pgs.emplace(pg_t{42, 2}, make_pair(31, utime_t{891, 113})); c->pgs.emplace(pg_t{44, 2}, make_pair(31, utime_t{891, 113})); c->created_pools = {0, 1}; o.push_back(c); c = new creating_pgs_t; c->last_scan_epoch = 18; c->pgs.emplace(pg_t{42, 3}, make_pair(31, utime_t{891, 113})); c->created_pools = {}; o.push_back(c); } }; WRITE_CLASS_ENCODER(creating_pgs_t::create_info); WRITE_CLASS_ENCODER(creating_pgs_t);