-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCreatingPGs.h
125 lines (117 loc) · 3.6 KB
/
CreatingPGs.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
#pragma once
#include <map>
#include <set>
#include "include/encoding.h"
struct creating_pgs_t {
epoch_t last_scan_epoch = 0;
/// pgs we are currently creating
std::map<pg_t, std::pair<epoch_t, utime_t> > 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 -> <created, set of ps>)
map<int64_t,create_info> queue;
/// pools that exist in the osdmap for which at least one pg has been created
std::set<int64_t> 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);
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<creating_pgs_t*>& 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);