]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
OSD: check for splitting when processing recover/backfill reservations
authorSamuel Just <sam.just@inktank.com>
Wed, 16 Oct 2013 17:07:37 +0000 (10:07 -0700)
committerSamuel Just <sam.just@inktank.com>
Thu, 17 Oct 2013 16:58:42 +0000 (09:58 -0700)
Fixes: 6565
Signed-off-by: Samuel Just <sam.just@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
src/osd/OSD.cc

index d450fd543e6b089f4fc56169ed235324d81cf411..fabe6da30b869586022ef13ff25ca1dd6ef03e2d 100644 (file)
@@ -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();
 }