// -- there was a change! --
pg->lock();
-
+
int oldrole = pg->get_role();
int oldprimary = pg->get_primary();
int oldacker = pg->get_acker();
// reset primary state?
if (oldrole == 0 || pg->get_role() == 0)
pg->clear_primary_state();
-
- // apply any repops in progress.
- if (oldacker == whoami) {
+
+ pg->on_change();
+ if (oldacker != pg->get_acker() && oldacker == whoami) {
pg->on_acker_change();
}
void ReplicatedPG::on_acker_change()
{
dout(10) << "on_acker_change" << dendl;
+}
- if (g_conf.osd_rep == OSD_REP_PRIMARY) {
- // we're fine.
- // note that note_failed_osd() above shoudl ahve implicitly acked/committed
- // from the failed guy.
- } else {
- // for splay or chain replication, any change is significant.
- // apply repops
- for (hash_map<tid_t,RepGather*>::iterator p = rep_gather.begin();
- p != rep_gather.end();
- p++) {
- if (!p->second->applied)
- apply_repop(p->second);
- delete p->second->op;
- delete p->second;
- }
- rep_gather.clear();
-
- // and repop waiters
- for (hash_map<tid_t, list<Message*> >::iterator p = waiting_for_repop.begin();
- p != waiting_for_repop.end();
- p++)
- for (list<Message*>::iterator pm = p->second.begin();
- pm != p->second.end();
- pm++)
- delete *pm;
- waiting_for_repop.clear();
+void ReplicatedPG::on_change()
+{
+ // apply repops
+ for (hash_map<tid_t,RepGather*>::iterator p = rep_gather.begin();
+ p != rep_gather.end();
+ p++) {
+ if (!p->second->applied)
+ apply_repop(p->second);
+ delete p->second->op;
+ delete p->second;
}
+ rep_gather.clear();
+
+ // and discard repop waiters (chain/splay artifact)
+ for (hash_map<tid_t, list<Message*> >::iterator p = waiting_for_repop.begin();
+ p != waiting_for_repop.end();
+ p++)
+ for (list<Message*>::iterator pm = p->second.begin();
+ pm != p->second.end();
+ pm++)
+ delete *pm;
+ waiting_for_repop.clear();
}