diff options
author | Sage Weil <sage@inktank.com> | 2013-04-29 15:01:45 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-04-29 15:45:41 -0700 |
commit | e8c9824102f5b3e123a87ec7bfffa19fa278d7ca (patch) | |
tree | e783d30c4485cbe59c0de3f0f5532c2e4478f594 | |
parent | a2f7d1d1f15831c48f0b934d9c25ea8b0c1737d4 (diff) | |
download | ceph-e8c9824102f5b3e123a87ec7bfffa19fa278d7ca.tar.gz |
mon: add compact_prefix transaction operation
Add a prefix compaction opteration to the transaction that will be
performed after the transaction applies.
Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r-- | src/mon/MonitorDBStore.h | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/mon/MonitorDBStore.h b/src/mon/MonitorDBStore.h index b14c5aaae46..c4c681043b1 100644 --- a/src/mon/MonitorDBStore.h +++ b/src/mon/MonitorDBStore.h @@ -70,6 +70,7 @@ class MonitorDBStore enum { OP_PUT = 1, OP_ERASE = 2, + OP_COMPACT_PREFIX = 3, }; void put(string prefix, string key, bufferlist& bl) { @@ -98,6 +99,10 @@ class MonitorDBStore erase(prefix, os.str()); } + void compact_prefix(string prefix) { + ops.push_back(Op(OP_COMPACT_PREFIX, prefix, string())); + } + void encode(bufferlist& bl) const { ENCODE_START(1, 1, bl); ::encode(ops, bl); @@ -157,6 +162,12 @@ class MonitorDBStore f->dump_string("key", op.key); } break; + case OP_COMPACT_PREFIX: + { + f->dump_string("type", "COMPACT_PREFIX"); + f->dump_string("prefix", op.prefix); + } + break; default: { f->dump_string("type", "unknown"); @@ -174,6 +185,7 @@ class MonitorDBStore int apply_transaction(MonitorDBStore::Transaction& t) { KeyValueDB::Transaction dbt = db->get_transaction(); + list<string> compact_prefixes; for (list<Op>::iterator it = t.ops.begin(); it != t.ops.end(); ++it) { Op& op = *it; switch (op.type) { @@ -183,13 +195,23 @@ class MonitorDBStore case Transaction::OP_ERASE: dbt->rmkey(op.prefix, op.key); break; + case Transaction::OP_COMPACT_PREFIX: + compact_prefixes.push_back(op.prefix); + break; default: derr << __func__ << " unknown op type " << op.type << dendl; ceph_assert(0); break; } } - return db->submit_transaction_sync(dbt); + int r = db->submit_transaction_sync(dbt); + if (r >= 0) { + while (!compact_prefixes.empty()) { + db->compact_prefix(compact_prefixes.front()); + compact_prefixes.pop_front(); + } + } + return r; } class StoreIteratorImpl { @@ -460,6 +482,10 @@ class MonitorDBStore db->compact(); } + void compact_prefix(const string& prefix) { + db->compact_prefix(prefix); + } + MonitorDBStore(const string& path) : db(0) { string::const_reverse_iterator rit; int pos = 0; |