]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
PG: do not block writes on async_recovery_targets
authorNeha Ojha <nojha@redhat.com>
Fri, 5 Jan 2018 20:32:23 +0000 (12:32 -0800)
committerNeha Ojha <nojha@redhat.com>
Wed, 14 Mar 2018 22:56:05 +0000 (15:56 -0700)
Signed-off-by: Neha Ojha <nojha@redhat.com>
src/osd/PrimaryLogPG.cc
src/osd/ReplicatedBackend.cc

index 8d3c709f67416d2756f55bfa8a5e3afd715b2444..14a92f28fbfb57fa1e3e90432cd070eed10221fe 100644 (file)
@@ -626,10 +626,15 @@ bool PrimaryLogPG::is_degraded_or_backfilling_object(const hobject_t& soid)
     if (*i == get_primary()) continue;
     pg_shard_t peer = *i;
     auto peer_missing_entry = peer_missing.find(peer);
+    // If an object is missing on an async_recovery_target, return false.
+    // This will not block the op and the object is async recovered later.
     if (peer_missing_entry != peer_missing.end() &&
-       peer_missing_entry->second.get_items().count(soid))
-      return true;
-
+       peer_missing_entry->second.get_items().count(soid)) {
+      if (async_recovery_targets.count(peer))
+       return false;
+      else
+       return true;
+    }
     // Object is degraded if after last_backfill AND
     // we are backfilling it
     if (is_backfill_targets(peer) &&
@@ -10073,6 +10078,15 @@ void PrimaryLogPG::issue_repop(RepGather *repop, OpContext *ctx)
     repop->rep_tid,
     ctx->reqid,
     ctx->op);
+
+  for (set<pg_shard_t>::iterator i = async_recovery_targets.begin();
+       i != async_recovery_targets.end();
+       ++i) {
+    if (*i == get_primary() || !peer_missing[*i].is_missing(soid)) continue;
+    for (auto &&entry: ctx->log) {
+      peer_missing[*i].add_next_event(entry);
+    }
+  }
 }
 
 PrimaryLogPG::RepGather *PrimaryLogPG::new_repop(
index 43782872a6f8a794dd292dd3be91713fef64b7a7..b9b31bc46d879ccbfc6300b037f55d51154effa4 100644 (file)
@@ -1004,9 +1004,6 @@ void ReplicatedBackend::do_repop(OpRequestRef op)
   // sanity checks
   assert(m->map_epoch >= get_info().history.same_interval_since);
 
-  // we better not be missing this.
-  assert(!parent->get_log().get_missing().is_missing(soid));
-
   parent->maybe_preempt_replica_scrub(soid);
 
   int ackerosd = m->get_source().num();