diff options
author | Sage Weil <sage@inktank.com> | 2013-08-27 15:01:02 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-08-27 15:42:45 -0700 |
commit | 7d44c08ee1c07a24182d31e0bc321dba0e76bacb (patch) | |
tree | cd2c493b3ccbebfee6f6aff822f85601462a2cf4 | |
parent | 63f05222f530f08dfa0cd881e71918630ea1f1db (diff) | |
download | ceph-7d44c08ee1c07a24182d31e0bc321dba0e76bacb.tar.gz |
osd/ReplicatedPG: do not requeue if not primary
This saves us a bit of work, since we will discard the op anyway if
we aren't primary (or even if we become primary again before we get to
it).
Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r-- | src/osd/ReplicatedPG.cc | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index a951c899493..238c2289de6 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -6798,17 +6798,27 @@ void ReplicatedPG::on_change(ObjectStore::Transaction *t) context_registry_on_change(); // requeue object waiters - requeue_ops(waiting_for_backfill_pos); - requeue_object_waiters(waiting_for_missing_object); + if (is_primary()) { + requeue_ops(waiting_for_backfill_pos); + requeue_object_waiters(waiting_for_missing_object); + } else { + waiting_for_backfill_pos.clear(); + waiting_for_missing_object.clear(); + } for (map<hobject_t,list<OpRequestRef> >::iterator p = waiting_for_degraded_object.begin(); p != waiting_for_degraded_object.end(); waiting_for_degraded_object.erase(p++)) { - requeue_ops(p->second); + if (is_primary()) + requeue_ops(p->second); + else + p->second.clear(); finish_degraded_object(p->first); } - requeue_ops(waiting_for_all_missing); - waiting_for_all_missing.clear(); + if (is_primary()) + requeue_ops(waiting_for_all_missing); + else + waiting_for_all_missing.clear(); // this will requeue ops we were working on but didn't finish, and // any dups |