From: Sage Weil Date: Mon, 29 Apr 2013 22:01:45 +0000 (-0700) Subject: mon: add compact_prefix transaction operation X-Git-Tag: v0.61~32^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e8c9824102f5b3e123a87ec7bfffa19fa278d7ca;p=ceph.git 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 --- diff --git a/src/mon/MonitorDBStore.h b/src/mon/MonitorDBStore.h index b14c5aaae46a..c4c681043b1a 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 compact_prefixes; for (list::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;