summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Farnum <greg@inktank.com>2013-10-22 15:56:14 -0700
committerGreg Farnum <greg@inktank.com>2013-10-22 15:56:14 -0700
commitf1cc48d76f0900ba4de743ec956350b87da61338 (patch)
tree8dca85b40d25d6fa4de5c4be482d7f0d066771a6
parent4e58411014b6c2b31e23091cd1499767fed667d3 (diff)
downloadceph-f1cc48d76f0900ba4de743ec956350b87da61338.tar.gz
fixup ReplicatedPG: PG: drop recovery locks when we successfully recover missing
Should have added these when we took them; whoops!
-rw-r--r--src/osd/PG.cc1
-rw-r--r--src/osd/ReplicatedPG.cc23
2 files changed, 21 insertions, 3 deletions
diff --git a/src/osd/PG.cc b/src/osd/PG.cc
index 8ba5b6cc2ff..539fb3284cb 100644
--- a/src/osd/PG.cc
+++ b/src/osd/PG.cc
@@ -402,6 +402,7 @@ bool PG::search_for_missing(const pg_info_t &oinfo, const pg_missing_t *omissing
map<hobject_t, list<OpRequestRef> >::iterator wmo =
waiting_for_missing_object.find(soid);
if (wmo != waiting_for_missing_object.end()) {
+ get_pgbackend()->get_parent()->drop_object_recovery_locks(wmo->first);
requeue_ops(wmo->second);
}
stats_updated = true;
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc
index dd9eee341f3..b6e3a0de3cd 100644
--- a/src/osd/ReplicatedPG.cc
+++ b/src/osd/ReplicatedPG.cc
@@ -170,10 +170,13 @@ void ReplicatedPG::on_local_recover(
t->register_on_applied_sync(new C_OSD_OndiskWriteUnlock(obc));
publish_stats_to_osd();
- if (waiting_for_missing_object.count(hoid)) {
+ map<hobject_t, list<OpRequestRef> >::iterator i =
+ waiting_for_missing_object.find(hoid);
+ if (i != waiting_for_missing_object.end()) {
dout(20) << " kicking waiters on " << hoid << dendl;
- requeue_ops(waiting_for_missing_object[hoid]);
- waiting_for_missing_object.erase(hoid);
+ requeue_ops(i->second);
+ drop_object_recovery_locks(i->first);
+ waiting_for_missing_object.erase(i);
if (pg_log.get_missing().missing.size() == 0) {
requeue_ops(waiting_for_all_missing);
waiting_for_all_missing.clear();
@@ -7074,6 +7077,7 @@ ObjectContextRef ReplicatedPG::mark_object_lost(ObjectStore::Transaction *t,
map<hobject_t, list<OpRequestRef> >::iterator wmo =
waiting_for_missing_object.find(oid);
if (wmo != waiting_for_missing_object.end()) {
+ drop_object_recovery_locks(wmo->first);
requeue_ops(wmo->second);
}
@@ -7345,11 +7349,24 @@ void ReplicatedPG::on_change(ObjectStore::Transaction *t)
// requeue object waiters
if (is_primary()) {
requeue_ops(waiting_for_backfill_pos);
+ map<hobject_t, list<OpRequestRef> >::iterator i;
+ for (waiting_for_missing_object.begin();
+ i != waiting_for_missing_object.end();
+ ++i) {
+ drop_object_recovery_locks(i->first);
+ }
requeue_object_waiters(waiting_for_missing_object);
} else {
waiting_for_backfill_pos.clear();
+ map<hobject_t, list<OpRequestRef> >::iterator i;
+ for (waiting_for_missing_object.begin();
+ i != waiting_for_missing_object.end();
+ ++i) {
+ drop_object_recovery_locks(i->first);
+ }
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++)) {