summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-08-19 22:53:28 -0700
committerSage Weil <sage@inktank.com>2013-08-19 22:53:28 -0700
commit928a0d42707ca2aaa69cd47f686a2ad846bc7eeb (patch)
tree9fe7ce70cb4c1cb88b2de704797d40473fd1e1e6
parentd948f07ae9faa9d316bc8f732ab06d33df374563 (diff)
parent1f851cb2489a95526de932ec6734ebf413e43490 (diff)
downloadceph-928a0d42707ca2aaa69cd47f686a2ad846bc7eeb.tar.gz
Merge remote-tracking branch 'gh/next'
-rw-r--r--src/common/config_opts.h3
-rw-r--r--src/osd/PG.cc4
-rw-r--r--src/osd/PGLog.h17
3 files changed, 21 insertions, 3 deletions
diff --git a/src/common/config_opts.h b/src/common/config_opts.h
index d3e21105e79..b021651bd4d 100644
--- a/src/common/config_opts.h
+++ b/src/common/config_opts.h
@@ -491,6 +491,9 @@ OPTION(osd_leveldb_compression, OPT_BOOL, true) // OSD's leveldb uses compressio
OPTION(osd_leveldb_paranoid, OPT_BOOL, false) // OSD's leveldb paranoid flag
OPTION(osd_leveldb_log, OPT_STR, "") // enable OSD leveldb log file
+// determines whether PGLog::check() compares written out log to stored log
+OPTION(osd_debug_pg_log_writeout, OPT_BOOL, false)
+
/**
* osd_client_op_priority and osd_recovery_op_priority adjust the relative
* priority of client io vs recovery io.
diff --git a/src/osd/PG.cc b/src/osd/PG.cc
index 63be6a34b03..49ea61a603a 100644
--- a/src/osd/PG.cc
+++ b/src/osd/PG.cc
@@ -158,7 +158,7 @@ PG::PG(OSDService *o, OSDMapRef curmap,
deleting(false), dirty_info(false), dirty_big_info(false),
info(p),
info_struct_v(0),
- coll(p), log_oid(loid), biginfo_oid(ioid),
+ coll(p), pg_log(g_ceph_context), log_oid(loid), biginfo_oid(ioid),
recovery_item(this), scrub_item(this), scrub_finalize_item(this), snap_trim_item(this), stat_queue_item(this),
recovery_ops_active(0),
waiting_on_backfill(0),
@@ -2438,7 +2438,9 @@ void PG::read_state(ObjectStore *store, bufferlist &bl)
/* We don't want to leave the old format around in case the next log
* write happens to be an append_log()
*/
+ pg_log.mark_log_for_rewrite();
ObjectStore::Transaction t;
+ t.remove(coll_t(), log_oid); // remove old version
pg_log.write_log(t, log_oid);
int r = osd->store->apply_transaction(t);
assert(!r);
diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h
index 68317750332..552f9b0cee9 100644
--- a/src/osd/PGLog.h
+++ b/src/osd/PGLog.h
@@ -21,6 +21,7 @@
#include "include/assert.h"
#include "osd_types.h"
#include "os/ObjectStore.h"
+#include "common/ceph_context.h"
#include <list>
using namespace std;
@@ -159,6 +160,7 @@ protected:
eversion_t dirty_to;
eversion_t dirty_from;
bool dirty_divergent_priors;
+ CephContext *cct;
bool is_dirty() const {
return !touched_log ||
@@ -178,6 +180,13 @@ protected:
divergent_priors.insert(make_pair(version, obj));
dirty_divergent_priors = true;
}
+public:
+ void mark_log_for_rewrite() {
+ mark_dirty_to(eversion_t::max());
+ mark_dirty_from(eversion_t());
+ touched_log = false;
+ }
+protected:
/// DEBUG
set<string> log_keys_debug;
@@ -197,6 +206,10 @@ protected:
}
void check() {
assert(log.log.size() == log_keys_debug.size());
+ if (cct &&
+ !(cct->_conf->osd_debug_pg_log_writeout)) {
+ return;
+ }
for (list<pg_log_entry_t>::iterator i = log.log.begin();
i != log.log.end();
++i) {
@@ -212,9 +225,9 @@ protected:
check();
}
public:
- PGLog() :
+ PGLog(CephContext *cct = 0) :
touched_log(false), dirty_from(eversion_t::max()),
- dirty_divergent_priors(false) {}
+ dirty_divergent_priors(false), cct(cct) {}
void reset_backfill();