]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: check creating_pgs.last_scan_epoch instead when sending creates 17248/head
authorKefu Chai <kchai@redhat.com>
Fri, 25 Aug 2017 06:13:14 +0000 (14:13 +0800)
committerKefu Chai <kchai@redhat.com>
Fri, 25 Aug 2017 06:34:35 +0000 (14:34 +0800)
we cannot be sure that the creating_pgs_by_osd_epoch is in sync with
creating_pgs.pgs even if mapping.get_epoch() is less or equal to
creating_pgs_epoch. because, 1) the access to mapping.epoch is not
protected by lock, 2) even worse, the mapping might be not finished yet
when we are trying to send pg-creates to subscribers.

so instead of comparing creating_pgs_epoch with mapping's epoch, we
should compare it with creating_pgs.last_scan_epoch. the former is
updated once the creating_pgs_by_osd_epoch is updated with the latest
mapping's epoch and creating_pgs.pgs; the latter is updated with current
osdmap's epoch when creating_pgs is being updated with the inc osd map.
if we are using a creating_pgs_epoch in sync, creating_pgs_epoch should
be creating_pgs.last_scan_epoch + 1.

Fixes: http://tracker.ceph.com/issues/20785
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/mon/OSDMonitor.cc

index 96a6af543508bd8daa8fde4fd02333aefb40eea5..ac8ce7e852925124ce2ceb09aa2526474b325fa2 100644 (file)
@@ -3261,8 +3261,7 @@ epoch_t OSDMonitor::send_pg_creates(int osd, Connection *con, epoch_t next) cons
   dout(30) << __func__ << " osd." << osd << " next=" << next
           << " " << creating_pgs_by_osd_epoch << dendl;
   std::lock_guard<std::mutex> l(creating_pgs_lock);
-  if (creating_pgs_epoch == 0 ||
-      creating_pgs_epoch < mapping.get_epoch()) {
+  if (creating_pgs_epoch <= creating_pgs.last_scan_epoch) {
     dout(20) << __func__
             << " not using stale creating_pgs@" << creating_pgs_epoch << dendl;
     // the subscribers will be updated when the mapping is completed anyway