summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-04-29 15:01:45 -0700
committerSage Weil <sage@inktank.com>2013-04-29 15:45:41 -0700
commite8c9824102f5b3e123a87ec7bfffa19fa278d7ca (patch)
treee783d30c4485cbe59c0de3f0f5532c2e4478f594
parenta2f7d1d1f15831c48f0b934d9c25ea8b0c1737d4 (diff)
downloadceph-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.h28
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;