diff options
author | Samuel Just <sam.just@inktank.com> | 2013-10-16 10:07:37 -0700 |
---|---|---|
committer | Samuel Just <sam.just@inktank.com> | 2013-10-17 09:58:42 -0700 |
commit | 15ec5332ba4154930a0447e2bcf1acec02691e97 (patch) | |
tree | d2ab328b44300f38b268fcb6c59d97556c16a28a /src/osd/OSD.cc | |
parent | ff8e6a763ab0b7a6df9c430a46b7dda4e80772c1 (diff) | |
download | ceph-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.cc | 109 |
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(); } |