1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
8 #include "include/encoding.h"
10 struct creating_pgs_t {
11 epoch_t last_scan_epoch = 0;
13 /// pgs we are currently creating
14 std::map<pg_t, std::pair<epoch_t, utime_t> > pgs;
24 void encode(bufferlist& bl) const {
25 ::encode(created, bl);
26 ::encode(modified, bl);
30 void decode(bufferlist::iterator& p) {
32 ::decode(modified, p);
38 /// queue of pgs we still need to create (poolid -> <created, set of ps>)
39 map<int64_t,create_info> queue;
41 /// pools that exist in the osdmap for which at least one pg has been created
42 std::set<int64_t> created_pools;
44 bool create_pool(int64_t poolid, uint32_t pg_num,
45 epoch_t created, utime_t modified) {
46 if (created_pools.count(poolid) == 0) {
47 auto& c = queue[poolid];
49 c.modified = modified;
51 created_pools.insert(poolid);
57 unsigned remove_pool(int64_t removed_pool) {
58 const unsigned total = pgs.size();
59 auto first = pgs.lower_bound(pg_t{0, (uint64_t)removed_pool});
60 auto last = pgs.lower_bound(pg_t{0, (uint64_t)removed_pool + 1});
61 pgs.erase(first, last);
62 created_pools.erase(removed_pool);
63 queue.erase(removed_pool);
64 return total - pgs.size();
66 void encode(bufferlist& bl) const {
67 ENCODE_START(2, 1, bl);
68 ::encode(last_scan_epoch, bl);
70 ::encode(created_pools, bl);
74 void decode(bufferlist::iterator& bl) {
76 ::decode(last_scan_epoch, bl);
78 ::decode(created_pools, bl);
83 void dump(ceph::Formatter *f) const {
84 f->dump_unsigned("last_scan_epoch", last_scan_epoch);
85 f->open_array_section("creating_pgs");
86 for (auto& pg : pgs) {
87 f->open_object_section("pg");
88 f->dump_stream("pgid") << pg.first;
89 f->dump_unsigned("epoch", pg.second.first);
90 f->dump_stream("ctime") << pg.second.second;
94 f->open_array_section("queue");
95 for (auto& p : queue) {
96 f->open_object_section("pool");
97 f->dump_unsigned("pool", p.first);
98 f->dump_unsigned("created", p.second.created);
99 f->dump_stream("modified") << p.second.modified;
100 f->dump_unsigned("ps_start", p.second.start);
101 f->dump_unsigned("ps_end", p.second.end);
105 f->open_array_section("created_pools");
106 for (auto pool : created_pools) {
107 f->dump_unsigned("pool", pool);
111 static void generate_test_instances(list<creating_pgs_t*>& o) {
112 auto c = new creating_pgs_t;
113 c->last_scan_epoch = 17;
114 c->pgs.emplace(pg_t{42, 2}, make_pair(31, utime_t{891, 113}));
115 c->pgs.emplace(pg_t{44, 2}, make_pair(31, utime_t{891, 113}));
116 c->created_pools = {0, 1};
118 c = new creating_pgs_t;
119 c->last_scan_epoch = 18;
120 c->pgs.emplace(pg_t{42, 3}, make_pair(31, utime_t{891, 113}));
121 c->created_pools = {};
125 WRITE_CLASS_ENCODER(creating_pgs_t::create_info);
126 WRITE_CLASS_ENCODER(creating_pgs_t);