]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
PrimaryLogPG: drop replica obc cache upon repop
authorSamuel Just <sjust@redhat.com>
Sat, 7 Dec 2019 00:37:27 +0000 (16:37 -0800)
committerSamuel Just <sjust@redhat.com>
Fri, 20 Dec 2019 01:35:37 +0000 (17:35 -0800)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/common/shared_cache.hpp
src/osd/PrimaryLogPG.cc
src/osd/PrimaryLogPG.h

index b8623d9de09e36a2e94f34481e3678ebc3f9ecc6..5b860fad729b5cf207a1f22420dc664fabc4ce8d 100644 (file)
@@ -172,6 +172,23 @@ public:
     }
   }
 
+  /* Clears weakrefs in the interval [from, to] -- note that to is inclusive */
+  void clear_range(
+    const K& from,
+    const K& to) {
+    list<VPtr> vals; // release any refs we have after we drop the lock
+    {
+      std::lock_guard l{lock};
+      auto from_iter = weak_refs.lower_bound(from);
+      auto to_iter = weak_refs.upper_bound(to);
+      for (auto i = from_iter; i != to_iter; ) {
+       vals.push_back(i->second.first.lock());
+       lru_remove((i++)->first);
+      }
+    }
+  }
+
+
   void purge(const K &key) {
     VPtr val; // release any ref we have after we drop the lock
     {
index 6e77d927851c51edc1a55e3fd9c89d24e5629aa5..b7ce5dca3a61b4fe1adf7c56f65a44f3b42f6971 100644 (file)
@@ -491,6 +491,20 @@ void PrimaryLogPG::schedule_recovery_work(
   osd->queue_recovery_context(this, c);
 }
 
+void PrimaryLogPG::replica_clear_repop_obc(
+  const vector<pg_log_entry_t> &logv,
+  ObjectStore::Transaction &t)
+{
+  for (auto &&e: logv) {
+    /* Have to blast all clones, they share a snapset */
+    object_contexts.clear_range(
+      e.soid.get_object_boundary(), e.soid.get_head());
+    ceph_assert(
+      snapset_contexts.find(e.soid.get_head()) ==
+      snapset_contexts.end());
+  }
+}
+
 bool PrimaryLogPG::should_send_op(
   pg_shard_t peer,
   const hobject_t &hoid) {
index 4ca01b2f61ebefce52485902f88674306fedb0bc..c8ba20b966014fd3ad5527e4c2ffb9cd018041ea 100644 (file)
@@ -474,11 +474,18 @@ public:
       projected_log.skip_can_rollback_to_to_head();
       projected_log.trim(cct, last->version, nullptr, nullptr, nullptr);
     }
+    if (!is_primary() && !is_ec_pg()) {
+      replica_clear_repop_obc(logv, t);
+    }
     recovery_state.append_log(
       logv, trim_to, roll_forward_to, min_last_complete_ondisk,
       t, transaction_applied, async);
   }
 
+  void replica_clear_repop_obc(
+    const vector<pg_log_entry_t> &logv,
+    ObjectStore::Transaction &t);
+
   void op_applied(const eversion_t &applied_version) override;
 
   bool should_send_op(