]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: Better handle failure to get enough EC shards to backfill
authorDavid Zafman <dzafman@redhat.com>
Wed, 4 Oct 2017 01:32:20 +0000 (18:32 -0700)
committerDavid Zafman <dzafman@redhat.com>
Fri, 3 Nov 2017 02:02:50 +0000 (19:02 -0700)
Fixes: http://tracker.ceph.com/issues/18162
Signed-off-by: David Zafman <dzafman@redhat.com>
(cherry picked from commit 6a02bfef3d44a13589c1a90bec29ff0ac64f97aa)

Conflicts:
src/osd/PGBackend.h (trivial)
src/osd/ReplicatedPG.cc (trivial)
src/osd/ReplicatedPG.h (trivial)

src/osd/ECBackend.cc
src/osd/PGBackend.h
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 1453520858930612554cc1b954395826acbc9b9e..e1d1d3e0531e20406c4f914da253fcc088899270 100644 (file)
@@ -196,6 +196,7 @@ void ECBackend::_failed_push(const hobject_t &hoid,
   dout(10) << __func__ << ": canceling recovery op for obj " << hoid
           << dendl;
   assert(recovery_ops.count(hoid));
+  eversion_t v = recovery_ops[hoid].v;
   recovery_ops.erase(hoid);
 
   list<pg_shard_t> fl;
@@ -203,6 +204,8 @@ void ECBackend::_failed_push(const hobject_t &hoid,
     fl.push_back(i.first);
   }
   get_parent()->failed_push(fl, hoid);
+  get_parent()->backfill_add_missing(hoid, v);
+  get_parent()->finish_degraded_object(hoid);
 }
 
 struct OnRecoveryReadComplete :
index 2fee7a2f66bb1c8d7a67402b2bedf2e7eb99f223..e73d6afdfbd55283e3ae3ad2906b659db7fca4ef 100644 (file)
@@ -97,8 +97,14 @@ struct inconsistent_obj_wrapper;
 
      virtual void failed_push(const list<pg_shard_t> &from, const hobject_t &soid) = 0;
      
+     virtual void finish_degraded_object(const hobject_t& oid) = 0;
      virtual void cancel_pull(const hobject_t &soid) = 0;
 
+     virtual void backfill_add_missing(
+       const hobject_t &oid,
+       eversion_t v
+       ) = 0;
+
      /**
       * Bless a context
       *
index d85c5c4acc37989e730ae2a32f0b72fcdbf7bce4..93586c42c6b59192172d79bd7ac4269969719a5f 100644 (file)
@@ -356,6 +356,15 @@ void ReplicatedPG::send_message_osd_cluster(
   osd->send_message_osd_cluster(m, con);
 }
 
+void ReplicatedPG::backfill_add_missing(
+  const hobject_t &oid,
+  eversion_t v)
+{
+  dout(0) << __func__ << ": oid " << oid << " version " << v << dendl;
+  backfills_in_flight.erase(oid);
+  missing_loc.add_missing(oid, v, eversion_t());
+}
+
 ConnectionRef ReplicatedPG::get_con_osd_cluster(
   int peer, epoch_t from_epoch)
 {
index d0a217207a7286bace11c6049ec09db2df3c1cf7..169d89876805d2e546746c3c9134fa7f1b023f57 100644 (file)
@@ -282,6 +282,7 @@ public:
     const object_stat_sum_t &stat_diff);
   void failed_push(const list<pg_shard_t> &from, const hobject_t &soid) override;
   void cancel_pull(const hobject_t &soid);
+  void backfill_add_missing(const hobject_t &oid, eversion_t v) override;
 
   template <typename T>
   class BlessedGenContext : public GenContext<T> {