Treat misplaced and degraded as separate state parts

trace-sqes
Vitaliy Filippov 2020-03-22 20:36:29 +03:00
parent ddc3e927d3
commit a08e0bfacd
2 changed files with 13 additions and 32 deletions

View File

@ -4,28 +4,10 @@ void pg_t::remember_object(pg_obj_state_check_t &st, std::vector<obj_ver_role> &
{ {
auto & pg = *this; auto & pg = *this;
// Remember the decision // Remember the decision
uint64_t state = 0; uint64_t state = OBJ_CLEAN;
if (st.target_ver == 0) if (st.target_ver > 0)
{ {
st.has_roles = st.n_copies = st.n_roles = st.n_stable = st.n_matched = 0; if (st.n_roles < pg.pg_minsize)
st.ver_start = st.ver_end = st.obj_end;
state = OBJ_CLEAN;
}
else
{
if (st.n_roles == pg.pg_cursize)
{
if (st.n_matched == pg.pg_cursize)
{
state = OBJ_CLEAN;
}
else
{
state = OBJ_MISPLACED;
pg.state = pg.state | PG_HAS_MISPLACED;
}
}
else if (st.n_roles < pg.pg_minsize)
{ {
printf("Object is incomplete: inode=%lu stripe=%lu version=%lu/%lu\n", st.oid.inode, st.oid.stripe, st.target_ver, st.max_ver); printf("Object is incomplete: inode=%lu stripe=%lu version=%lu/%lu\n", st.oid.inode, st.oid.stripe, st.target_ver, st.max_ver);
for (int i = st.ver_start; i < st.ver_end; i++) for (int i = st.ver_start; i < st.ver_end; i++)
@ -35,7 +17,7 @@ void pg_t::remember_object(pg_obj_state_check_t &st, std::vector<obj_ver_role> &
state = OBJ_INCOMPLETE; state = OBJ_INCOMPLETE;
pg.state = pg.state | PG_HAS_INCOMPLETE; pg.state = pg.state | PG_HAS_INCOMPLETE;
} }
else else if (st.n_roles < pg.pg_cursize)
{ {
printf("Object is degraded: inode=%lu stripe=%lu version=%lu/%lu\n", st.oid.inode, st.oid.stripe, st.target_ver, st.max_ver); printf("Object is degraded: inode=%lu stripe=%lu version=%lu/%lu\n", st.oid.inode, st.oid.stripe, st.target_ver, st.max_ver);
for (int i = st.ver_start; i < st.ver_end; i++) for (int i = st.ver_start; i < st.ver_end; i++)
@ -45,9 +27,9 @@ void pg_t::remember_object(pg_obj_state_check_t &st, std::vector<obj_ver_role> &
state = OBJ_DEGRADED; state = OBJ_DEGRADED;
pg.state = pg.state | PG_HAS_DEGRADED; pg.state = pg.state | PG_HAS_DEGRADED;
} }
if (st.n_copies > pg.pg_size) if (st.n_mismatched > 0)
{ {
state |= OBJ_OVERCOPIED; state |= OBJ_MISPLACED;
pg.state = pg.state | PG_HAS_MISPLACED; pg.state = pg.state | PG_HAS_MISPLACED;
} }
if (st.n_stable < st.n_copies) if (st.n_stable < st.n_copies)
@ -214,7 +196,7 @@ void pg_t::calc_object_states()
st.last_ver = st.max_ver = all[i].version; st.last_ver = st.max_ver = all[i].version;
st.target_ver = 0; st.target_ver = 0;
st.ver_start = i; st.ver_start = i;
st.has_roles = st.n_copies = st.n_roles = st.n_stable = st.n_matched = 0; st.has_roles = st.n_copies = st.n_roles = st.n_stable = st.n_mismatched = 0;
} }
if (!st.target_ver && st.last_ver != all[i].version && (st.n_stable > 0 || st.n_roles >= pg.pg_minsize)) if (!st.target_ver && st.last_ver != all[i].version && (st.n_stable > 0 || st.n_roles >= pg.pg_minsize))
{ {
@ -227,7 +209,7 @@ void pg_t::calc_object_states()
if (st.last_ver != all[i].version) if (st.last_ver != all[i].version)
{ {
st.ver_start = i; st.ver_start = i;
st.has_roles = st.n_copies = st.n_roles = st.n_stable = st.n_matched = 0; st.has_roles = st.n_copies = st.n_roles = st.n_stable = st.n_mismatched = 0;
st.last_ver = all[i].version; st.last_ver = all[i].version;
} }
replica = (all[i].oid.stripe & STRIPE_MASK); replica = (all[i].oid.stripe & STRIPE_MASK);
@ -243,9 +225,9 @@ void pg_t::calc_object_states()
{ {
st.n_stable++; st.n_stable++;
} }
if (pg.cur_set[replica] == all[i].osd_num) if (pg.cur_set[replica] != all[i].osd_num)
{ {
st.n_matched++; st.n_mismatched++;
} }
if (!(st.has_roles & (1 << replica))) if (!(st.has_roles & (1 << replica)))
{ {

View File

@ -26,12 +26,11 @@
// OSD object states // OSD object states
#define OBJ_CLEAN 0x01 #define OBJ_CLEAN 0x01
#define OBJ_MISPLACED 0x02 #define OBJ_DEGRADED 0x02
#define OBJ_DEGRADED 0x03
#define OBJ_INCOMPLETE 0x04 #define OBJ_INCOMPLETE 0x04
#define OBJ_MISPLACED 0x08
#define OBJ_NEEDS_STABLE 0x10000 #define OBJ_NEEDS_STABLE 0x10000
#define OBJ_NEEDS_ROLLBACK 0x20000 #define OBJ_NEEDS_ROLLBACK 0x20000
#define OBJ_OVERCOPIED 0x40000
#define OBJ_BUGGY 0x80000 #define OBJ_BUGGY 0x80000
struct pg_obj_loc_t struct pg_obj_loc_t
@ -77,7 +76,7 @@ struct pg_obj_state_check_t
uint64_t max_ver = 0; uint64_t max_ver = 0;
uint64_t last_ver = 0; uint64_t last_ver = 0;
uint64_t target_ver = 0; uint64_t target_ver = 0;
uint64_t n_copies = 0, has_roles = 0, n_roles = 0, n_stable = 0, n_matched = 0; uint64_t n_copies = 0, has_roles = 0, n_roles = 0, n_stable = 0, n_mismatched = 0;
bool is_buggy = false, has_old_unstable = false; bool is_buggy = false, has_old_unstable = false;
pg_osd_set_t osd_set; pg_osd_set_t osd_set;
}; };