]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: populate last_epoch_split during build_initial_pg_history 16519/head
authorSage Weil <sage@redhat.com>
Mon, 24 Jul 2017 18:21:33 +0000 (14:21 -0400)
committerSage Weil <sage@redhat.com>
Mon, 24 Jul 2017 18:21:33 +0000 (14:21 -0400)
If we get a pg create and have to generate the pg_history_t fields,
populate the last_epoch_split field too.  This is needed discard ops sent
from before the last split.  Specifically, PG::can_discard_op() looks at
it when the client has the RESEND_ON_SPLIT feature bit.  If we don't
discard, we may run afoul of assertions later (e.g., that the object
belongs to the PG at all) or potentially process an op out of order.

Fixes: http://tracker.ceph.com/issues/20754
Signed-off-by: Sage Weil <sage@redhat.com>
src/osd/OSD.cc

index a5b7659af6f54aecfe6a0d8034ec5081ed645f55..f3044c05588a64c23f8dc63b1d6af1a53177cbda 100644 (file)
@@ -4401,6 +4401,11 @@ void OSD::build_initial_pg_history(
     if (acting_primary != new_acting_primary) {
       h->same_primary_since = e;
     }
+    if (pgid.pgid.is_split(lastmap->get_pg_num(pgid.pgid.pool()),
+                          osdmap->get_pg_num(pgid.pgid.pool()),
+                          nullptr)) {
+      h->last_epoch_split = e;
+    }
     lastmap = osdmap;
   }
   dout(20) << __func__ << " " << debug.str() << dendl;