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-16 10:12:01 -0700 |
commit | 907a516fb5a84d2c3e96d5d39633a1b15ef8be60 (patch) | |
tree | 3e0e55155c1277d350661a6e5a538b1155b71bda | |
parent | a49d66895d19d50d9b761dee5adcb62f49dbd2d7 (diff) | |
download | ceph-907a516fb5a84d2c3e96d5d39633a1b15ef8be60.tar.gz |
OSD: check for splitting when processing recover/backfill reservationswip-6565
Fixes: 6565
Signed-off-by: Samuel Just <sam.just@inktank.com>
-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(); } |