From: Samuel Just Date: Thu, 9 Jan 2014 03:22:21 +0000 (-0800) Subject: PGLog,PG: reset can_rollback_to when we get a log entry without a transaction X-Git-Tag: v0.78~286^2~23 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a3e4a844efd0fd74fdfc99b92770e08b4a19cf79;p=ceph.git PGLog,PG: reset can_rollback_to when we get a log entry without a transaction We cannot rollback past an entry which we didn't actually apply locally. Signed-off-by: Samuel Just --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index c504aa2f2de..a138b7ee85f 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2337,9 +2337,9 @@ void PG::add_log_entry(pg_log_entry_t& e, bufferlist& log_bl) void PG::append_log( vector& 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); diff --git a/src/osd/PG.h b/src/osd/PG.h index b397802e38f..10b664a6b01 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -1818,7 +1818,7 @@ public: void add_log_entry(pg_log_entry_t& e, bufferlist& log_bl); void append_log( vector& 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(); diff --git a/src/osd/PGBackend.h b/src/osd/PGBackend.h index 43c1312d818..66456320926 100644 --- a/src/osd/PGBackend.h +++ b/src/osd/PGBackend.h @@ -129,7 +129,7 @@ virtual void log_operation( vector &logv, const eversion_t &trim_to, - bool update_snaps, + bool transaction_applied, ObjectStore::Transaction *t) = 0; virtual void update_peer_last_complete_ondisk( diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h index 6c8cc098516..8ede93e1a53 100644 --- a/src/osd/PGLog.h +++ b/src/osd/PGLog.h @@ -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) { diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index e3d23a38851..6cf4af74fe3 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -327,9 +327,9 @@ public: void log_operation( vector &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(