If we have a change in the prior set, but not in the up/acting set, we go back
through Reset in order to reset peering state. Previously, we would reset
last_peering_reset in the Reset constructor. This did not, however, reset the
flush_interval, which caused the eventual flush event to be ignored and the
peering messages to not be sent.
Instead, we will always reset_interval_flush if we are actually changing the
last_peering_reset value.
Fixes: #9821
Backport: firefly
Signed-off-by: Samuel Just <sam.just@inktank.com>
(cherry picked from commit
d9ff3a6b789c5b9c77aefa3751bd808f5d7b8ca7)
void PG::set_last_peering_reset()
{
dout(20) << "set_last_peering_reset " << get_osdmap()->get_epoch() << dendl;
- last_peering_reset = get_osdmap()->get_epoch();
+ if (last_peering_reset != get_osdmap()->get_epoch()) {
+ last_peering_reset = get_osdmap()->get_epoch();
+ reset_interval_flush();
+ }
}
struct FlushState {
const OSDMapRef osdmap = get_osdmap();
set_last_peering_reset();
- reset_interval_flush();
vector<int> oldacting, oldup;
int oldrole = get_role();