summaryrefslogtreecommitdiff
path: root/src/osd/OSD.cc
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-10-16 10:07:37 -0700
committerSamuel Just <sam.just@inktank.com>2013-10-17 09:58:42 -0700
commit15ec5332ba4154930a0447e2bcf1acec02691e97 (patch)
treed2ab328b44300f38b268fcb6c59d97556c16a28a /src/osd/OSD.cc
parentff8e6a763ab0b7a6df9c430a46b7dda4e80772c1 (diff)
downloadceph-15ec5332ba4154930a0447e2bcf1acec02691e97.tar.gz
OSD: check for splitting when processing recover/backfill reservations
Fixes: 6565 Signed-off-by: Samuel Just <sam.just@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
Diffstat (limited to 'src/osd/OSD.cc')
-rw-r--r--src/osd/OSD.cc109
1 files changed, 59 insertions, 50 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index d450fd543e6..fabe6da30b8 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -6397,6 +6397,34 @@ void OSD::handle_pg_backfill_reserve(OpRequestRef op)
if (!require_same_or_newer_map(op, m->query_epoch))
return;
+ PG::CephPeeringEvtRef evt;
+ if (m->type == MBackfillReserve::REQUEST) {
+ evt = PG::CephPeeringEvtRef(
+ new PG::CephPeeringEvt(
+ m->query_epoch,
+ m->query_epoch,
+ PG::RequestBackfillPrio(m->priority)));
+ } else if (m->type == MBackfillReserve::GRANT) {
+ evt = PG::CephPeeringEvtRef(
+ new PG::CephPeeringEvt(
+ m->query_epoch,
+ m->query_epoch,
+ PG::RemoteBackfillReserved()));
+ } else if (m->type == MBackfillReserve::REJECT) {
+ evt = PG::CephPeeringEvtRef(
+ new PG::CephPeeringEvt(
+ m->query_epoch,
+ m->query_epoch,
+ PG::RemoteReservationRejected()));
+ } else {
+ assert(0);
+ }
+
+ if (service.splitting(m->pgid)) {
+ peering_wait_for_split[m->pgid].push_back(evt);
+ return;
+ }
+
PG *pg = 0;
if (!_have_pg(m->pgid))
return;
@@ -6404,30 +6432,7 @@ void OSD::handle_pg_backfill_reserve(OpRequestRef op)
pg = _lookup_lock_pg(m->pgid);
assert(pg);
- if (m->type == MBackfillReserve::REQUEST) {
- pg->queue_peering_event(
- PG::CephPeeringEvtRef(
- new PG::CephPeeringEvt(
- m->query_epoch,
- m->query_epoch,
- PG::RequestBackfillPrio(m->priority))));
- } else if (m->type == MBackfillReserve::GRANT) {
- pg->queue_peering_event(
- PG::CephPeeringEvtRef(
- new PG::CephPeeringEvt(
- m->query_epoch,
- m->query_epoch,
- PG::RemoteBackfillReserved())));
- } else if (m->type == MBackfillReserve::REJECT) {
- pg->queue_peering_event(
- PG::CephPeeringEvtRef(
- new PG::CephPeeringEvt(
- m->query_epoch,
- m->query_epoch,
- PG::RemoteReservationRejected())));
- } else {
- assert(0);
- }
+ pg->queue_peering_event(evt);
pg->unlock();
}
@@ -6441,38 +6446,42 @@ void OSD::handle_pg_recovery_reserve(OpRequestRef op)
if (!require_same_or_newer_map(op, m->query_epoch))
return;
- PG *pg = 0;
- if (!_have_pg(m->pgid))
- return;
-
- pg = _lookup_lock_pg(m->pgid);
- if (!pg)
- return;
-
+ PG::CephPeeringEvtRef evt;
if (m->type == MRecoveryReserve::REQUEST) {
- pg->queue_peering_event(
- PG::CephPeeringEvtRef(
- new PG::CephPeeringEvt(
- m->query_epoch,
- m->query_epoch,
- PG::RequestRecovery())));
+ evt = PG::CephPeeringEvtRef(
+ new PG::CephPeeringEvt(
+ m->query_epoch,
+ m->query_epoch,
+ PG::RequestRecovery()));
} else if (m->type == MRecoveryReserve::GRANT) {
- pg->queue_peering_event(
- PG::CephPeeringEvtRef(
- new PG::CephPeeringEvt(
- m->query_epoch,
- m->query_epoch,
- PG::RemoteRecoveryReserved())));
+ evt = PG::CephPeeringEvtRef(
+ new PG::CephPeeringEvt(
+ m->query_epoch,
+ m->query_epoch,
+ PG::RemoteRecoveryReserved()));
} else if (m->type == MRecoveryReserve::RELEASE) {
- pg->queue_peering_event(
- PG::CephPeeringEvtRef(
- new PG::CephPeeringEvt(
- m->query_epoch,
- m->query_epoch,
- PG::RecoveryDone())));
+ evt = PG::CephPeeringEvtRef(
+ new PG::CephPeeringEvt(
+ m->query_epoch,
+ m->query_epoch,
+ PG::RecoveryDone()));
} else {
assert(0);
}
+
+ if (service.splitting(m->pgid)) {
+ peering_wait_for_split[m->pgid].push_back(evt);
+ return;
+ }
+
+ PG *pg = 0;
+ if (!_have_pg(m->pgid))
+ return;
+
+ pg = _lookup_lock_pg(m->pgid);
+ assert(pg);
+
+ pg->queue_peering_event(evt);
pg->unlock();
}