struct pg_shard_t {
+ static const int32_t NO_OSD = 0x7fffffff;
int32_t osd;
shard_id_t shard;
pg_shard_t() : osd(-1), shard(shard_id_t::NO_SHARD) {}
bool is_undefined() const {
return osd == -1;
}
+ string get_osd() const { return (osd == NO_OSD ? "NONE" : to_string(osd)); }
void encode(bufferlist &bl) const;
void decode(bufferlist::iterator &bl);
void dump(Formatter *f) const {
#define PG_STATE_ACTIVE (1<<1) // i am active. (primary: replicas too)
#define PG_STATE_CLEAN (1<<2) // peers are complete, clean of stray replicas.
#define PG_STATE_DOWN (1<<4) // a needed replica is down, PG offline
-//#define PG_STATE_REPLAY (1<<5) // crashed, waiting for replay
-//#define PG_STATE_STRAY (1<<6) // i must notify the primary i exist.
+#define PG_STATE_RECOVERY_UNFOUND (1<<5) // recovery stopped due to unfound
+#define PG_STATE_BACKFILL_UNFOUND (1<<6) // backfill stopped due to unfound
//#define PG_STATE_SPLITTING (1<<7) // i am splitting
#define PG_STATE_SCRUBBING (1<<8) // scrubbing
//#define PG_STATE_SCRUBQ (1<<9) // queued for scrub
FLOOR(num_rd_kb);
FLOOR(num_wr);
FLOOR(num_wr_kb);
- FLOOR(num_scrub_errors);
FLOOR(num_shallow_scrub_errors);
FLOOR(num_deep_scrub_errors);
+ num_scrub_errors = num_shallow_scrub_errors + num_deep_scrub_errors;
FLOOR(num_objects_recovered);
FLOOR(num_bytes_recovered);
FLOOR(num_keys_recovered);
SPLIT(num_rd_kb);
SPLIT(num_wr);
SPLIT(num_wr_kb);
- SPLIT(num_scrub_errors);
- SPLIT(num_shallow_scrub_errors);
- SPLIT(num_deep_scrub_errors);
+ SPLIT_PRESERVE_NONZERO(num_shallow_scrub_errors);
+ SPLIT_PRESERVE_NONZERO(num_deep_scrub_errors);
+ for (unsigned i = 0; i < out.size(); ++i) {
+ out[i].num_scrub_errors = out[i].num_shallow_scrub_errors +
+ out[i].num_deep_scrub_errors;
+ }
SPLIT(num_objects_recovered);
SPLIT(num_bytes_recovered);
SPLIT(num_keys_recovered);
int32_t up_primary;
int32_t acting_primary;
+ // snaptrimq.size() is 64bit, but let's be serious - anything over 50k is
+ // absurd already, so cap it to 2^32 and save 4 bytes at the same time
+ uint32_t snaptrimq_len;
+
bool stats_invalid:1;
/// true if num_objects_dirty is not accurate (because it was not
/// maintained starting from pool creation)
mapping_epoch(0),
up_primary(-1),
acting_primary(-1),
+ snaptrimq_len(0),
stats_invalid(false),
dirty_stats_invalid(false),
omap_stats_invalid(false),
log_size = f;
if (ondisk_log_size < f)
ondisk_log_size = f;
+ if (snaptrimq_len < f)
+ snaptrimq_len = f;
}
void add(const pg_stat_t& o) {
stats.add(o.stats);
log_size += o.log_size;
ondisk_log_size += o.ondisk_log_size;
+ if (((uint64_t)snaptrimq_len + (uint64_t)o.snaptrimq_len) > (uint64_t)(1 << 31)) {
+ snaptrimq_len = 1 << 31;
+ } else {
+ snaptrimq_len += o.snaptrimq_len;
+ }
}
void sub(const pg_stat_t& o) {
stats.sub(o.stats);
log_size -= o.log_size;
ondisk_log_size -= o.ondisk_log_size;
+ if (o.snaptrimq_len < snaptrimq_len) {
+ snaptrimq_len -= o.snaptrimq_len;
+ } else {
+ snaptrimq_len = 0;
+ }
}
bool is_acting_osd(int32_t osd, bool primary) const;
static string get_flag_string(flag_t flags) {
string s;
+ vector<string> sv = get_flag_vector(flags);
+ for (auto ss : sv) {
+ s += string("|") + ss;
+ }
+ if (s.length())
+ return s.substr(1);
+ return s;
+ }
+ static vector<string> get_flag_vector(flag_t flags) {
+ vector<string> sv;
if (flags & FLAG_LOST)
- s += "|lost";
+ sv.insert(sv.end(), "lost");
if (flags & FLAG_WHITEOUT)
- s += "|whiteout";
+ sv.insert(sv.end(), "whiteout");
if (flags & FLAG_DIRTY)
- s += "|dirty";
+ sv.insert(sv.end(), "dirty");
if (flags & FLAG_USES_TMAP)
- s += "|uses_tmap";
+ sv.insert(sv.end(), "uses_tmap");
if (flags & FLAG_OMAP)
- s += "|omap";
+ sv.insert(sv.end(), "omap");
if (flags & FLAG_DATA_DIGEST)
- s += "|data_digest";
+ sv.insert(sv.end(), "data_digest");
if (flags & FLAG_OMAP_DIGEST)
- s += "|omap_digest";
+ sv.insert(sv.end(), "omap_digest");
if (flags & FLAG_CACHE_PIN)
- s += "|cache_pin";
+ sv.insert(sv.end(), "cache_pin");
if (flags & FLAG_MANIFEST)
- s += "|manifest";
- if (s.length())
- return s.substr(1);
- return s;
+ sv.insert(sv.end(), "manifest");
+ return sv;
}
string get_flag_string() const {
return get_flag_string(flags);