ENCODE_START(8, 7, bl);
{
- uint8_t v = 5;
+ uint8_t v = 6;
if (!HAVE_FEATURE(features, SERVER_LUMINOUS)) {
v = 3;
}
+ if (!HAVE_FEATURE(features, SERVER_MIMIC)) {
+ v = 5;
+ }
ENCODE_START(v, 1, bl); // client-usable data
::encode(fsid, bl);
::encode(epoch, bl);
::encode(new_pg_upmap_items, bl);
::encode(old_pg_upmap_items, bl);
}
+ if (v >= 6) {
+ ::encode(new_removed_snaps, bl);
+ ::encode(new_purged_snaps, bl);
+ }
ENCODE_FINISH(bl); // client-usable data
}
return;
}
{
- DECODE_START(5, bl); // client-usable data
+ DECODE_START(6, bl); // client-usable data
::decode(fsid, bl);
::decode(epoch, bl);
::decode(modified, bl);
::decode(new_pg_upmap_items, bl);
::decode(old_pg_upmap_items, bl);
}
+ if (struct_v >= 6) {
+ ::decode(new_removed_snaps, bl);
+ ::decode(new_purged_snaps, bl);
+ }
DECODE_FINISH(bl); // client-usable data
}
f->dump_string("old", erasure_code_profile.c_str());
}
f->close_section();
+
+ f->open_array_section("new_removed_snaps");
+ for (auto& p : new_removed_snaps) {
+ f->open_object_section("pool");
+ f->dump_int("pool", p.first);
+ f->open_array_section("snaps");
+ for (auto q = p.second.begin(); q != p.second.end(); ++q) {
+ f->open_object_section("interval");
+ f->dump_unsigned("begin", q.get_start());
+ f->dump_unsigned("length", q.get_len());
+ f->close_section();
+ }
+ f->close_section();
+ f->close_section();
+ }
+ f->close_section();
+ f->open_array_section("new_purged_snaps");
+ for (auto& p : new_purged_snaps) {
+ f->open_object_section("pool");
+ f->dump_int("pool", p.first);
+ f->open_array_section("snaps");
+ for (auto q = p.second.begin(); q != p.second.end(); ++q) {
+ f->open_object_section("interval");
+ f->dump_unsigned("begin", q.get_start());
+ f->dump_unsigned("length", q.get_len());
+ f->close_section();
+ }
+ f->close_section();
+ f->close_section();
+ }
+ f->close_section();
}
void OSDMap::Incremental::generate_test_instances(list<Incremental*>& o)
pools[pool.first].last_change = epoch;
}
+ new_removed_snaps = inc.new_removed_snaps;
+ new_purged_snaps = inc.new_purged_snaps;
+ for (auto p = new_removed_snaps.begin();
+ p != new_removed_snaps.end();
+ ++p) {
+ removed_snaps_queue[p->first].union_of(p->second);
+ }
+ for (auto p = new_purged_snaps.begin();
+ p != new_purged_snaps.end();
+ ++p) {
+ auto q = removed_snaps_queue.find(p->first);
+ assert(q != removed_snaps_queue.end());
+ q->second.subtract(p->second);
+ if (q->second.empty()) {
+ removed_snaps_queue.erase(q);
+ }
+ }
+
for (const auto &pname : inc.new_pool_names) {
auto pool_name_entry = pool_name.find(pname.first);
if (pool_name_entry != pool_name.end()) {
ENCODE_START(8, 7, bl);
{
- uint8_t v = 6;
+ uint8_t v = 7;
if (!HAVE_FEATURE(features, SERVER_LUMINOUS)) {
v = 3;
}
+ if (!HAVE_FEATURE(features, SERVER_MIMIC)) {
+ v = 6;
+ }
ENCODE_START(v, 1, bl); // client-usable data
// base
::encode(fsid, bl);
if (v >= 6) {
::encode(crush_version, bl);
}
+ if (v >= 7) {
+ ::encode(new_removed_snaps, bl);
+ ::encode(new_purged_snaps, bl);
+ }
ENCODE_FINISH(bl); // client-usable data
}
{
- uint8_t target_v = 5;
+ uint8_t target_v = 6;
if (!HAVE_FEATURE(features, SERVER_LUMINOUS)) {
target_v = 1;
}
+ if (!HAVE_FEATURE(features, SERVER_MIMIC)) {
+ target_v = 5;
+ }
ENCODE_START(target_v, 1, bl); // extended, osd-only data
::encode(osd_addrs->hb_back_addr, bl, features);
::encode(osd_info, bl);
::encode(require_min_compat_client, bl);
::encode(require_osd_release, bl);
}
+ if (target_v >= 6) {
+ ::encode(removed_snaps_queue, bl);
+ }
ENCODE_FINISH(bl); // osd-only data
}
* Since we made it past that hurdle, we can use our normal paths.
*/
{
- DECODE_START(6, bl); // client-usable data
+ DECODE_START(7, bl); // client-usable data
// base
::decode(fsid, bl);
::decode(epoch, bl);
if (struct_v >= 6) {
::decode(crush_version, bl);
}
+ if (struct_v >= 7) {
+ ::decode(new_removed_snaps, bl);
+ ::decode(new_purged_snaps, bl);
+ }
DECODE_FINISH(bl); // client-usable data
}
{
- DECODE_START(5, bl); // extended, osd-only data
+ DECODE_START(6, bl); // extended, osd-only data
::decode(osd_addrs->hb_back_addr, bl);
::decode(osd_info, bl);
::decode(blacklist, bl);
require_osd_release = 0;
}
}
+ if (struct_v >= 6) {
+ ::decode(removed_snaps_queue, bl);
+ }
DECODE_FINISH(bl); // osd-only data
}
f->close_section();
dump_erasure_code_profiles(erasure_code_profiles, f);
+
+ f->open_array_section("removed_snaps_queue");
+ for (auto& p : removed_snaps_queue) {
+ f->open_object_section("pool");
+ f->dump_int("pool", p.first);
+ f->open_array_section("snaps");
+ for (auto q = p.second.begin(); q != p.second.end(); ++q) {
+ f->open_object_section("interval");
+ f->dump_unsigned("begin", q.get_start());
+ f->dump_unsigned("length", q.get_len());
+ f->close_section();
+ }
+ f->close_section();
+ f->close_section();
+ }
+ f->close_section();
+ f->open_array_section("new_removed_snaps");
+ for (auto& p : new_removed_snaps) {
+ f->open_object_section("pool");
+ f->dump_int("pool", p.first);
+ f->open_array_section("snaps");
+ for (auto q = p.second.begin(); q != p.second.end(); ++q) {
+ f->open_object_section("interval");
+ f->dump_unsigned("begin", q.get_start());
+ f->dump_unsigned("length", q.get_len());
+ f->close_section();
+ }
+ f->close_section();
+ f->close_section();
+ }
+ f->close_section();
+ f->open_array_section("new_purged_snaps");
+ for (auto& p : new_purged_snaps) {
+ f->open_object_section("pool");
+ f->dump_int("pool", p.first);
+ f->open_array_section("snaps");
+ for (auto q = p.second.begin(); q != p.second.end(); ++q) {
+ f->open_object_section("interval");
+ f->dump_unsigned("begin", q.get_start());
+ f->dump_unsigned("length", q.get_len());
+ f->close_section();
+ }
+ f->close_section();
+ f->close_section();
+ }
+ f->close_section();
}
void OSDMap::generate_test_instances(list<OSDMap*>& o)
if (!pool.second.removed_snaps.empty())
out << "\tremoved_snaps " << pool.second.removed_snaps << "\n";
+ auto p = removed_snaps_queue.find(pool.first);
+ if (p != removed_snaps_queue.end()) {
+ out << "\tremoved_snaps_queue " << p->second << "\n";
+ }
}
out << std::endl;
}
public:
MEMPOOL_CLASS_HELPERS();
+ typedef interval_set<
+ snapid_t,
+ mempool::osdmap::flat_map<snapid_t,snapid_t>> snap_interval_set_t;
+
class Incremental {
public:
MEMPOOL_CLASS_HELPERS();
mempool::osdmap::map<pg_t,mempool::osdmap::vector<int32_t>> new_pg_upmap;
mempool::osdmap::map<pg_t,mempool::osdmap::vector<pair<int32_t,int32_t>>> new_pg_upmap_items;
mempool::osdmap::set<pg_t> old_pg_upmap, old_pg_upmap_items;
+ mempool::osdmap::map<int64_t, snap_interval_set_t> new_removed_snaps;
+ mempool::osdmap::map<int64_t, snap_interval_set_t> new_purged_snaps;
string cluster_snapshot;
mempool::osdmap::unordered_map<entity_addr_t,utime_t> blacklist;
+ /// queue of snaps to remove
+ mempool::osdmap::map<int64_t, snap_interval_set_t> removed_snaps_queue;
+
+ /// removed_snaps additions this epoch
+ mempool::osdmap::map<int64_t, snap_interval_set_t> new_removed_snaps;
+
+ /// removed_snaps removals this epoch
+ mempool::osdmap::map<int64_t, snap_interval_set_t> new_purged_snaps;
+
epoch_t cluster_snapshot_epoch;
string cluster_snapshot;
bool new_blacklist_entries;
return false;
}
+ const mempool::osdmap::map<int64_t,snap_interval_set_t>&
+ get_removed_snaps_queue() const {
+ return removed_snaps_queue;
+ }
+ const mempool::osdmap::map<int64_t,snap_interval_set_t>&
+ get_new_removed_snaps() const {
+ return new_removed_snaps;
+ }
+ const mempool::osdmap::map<int64_t,snap_interval_set_t>&
+ get_new_purged_snaps() const {
+ return new_purged_snaps;
+ }
+
int64_t lookup_pg_pool_name(const string& name) const {
auto p = name_pool.find(name);
if (p == name_pool.end())