diff options
author | Samuel Just <sam.just@inktank.com> | 2013-06-13 09:57:32 -0700 |
---|---|---|
committer | Samuel Just <sam.just@inktank.com> | 2013-06-17 14:50:53 -0700 |
commit | 962b64a83037ff79855c5261325de0cd1541f582 (patch) | |
tree | 44fc785a728774eb7fe124f702a19ebeb82247d2 | |
parent | 9b6cb63931c28f1c7cf3548771774c4a21aebe24 (diff) | |
download | ceph-962b64a83037ff79855c5261325de0cd1541f582.tar.gz |
PGLog,PG: use normal log dirtying and writing for append and trim
Signed-off-by: Samuel Just <sam.just@inktank.com>
-rw-r--r-- | src/osd/OSD.cc | 2 | ||||
-rw-r--r-- | src/osd/PG.cc | 2 | ||||
-rw-r--r-- | src/osd/PGLog.cc | 15 | ||||
-rw-r--r-- | src/osd/PGLog.h | 9 | ||||
-rw-r--r-- | src/osd/ReplicatedPG.cc | 4 |
5 files changed, 20 insertions, 12 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 9f4ccd3b637..5b499fd6492 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -6087,7 +6087,7 @@ void OSD::handle_pg_trim(OpRequestRef op) } else { // primary is instructing us to trim ObjectStore::Transaction *t = new ObjectStore::Transaction; - pg->pg_log.trim(*t, m->trim_to, pg->info, pg->log_oid); + pg->pg_log.trim(m->trim_to, pg->info); pg->dirty_info = true; pg->write_if_dirty(*t); int tr = store->queue_transaction(pg->osr.get(), t, diff --git a/src/osd/PG.cc b/src/osd/PG.cc index d1ebef06423..d925ff24720 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2295,7 +2295,7 @@ void PG::append_log( dout(10) << "append_log adding " << keys.size() << " keys" << dendl; t.omap_setkeys(coll_t::META_COLL, log_oid, keys); - pg_log.trim(t, trim_to, info, log_oid); + pg_log.trim(trim_to, info); // update the local pg, pg log dirty_info = true; diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc index 011da4c0e67..17032473b96 100644 --- a/src/osd/PGLog.cc +++ b/src/osd/PGLog.cc @@ -64,7 +64,7 @@ void PGLog::IndexedLog::split_into( index(); } -void PGLog::IndexedLog::trim(ObjectStore::Transaction& t, hobject_t& log_oid, eversion_t s) +void PGLog::IndexedLog::trim(eversion_t s) { if (complete_to != log.end() && complete_to->version <= s) { @@ -72,17 +72,14 @@ void PGLog::IndexedLog::trim(ObjectStore::Transaction& t, hobject_t& log_oid, ev << " on " << *this << dendl; } - set<string> keys_to_rm; while (!log.empty()) { pg_log_entry_t &e = *log.begin(); if (e.version > s) break; generic_dout(20) << "trim " << e << dendl; unindex(e); // remove from index, - keys_to_rm.insert(e.get_key_name()); log.pop_front(); // from log } - t.omap_rmkeys(coll_t::META_COLL, log_oid, keys_to_rm); // raise tail? if (tail < s) @@ -133,7 +130,7 @@ void PGLog::clear_info_log( t->omap_rmkeys(coll_t::META_COLL, infos_oid, keys_to_remove); } -void PGLog::trim(ObjectStore::Transaction& t, eversion_t trim_to, pg_info_t &info, hobject_t &log_oid) +void PGLog::trim(eversion_t trim_to, pg_info_t &info) { // trim? if (trim_to > log.tail) { @@ -145,8 +142,14 @@ void PGLog::trim(ObjectStore::Transaction& t, eversion_t trim_to, pg_info_t &inf assert(trim_to <= info.last_complete); dout(10) << "trim " << log << " to " << trim_to << dendl; - log.trim(t, log_oid, trim_to); + log.trim(trim_to); info.log_tail = log.tail; + + if (log.log.empty()) { + mark_dirty_to(eversion_t::max()); + } else { + mark_dirty_to(log.log.front().version); + } } } diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h index 58a74ca76da..e8f86ce56f9 100644 --- a/src/osd/PGLog.h +++ b/src/osd/PGLog.h @@ -141,7 +141,7 @@ struct PGLog { caller_ops[e.reqid] = &(log.back()); } - void trim(ObjectStore::Transaction &t, hobject_t& oid, eversion_t s); + void trim(eversion_t s); ostream& print(ostream& out) const; }; @@ -267,7 +267,10 @@ public: void unindex() { log.unindex(); } - void add(pg_log_entry_t& e) { log.add(e); } + void add(pg_log_entry_t& e) { + mark_dirty_from(e.version); + log.add(e); + } void reset_recovery_pointers() { log.reset_recovery_pointers(); } @@ -277,7 +280,7 @@ public: const hobject_t &log_oid, ObjectStore::Transaction *t); - void trim(ObjectStore::Transaction& t, eversion_t trim_to, pg_info_t &info, hobject_t &log_oid); + void trim(eversion_t trim_to, pg_info_t &info); //////////////////// get or set log & missing //////////////////// diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index af59803c660..4ce0404740c 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -4868,7 +4868,9 @@ void ReplicatedPG::sub_op_modify(OpRequestRef op) } else { // just trim the log if (m->pg_trim_to != eversion_t()) { - pg_log.trim(rm->localt, m->pg_trim_to, info, log_oid); + pg_log.trim(m->pg_trim_to, info); + dirty_info = true; + write_if_dirty(rm->localt); rm->tls.push_back(&rm->localt); } } |