]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: handle trim() during backfill and async recovery
authorNeha Ojha <nojha@redhat.com>
Mon, 16 Jul 2018 23:31:22 +0000 (16:31 -0700)
committerNeha Ojha <nojha@redhat.com>
Thu, 2 Aug 2018 17:54:08 +0000 (17:54 +0000)
Signed-off-by: Neha Ojha <nojha@redhat.com>
(cherry picked from commit e538c31f0f3133f811a8e478fcb25b575cad66bf)

src/osd/PG.cc
src/osd/PG.h
src/osd/PGLog.cc
src/osd/PGLog.h
src/osd/PrimaryLogPG.h

index c386e4c2fdcb514f6a3823d7ddac8365a327aeda..c3fb6ef7c133abd71e94c61c1c9709744eac342c 100644 (file)
@@ -3621,7 +3621,8 @@ void PG::append_log(
   eversion_t trim_to,
   eversion_t roll_forward_to,
   ObjectStore::Transaction &t,
-  bool transaction_applied)
+  bool transaction_applied,
+  bool async)
 {
   if (transaction_applied)
     update_snap_map(logv, t);
@@ -3676,7 +3677,12 @@ void PG::append_log(
 
   dout(10) << __func__ << " approx pg log length =  "
            << pg_log.get_log().approx_size() << dendl;
-  pg_log.trim(trim_to, info);
+  dout(10) << __func__ << " transaction_applied = "
+           << transaction_applied << dendl;
+  if (!transaction_applied || async)
+    dout(10) << __func__ << " " << pg_whoami
+             << " is async_recovery or backfill target" << dendl;
+  pg_log.trim(trim_to, info, transaction_applied, async);
 
   // update the local pg, pg log
   dirty_info = true;
index 31cda1b7128cfb6b3dbb78b4471a7d2d5483cfc0..136368a199021fce6c3e0e1efee866349d6e6924 100644 (file)
@@ -2885,7 +2885,8 @@ protected:
     eversion_t trim_to,
     eversion_t roll_forward_to,
     ObjectStore::Transaction &t,
-    bool transaction_applied = true);
+    bool transaction_applied = true,
+    bool async = false);
   bool check_log_for_corruption(ObjectStore *store);
   void trim_log();
 
index d5557fc93657ab180ec2ba1abe8bc52552637356..ef9426613e660f582dabccc65d26bc91ce384f0b 100644 (file)
@@ -161,13 +161,16 @@ void PGLog::clear_info_log(
 
 void PGLog::trim(
   eversion_t trim_to,
-  pg_info_t &info)
+  pg_info_t &info,
+  bool transaction_applied,
+  bool async)
 {
   dout(10) << __func__ << " proposed trim_to = " << trim_to << dendl;
   // trim?
   if (trim_to > log.tail) {
-    // We shouldn't be trimming the log past last_complete
-    assert(trim_to <= info.last_complete);
+    // Don't assert for async_recovery_targets or backfill_targets
+    if (transaction_applied && !async)
+      assert(trim_to <= info.last_complete);
 
     dout(10) << "trim " << log << " to " << trim_to << dendl;
     log.trim(cct, trim_to, &trimmed, &trimmed_dups, &write_from_dups);
index 7c016077324768f0d927c9aa878d7672e6171249..3ef21d553b5c0645143c4d075bcc1d1573785531 100644 (file)
@@ -704,7 +704,9 @@ public:
 
   void trim(
     eversion_t trim_to,
-    pg_info_t &info);
+    pg_info_t &info,
+    bool transaction_applied = true,
+    bool async = false);
 
   void roll_forward_to(
     eversion_t roll_forward_to,
index f4ee21b23c331084b449f8903da29998f621b90e..1d3737dfb56f9fba2fe41ba1c7f81c531147771e 100644 (file)
@@ -421,7 +421,7 @@ public:
     if (hset_history) {
       info.hit_set = *hset_history;
     }
-    append_log(logv, trim_to, roll_forward_to, t, transaction_applied);
+    append_log(logv, trim_to, roll_forward_to, t, transaction_applied, async);
   }
 
   void op_applied(const eversion_t &applied_version) override;