From f20f7a23e913d09cc7fc22fb3df07f9938ddc144 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Fri, 21 Aug 2015 11:32:39 -0400 Subject: [PATCH] Objecter: pg_interval_t::is_new_interval needs pgid from previous pool When increasing the pg_num of a pool, an assert would fail since the calculated pgid seed would be for the pool's new pg_num value instead of the previous pg_num value. Fixes: #10399 Backport: infernalis, hammer, firefly Signed-off-by: Jason Dillaman --- src/osdc/Objecter.cc | 4 +++- src/osdc/Objecter.h | 26 ++++++++++++++------------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 16c75fa77ee7a..709ddc0f22d23 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -2482,6 +2482,7 @@ int Objecter::_calc_target(op_target_t *t, epoch_t *last_force_resend, bool any osdmap->pg_to_up_acting_osds(pgid, &up, &up_primary, &acting, &acting_primary); bool sort_bitwise = osdmap->test_flag(CEPH_OSDMAP_SORTBITWISE); + unsigned prev_seed = ceph_stable_mod(pgid.ps(), t->pg_num, t->pg_num_mask); if (any_change && pg_interval_t::is_new_interval( t->acting_primary, acting_primary, @@ -2499,7 +2500,7 @@ int Objecter::_calc_target(op_target_t *t, epoch_t *last_force_resend, bool any pg_num, t->sort_bitwise, sort_bitwise, - pi->raw_pg_to_pg(pgid))) { + pg_t(prev_seed, pgid.pool(), pgid.preferred()))) { force_resend = true; } @@ -2524,6 +2525,7 @@ int Objecter::_calc_target(op_target_t *t, epoch_t *last_force_resend, bool any t->size = size; t->min_size = min_size; t->pg_num = pg_num; + t->pg_num_mask = pi->get_pg_num_mask(); t->sort_bitwise = sort_bitwise; ldout(cct, 10) << __func__ << " " << " pgid " << pgid << " acting " << acting << dendl; diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 9e1da17b4844b..232643a376879 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -1123,18 +1123,19 @@ public: object_t target_oid; object_locator_t target_oloc; - bool precalc_pgid; ///< true if we are directed at base_pgid, not base_oid - pg_t base_pgid; ///< explciti pg target, if any - - pg_t pgid; ///< 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 size; ///< the size of the pool when were were last mapped - int min_size; ///< the min size of the pool when were were last mapped - bool sort_bitwise; ///< whether the hobject_t sort order is bitwise + bool precalc_pgid; ///< true if we are directed at base_pgid, not base_oid + pg_t base_pgid; ///< explciti pg target, if any + + pg_t pgid; ///< last pg we mapped to + unsigned pg_num; ///< last pg_num we mapped to + unsigned pg_num_mask; ///< last pg_num_mask 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 size; ///< the size of the pool when were were last mapped + int min_size; ///< the min size of the pool when were were last mapped + bool sort_bitwise; ///< whether the hobject_t sort order is bitwise bool used_replica; bool paused; @@ -1147,6 +1148,7 @@ public: base_oloc(oloc), precalc_pgid(false), pg_num(0), + pg_num_mask(0), up_primary(-1), acting_primary(-1), size(-1), -- 2.39.5