]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
cls_log: trim works in chunks, returns -ENODATA when done
authorYehuda Sadeh <yehuda@inktank.com>
Tue, 12 Mar 2013 21:31:27 +0000 (14:31 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Wed, 8 May 2013 17:55:51 +0000 (10:55 -0700)
Also created a higher level interface that iterates until
done.

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/cls/log/cls_log.cc
src/cls/log/cls_log_client.cc
src/cls/log/cls_log_client.h

index fad61eb34422fcd919fa3d8075aebcc20fc9601a..c0bb97be940970c968b3d15cd2704f0b28ba2c7d 100644 (file)
@@ -153,13 +153,14 @@ static int cls_log_trim(cls_method_context_t hctx, bufferlist *in, bufferlist *o
 #define MAX_TRIM_ENTRIES 1000
   size_t max_entries = MAX_TRIM_ENTRIES;
 
-  int rc = cls_cxx_map_get_vals(hctx, index, log_index_prefix, max_entries, &keys);
+  int rc = cls_cxx_map_get_vals(hctx, from_index, log_index_prefix, max_entries, &keys);
   if (rc < 0)
     return rc;
 
   map<string, bufferlist>::iterator iter = keys.begin();
 
   size_t i;
+  bool removed = false;
   for (i = 0; i < max_entries && iter != keys.end(); ++i, ++iter) {
     const string& index = iter->first;
 
@@ -171,8 +172,12 @@ static int cls_log_trim(cls_method_context_t hctx, bufferlist *in, bufferlist *o
       CLS_LOG(1, "ERROR: cls_log_trim_op(): failed to decode entry\n");
       return -EINVAL;
     }
+    removed = true;
   }
 
+  if (!removed)
+    return -ENODATA;
+
   return 0;
 }
 
index 0f1854f58bfd03f8d0c3c561ca5953243c965807..e765f3685727378a406e7335e553958701610ffc 100644 (file)
@@ -29,6 +29,27 @@ void cls_log_trim(librados::ObjectWriteOperation& op, utime_t& from, utime_t& to
   op.exec("log", "trim", in);
 }
 
+int cls_log_trim(librados::IoCtx& io_ctx, string& oid, utime_t& from, utime_t& to)
+{
+  bool done = false;
+
+  do {
+    ObjectWriteOperation op;
+
+    cls_log_trim(op, from, to);
+
+    int r = io_ctx.operate(oid, &op);
+    if (r == -ENODATA)
+      done = true;
+    else if (r < 0)
+      return r;
+
+  } while (!done);
+
+
+  return 0;
+}
+
 class LogListCtx : public ObjectOperationCompletion {
   list<cls_log_entry> *entries;
   bool *truncated;
index b2543c09c131ff0ae95a3288a7c099b7c72e9405..ba062c7566dc1f2c8fb2ff6d967fa63c54a0d4dd 100644 (file)
@@ -13,5 +13,6 @@ void cls_log_add(librados::ObjectWriteOperation& op, cls_log_entry& entry);
 void cls_log_list(librados::ObjectReadOperation& op, utime_t& from, int max, list<cls_log_entry>& entries);
 
 void cls_log_trim(librados::ObjectWriteOperation& op, utime_t& from, utime_t& to);
+int cls_log_trim(librados::IoCtx& io_ctx, string& oid, utime_t& from, utime_t& to);
 
 #endif