]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: add compact_prefix transaction operation
authorSage Weil <sage@inktank.com>
Mon, 29 Apr 2013 22:01:45 +0000 (15:01 -0700)
committerSage Weil <sage@inktank.com>
Mon, 29 Apr 2013 22:45:41 +0000 (15:45 -0700)
Add a prefix compaction opteration to the transaction that will be
performed after the transaction applies.

Signed-off-by: Sage Weil <sage@inktank.com>
src/mon/MonitorDBStore.h

index b14c5aaae46aa0f7f54123ea5b0d592b9d9123e1..c4c681043b1ab86ab467c1877c84c9157280e679 100644 (file)
@@ -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;