void PG::generate_past_intervals()
{
// Do we already have the intervals we want?
- map<epoch_t,Interval>::const_iterator pif = past_intervals.begin();
+ map<epoch_t,pg_interval_t>::const_iterator pif = past_intervals.begin();
if (pif != past_intervals.end()) {
if (pif->first <= info.history.last_epoch_clean) {
dout(10) << __func__ << ": already have past intervals back to "
break;
}
- Interval &i = past_intervals[first_epoch];
+ pg_interval_t &i = past_intervals[first_epoch];
i.first = first_epoch;
i.last = last_epoch;
i.up.swap(tup);
*/
void PG::trim_past_intervals()
{
- std::map<epoch_t,Interval>::iterator pif = past_intervals.begin();
- std::map<epoch_t,Interval>::iterator end = past_intervals.end();
+ std::map<epoch_t,pg_interval_t>::iterator pif = past_intervals.begin();
+ std::map<epoch_t,pg_interval_t>::iterator end = past_intervals.end();
while (pif != end) {
if (pif->second.last >= info.history.last_epoch_clean)
return;
generate_past_intervals();
// We need to decide who might have unfound objects that we need
- std::map<epoch_t,Interval>::const_reverse_iterator p = past_intervals.rbegin();
- std::map<epoch_t,Interval>::const_reverse_iterator end = past_intervals.rend();
+ std::map<epoch_t,pg_interval_t>::const_reverse_iterator p = past_intervals.rbegin();
+ std::map<epoch_t,pg_interval_t>::const_reverse_iterator end = past_intervals.rend();
for (; p != end; ++p) {
- const Interval &interval(p->second);
+ const pg_interval_t &interval(p->second);
// We already have all the objects that exist at last_epoch_clean,
// so there's no need to look at earlier intervals.
if (interval.last < info.history.last_epoch_clean)
{
bool crashed = false;
- for (map<epoch_t,Interval>::const_reverse_iterator p = past_intervals.rbegin();
+ for (map<epoch_t,pg_interval_t>::const_reverse_iterator p = past_intervals.rbegin();
p != past_intervals.rend();
p++) {
- const Interval &interval = p->second;
+ const pg_interval_t &interval = p->second;
dout(10) << "may_need_replay " << interval << dendl;
if (interval.last < info.history.last_epoch_started)
dirty_info = true;
} else if (acting != oldacting || up != oldup) {
// remember past interval
- PG::Interval& i = past_intervals[info.history.same_interval_since];
+ pg_interval_t& i = past_intervals[info.history.same_interval_since];
i.first = info.history.same_interval_since;
i.last = osdmap->get_epoch() - 1;
i.acting = oldacting;
* that interval.
*/
if (pg->info.history.last_epoch_started) {
- for (map<epoch_t,PG::Interval>::reverse_iterator p = pg->past_intervals.rbegin();
+ for (map<epoch_t,pg_interval_t>::reverse_iterator p = pg->past_intervals.rbegin();
p != pg->past_intervals.rend();
++p) {
if (p->first < pg->info.history.last_epoch_started)
break;
if (!p->second.maybe_went_rw)
continue;
- Interval& interval = p->second;
+ pg_interval_t& interval = p->second;
dout(10) << " last maybe_went_rw interval was " << interval << dendl;
OSDMapRef osdmap = pg->get_osdmap();
#define dout_prefix (*_dout << (debug_pg ? debug_pg->gen_prefix() : string()) << " PriorSet: ")
PG::PriorSet::PriorSet(const OSDMap &osdmap,
- const map<epoch_t, Interval> &past_intervals,
+ const map<epoch_t, pg_interval_t> &past_intervals,
const vector<int> &up,
const vector<int> &acting,
const pg_info_t &info,
for (unsigned i=0; i<up.size(); i++)
probe.insert(up[i]);
- for (map<epoch_t,Interval>::const_reverse_iterator p = past_intervals.rbegin();
+ for (map<epoch_t,pg_interval_t>::const_reverse_iterator p = past_intervals.rbegin();
p != past_intervals.rend();
p++) {
- const Interval &interval = p->second;
+ const pg_interval_t &interval = p->second;
dout(10) << "build_prior " << interval << dendl;
if (interval.last < info.history.last_epoch_started)
bool dirty_info, dirty_log;
public:
- struct Interval {
- vector<int> up, acting;
- epoch_t first, last;
- bool maybe_went_rw;
-
- Interval() : first(0), last(0), maybe_went_rw(false) {}
-
- void encode(bufferlist& bl) const {
- ENCODE_START(2, 2, bl);
- ::encode(first, bl);
- ::encode(last, bl);
- ::encode(up, bl);
- ::encode(acting, bl);
- ::encode(maybe_went_rw, bl);
- ENCODE_FINISH(bl);
- }
- void decode(bufferlist::iterator& bl) {
- DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, bl);
- ::decode(first, bl);
- ::decode(last, bl);
- ::decode(up, bl);
- ::decode(acting, bl);
- ::decode(maybe_went_rw, bl);
- DECODE_FINISH(bl);
- }
- void dump(Formatter *f) const {
- f->dump_unsigned("first", first);
- f->dump_unsigned("last", last);
- f->dump_int("maybe_went_rw", maybe_went_rw ? 1 : 0);
- f->open_array_section("up");
- for (vector<int>::const_iterator p = up.begin(); p != up.end(); ++p)
- f->dump_int("osd", *p);
- f->close_section();
- f->open_array_section("acting");
- for (vector<int>::const_iterator p = acting.begin(); p != acting.end(); ++p)
- f->dump_int("osd", *p);
- f->close_section();
- }
- static void generate_test_instances(list<Interval*>& o) {
- o.push_back(new Interval);
- o.push_back(new Interval);
- o.back()->up.push_back(1);
- o.back()->acting.push_back(2);
- o.back()->acting.push_back(3);
- o.back()->first = 4;
- o.back()->last = 5;
- o.back()->maybe_went_rw = true;
- }
- };
- WRITE_CLASS_ENCODER(Interval)
// pg state
pg_info_t info;
set<int> missing_loc_sources; // superset of missing_loc locations
interval_set<snapid_t> snap_collections;
- map<epoch_t,Interval> past_intervals;
+ map<epoch_t,pg_interval_t> past_intervals;
interval_set<snapid_t> snap_trimq;
bool pg_down; /// some down osds are included in @a cur; the DOWN pg state bit should be set.
PriorSet(const OSDMap &osdmap,
- const map<epoch_t, Interval> &past_intervals,
+ const map<epoch_t, pg_interval_t> &past_intervals,
const vector<int> &up,
const vector<int> &acting,
const pg_info_t &info,
utime_t expire) = 0;
};
-WRITE_CLASS_ENCODER(PG::Interval)
WRITE_CLASS_ENCODER(PG::OndiskLog)
-inline ostream& operator<<(ostream& out, const PG::Interval& i)
-{
- out << "interval(" << i.first << "-" << i.last << " " << i.up << "/" << i.acting;
- if (i.maybe_went_rw)
- out << " maybe_went_rw";
- out << ")";
- return out;
-}
-
ostream& operator<<(ostream& out, const PG& pg);
#endif
}
+// -- pg_interval_t --
+
+void pg_interval_t::encode(bufferlist& bl) const
+{
+ ENCODE_START(2, 2, bl);
+ ::encode(first, bl);
+ ::encode(last, bl);
+ ::encode(up, bl);
+ ::encode(acting, bl);
+ ::encode(maybe_went_rw, bl);
+ ENCODE_FINISH(bl);
+}
+
+void pg_interval_t::decode(bufferlist::iterator& bl)
+{
+ DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, bl);
+ ::decode(first, bl);
+ ::decode(last, bl);
+ ::decode(up, bl);
+ ::decode(acting, bl);
+ ::decode(maybe_went_rw, bl);
+ DECODE_FINISH(bl);
+}
+
+void pg_interval_t::dump(Formatter *f) const
+{
+ f->dump_unsigned("first", first);
+ f->dump_unsigned("last", last);
+ f->dump_int("maybe_went_rw", maybe_went_rw ? 1 : 0);
+ f->open_array_section("up");
+ for (vector<int>::const_iterator p = up.begin(); p != up.end(); ++p)
+ f->dump_int("osd", *p);
+ f->close_section();
+ f->open_array_section("acting");
+ for (vector<int>::const_iterator p = acting.begin(); p != acting.end(); ++p)
+ f->dump_int("osd", *p);
+ f->close_section();
+}
+
+void pg_interval_t::generate_test_instances(list<pg_interval_t*>& o)
+{
+ o.push_back(new pg_interval_t);
+ o.push_back(new pg_interval_t);
+ o.back()->up.push_back(1);
+ o.back()->acting.push_back(2);
+ o.back()->acting.push_back(3);
+ o.back()->first = 4;
+ o.back()->last = 5;
+ o.back()->maybe_went_rw = true;
+}
+
+ostream& operator<<(ostream& out, const pg_interval_t& i)
+{
+ out << "interval(" << i.first << "-" << i.last << " " << i.up << "/" << i.acting;
+ if (i.maybe_went_rw)
+ out << " maybe_went_rw";
+ out << ")";
+ return out;
+}
+
+
+
// -- pg_query_t --
void pg_query_t::dump(Formatter *f) const
}
+/**
+ * pg_interval_t - information about a past interval
+ */
+struct pg_interval_t {
+ vector<int> up, acting;
+ epoch_t first, last;
+ bool maybe_went_rw;
+
+ pg_interval_t() : first(0), last(0), maybe_went_rw(false) {}
+
+ void encode(bufferlist& bl) const;
+ void decode(bufferlist::iterator& bl);
+ void dump(Formatter *f) const;
+ static void generate_test_instances(list<pg_interval_t*>& o);
+};
+WRITE_CLASS_ENCODER(pg_interval_t)
+
+ostream& operator<<(ostream& out, const pg_interval_t& i);
+
+typedef map<epoch_t, pg_interval_t> pg_interval_map_t;
+
+
/**
* pg_query_t - used to ask a peer for information about a pg.
*
TYPE(CrushWrapper)
#include "osd/PG.h"
-TYPE(PG::Interval)
TYPE(PG::OndiskLog)
#include "osd/osd_types.h"
TYPE(pool_stat_t)
TYPE(pg_history_t)
TYPE(pg_info_t)
+TYPE(pg_interval_t)
TYPE(pg_query_t)
TYPE(pg_log_entry_t)
TYPE(pg_log_t)