From 8d991fa2c3fdbfd9178d93e4ca33d47504a37195 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 16 Oct 2013 10:07:37 -0700 Subject: [PATCH] OSD: check for splitting when processing recover/backfill reservations Fixes: 6565 Signed-off-by: Samuel Just Reviewed-by: Sage Weil (cherry picked from commit 15ec5332ba4154930a0447e2bcf1acec02691e97) --- src/osd/OSD.cc | 109 ++++++++++++++++++++++++++----------------------- 1 file changed, 59 insertions(+), 50 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index cceeeb7bb57e1..d4078dbc1aaa8 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -6359,6 +6359,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; @@ -6366,30 +6394,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(); } @@ -6403,38 +6408,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(); } -- 2.39.5