From d296120c144a62794483338fd696ca8089778e84 Mon Sep 17 00:00:00 2001 From: Josh Durgin Date: Mon, 20 Oct 2014 13:29:13 -0700 Subject: [PATCH] Objecter: resend linger ops on any interval change Watch/notify ops need to be resent after a pg split occurs, as well as a few other circumstances that the existing objecter checks did not catch. Refactor the check the OSD uses for this to add a version taking the more basic types instead of the whole OSD map, and stash the needed info when an op is sent. Fixes: #9806 Backport: giant, firefly, dumpling Signed-off-by: Josh Durgin (cherry picked from commit cb9262abd7fd5f0a9f583bd34e4c425a049e56ce) Conflicts: src/osd/osd_types.cc src/osdc/Objecter.cc Minor differences. --- src/osd/osd_types.cc | 43 +++++++++++++++++++++++++++++++++++-------- src/osd/osd_types.h | 19 +++++++++++++++++++ src/osdc/Objecter.cc | 43 ++++++++++++++++++++++++++++++++++--------- src/osdc/Objecter.h | 13 ++++++++++--- 4 files changed, 98 insertions(+), 20 deletions(-) diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 087236124f3..e05ac93271f 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -2205,19 +2205,46 @@ bool pg_interval_t::is_new_interval( int new_up_primary, const vector &old_up, const vector &new_up, - OSDMapRef osdmap, - OSDMapRef lastmap, - int64_t pool_id, + int old_min_size, + int new_min_size, + unsigned old_pg_num, + unsigned new_pg_num, pg_t pgid) { return old_acting_primary != new_acting_primary || new_acting != old_acting || old_up_primary != new_up_primary || new_up != old_up || - (!(lastmap->get_pools().count(pool_id))) || - (lastmap->get_pools().find(pool_id)->second.min_size != - osdmap->get_pools().find(pool_id)->second.min_size) || - pgid.is_split(lastmap->get_pg_num(pgid.pool()), - osdmap->get_pg_num(pgid.pool()), 0); + old_min_size != new_min_size || + pgid.is_split(old_pg_num, new_pg_num, 0); +} + +bool pg_interval_t::is_new_interval( + int old_acting_primary, + int new_acting_primary, + const vector &old_acting, + const vector &new_acting, + int old_up_primary, + int new_up_primary, + const vector &old_up, + const vector &new_up, + OSDMapRef osdmap, + OSDMapRef lastmap, + int64_t pool_id, + pg_t pgid) { + return !(lastmap->get_pools().count(pgid.pool())) || + is_new_interval(old_acting_primary, + new_acting_primary, + old_acting, + new_acting, + old_up_primary, + new_up_primary, + old_up, + new_up, + lastmap->get_pools().find(pgid.pool())->second.min_size, + osdmap->get_pools().find(pgid.pool())->second.min_size, + lastmap->get_pg_num(pgid.pool()), + osdmap->get_pg_num(pgid.pool()), + pgid); } bool pg_interval_t::check_new_interval( diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 6e60cc8714e..00c8178a2a7 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1752,6 +1752,25 @@ struct pg_interval_t { void dump(Formatter *f) const; static void generate_test_instances(list& o); + /** + * Determines whether there is an interval change + */ + static bool is_new_interval( + int old_acting_primary, + int new_acting_primary, + const vector &old_acting, + const vector &new_acting, + int old_up_primary, + int new_up_primary, + const vector &old_up, + const vector &new_up, + int old_min_size, + int new_min_size, + unsigned old_pg_num, + unsigned new_pg_num, + pg_t pgid + ); + /** * Determines whether there is an interval change */ diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 649c61ce5c5..17c9b82426a 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -1483,9 +1483,29 @@ int Objecter::calc_target(op_target_t *t, bool any_change) if (ret == -ENOENT) return RECALC_OP_TARGET_POOL_DNE; } - int primary; - vector acting; - osdmap->pg_to_acting_osds(pgid, &acting, &primary); + + int min_size = pi->min_size; + unsigned pg_num = pi->get_pg_num(); + int up_primary, acting_primary; + vector up, acting; + osdmap->pg_to_up_acting_osds(pgid, &up, &up_primary, + &acting, &acting_primary); + if (any_change && pg_interval_t::is_new_interval( + t->acting_primary, + acting_primary, + t->acting, + acting, + t->up_primary, + up_primary, + t->up, + up, + t->min_size, + min_size, + t->pg_num, + pg_num, + pi->raw_pg_to_pg(pgid))) { + force_resend = true; + } bool need_resend = false; @@ -1497,15 +1517,20 @@ int Objecter::calc_target(op_target_t *t, bool any_change) if (t->pgid != pgid || is_pg_changed( - t->primary, t->acting, primary, acting, t->used_replica || any_change) || + t->acting_primary, t->acting, acting_primary, acting, + t->used_replica || any_change) || force_resend) { t->pgid = pgid; t->acting = acting; - t->primary = primary; - ldout(cct, 10) << __func__ << " pgid " << pgid - << " acting " << acting << dendl; + t->acting_primary = acting_primary; + t->up_primary = up_primary; + t->up = up; + t->min_size = min_size; + t->pg_num = pg_num; + ldout(cct, 10) << __func__ << " " + << " pgid " << pgid << " acting " << acting << dendl; t->used_replica = false; - if (primary == -1) { + if (acting_primary == -1) { t->osd = -1; } else { int osd; @@ -1541,7 +1566,7 @@ int Objecter::calc_target(op_target_t *t, bool any_change) assert(best >= 0); osd = acting[best]; } else { - osd = primary; + osd = acting_primary; } t->osd = osd; } diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 2ede888a948..ad4b9e29ca3 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -1072,8 +1072,12 @@ public: pg_t base_pgid; ///< explciti pg target, if any pg_t pgid; ///< last pg we mapped to - vector acting; ///< acting for last pg we mapped to - int primary; ///< primary for last pg we mapped to + unsigned pg_num; ///< last pg_num we mapped to + vector up; ///< set of up osds for last pg we mapped to + vector acting; ///< set of acting osds for last pg we mapped to + int up_primary; ///< primary for last pg we mapped to based on the up set + int acting_primary; ///< primary for last pg we mapped to based on the acting set + int min_size; ///< the min size of the pool when were were last mapped bool used_replica; bool paused; @@ -1085,7 +1089,10 @@ public: base_oid(oid), base_oloc(oloc), precalc_pgid(false), - primary(-1), + pg_num(0), + up_primary(-1), + acting_primary(-1), + min_size(-1), used_replica(false), paused(false), osd(-1) -- 2.47.3