From b77422f82059b5a664f5561dc8bd3bc7dbbed119 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Tue, 12 Mar 2013 14:31:27 -0700 Subject: [PATCH] cls_log: trim works in chunks, returns -ENODATA when done Also created a higher level interface that iterates until done. Signed-off-by: Yehuda Sadeh --- src/cls/log/cls_log.cc | 7 ++++++- src/cls/log/cls_log_client.cc | 21 +++++++++++++++++++++ src/cls/log/cls_log_client.h | 1 + 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/cls/log/cls_log.cc b/src/cls/log/cls_log.cc index fad61eb34422f..c0bb97be94097 100644 --- a/src/cls/log/cls_log.cc +++ b/src/cls/log/cls_log.cc @@ -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::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; } diff --git a/src/cls/log/cls_log_client.cc b/src/cls/log/cls_log_client.cc index 0f1854f58bfd0..e765f36857273 100644 --- a/src/cls/log/cls_log_client.cc +++ b/src/cls/log/cls_log_client.cc @@ -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 *entries; bool *truncated; diff --git a/src/cls/log/cls_log_client.h b/src/cls/log/cls_log_client.h index b2543c09c131f..ba062c7566dc1 100644 --- a/src/cls/log/cls_log_client.h +++ b/src/cls/log/cls_log_client.h @@ -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& 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 -- 2.39.5