diff options
author | Sage Weil <sage@inktank.com> | 2013-08-27 15:01:02 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-08-30 16:57:25 -0700 |
commit | 4f6c6b2d747860b1424e71fec59f781750c99553 (patch) | |
tree | 9f35f35cf3b44423b4858f0a3933e347a3667a5d | |
parent | b0a30a55eba6d646a04591fc038d2b1fce86f936 (diff) | |
download | ceph-4f6c6b2d747860b1424e71fec59f781750c99553.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 ccef49a81b9..0eee7b314e2 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -6785,17 +6785,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 |