]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
PGLog,PG: reset can_rollback_to when we get a log entry without a transaction
authorSamuel Just <sam.just@inktank.com>
Thu, 9 Jan 2014 03:22:21 +0000 (19:22 -0800)
committerSamuel Just <sam.just@inktank.com>
Wed, 22 Jan 2014 22:39:16 +0000 (14:39 -0800)
We cannot rollback past an entry which we didn't actually
apply locally.

Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/PG.cc
src/osd/PG.h
src/osd/PGBackend.h
src/osd/PGLog.h
src/osd/ReplicatedPG.h

index c504aa2f2de2224110f00f15cbb6e0b72b4fa462..a138b7ee85f8e7ae49d76489b43051207ddb8cbe 100644 (file)
@@ -2337,9 +2337,9 @@ void PG::add_log_entry(pg_log_entry_t& e, bufferlist& log_bl)
 
 void PG::append_log(
   vector<pg_log_entry_t>& logv, eversion_t trim_to, ObjectStore::Transaction &t,
-  bool do_update_snap_map)
+  bool transaction_applied)
 {
-  if (do_update_snap_map)
+  if (transaction_applied)
     update_snap_map(logv, t);
   dout(10) << "append_log " << pg_log.get_log() << " " << logv << dendl;
 
@@ -2350,6 +2350,8 @@ void PG::append_log(
     p->offset = 0;
     add_log_entry(*p, keys[p->get_key_name()]);
   }
+  if (!transaction_applied)
+    pg_log.clear_can_rollback_to();
 
   dout(10) << "append_log  adding " << keys.size() << " keys" << dendl;
   t.omap_setkeys(coll_t::META_COLL, log_oid, keys);
index b397802e38f46ae8e1adb0ebf0b070dc1e946691..10b664a6b0184d35c28df3e75dfa571caa48ef61 100644 (file)
@@ -1818,7 +1818,7 @@ public:
   void add_log_entry(pg_log_entry_t& e, bufferlist& log_bl);
   void append_log(
     vector<pg_log_entry_t>& logv, eversion_t trim_to, ObjectStore::Transaction &t,
-    bool update_snap_map = true);
+    bool transaction_applied = true);
   bool check_log_for_corruption(ObjectStore *store);
   void trim_peers();
 
index 43c1312d818e05b191758eed284ec0fa191a06ff..66456320926b1f3757940015d5258b7ea1393247 100644 (file)
      virtual void log_operation(
        vector<pg_log_entry_t> &logv,
        const eversion_t &trim_to,
-       bool update_snaps,
+       bool transaction_applied,
        ObjectStore::Transaction *t) = 0;
 
      virtual void update_peer_last_complete_ondisk(
index 6c8cc09851685d3c1f1b186120cac020feab4bdc..8ede93e1a53c10b533202c80142d16bde7a30111 100644 (file)
@@ -323,6 +323,10 @@ public:
     eversion_t trim_to,
     pg_info_t &info);
 
+  void clear_can_rollback_to() {
+    log.can_rollback_to = log.head;
+  }
+
   //////////////////// get or set log & missing ////////////////////
 
   void claim_log(const pg_log_t &o) {
index e3d23a388516f3ea519cc3e00f45bf8d53866f35..6cf4af74fe387bb72c5d6f38fe48d55f2bd2dff6 100644 (file)
@@ -327,9 +327,9 @@ public:
   void log_operation(
     vector<pg_log_entry_t> &logv,
     const eversion_t &trim_to,
-    bool update_snaps,
+    bool transaction_applied,
     ObjectStore::Transaction *t) {
-    append_log(logv, trim_to, *t, update_snaps);
+    append_log(logv, trim_to, *t, transaction_applied);
   }
 
   void op_applied(