From: Casey Bodley Date: Thu, 12 Jul 2018 18:02:27 +0000 (-0400) Subject: radosgw-admin: 'sync error trim' loops until complete X-Git-Tag: v12.2.9~84^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3b97824be4552ea2abafa07fb45e009d39dc4fc3;p=ceph.git radosgw-admin: 'sync error trim' loops until complete a single call to time_log_trim() will trim a maximum of 1000 entries. now loops until a return code of -ENODATA indicates that all entries in the given range were trimmed an optional --trim-delay-ms option can be used to limit the frequency of osd ops Fixes: http://tracker.ceph.com/issues/24873 Signed-off-by: Casey Bodley (cherry picked from commit 326971931d15250ed26d9213ad14e76e4ef402bc) Conflicts: src/rgw/rgw_admin.cc - some control commands not backported from master - added #include for std::this_thread and #include for std::chrono::milliseconds (in master and mimic, rgw_admin.cc must be getting these includes via some other header) --- diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 62ee84a5a03..311596b8820 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include @@ -2498,6 +2500,30 @@ int create_new_bucket_instance(RGWRados *store, } +static int trim_sync_error_log(int shard_id, const ceph::real_time& start_time, + const ceph::real_time& end_time, + const string& start_marker, const string& end_marker, + int delay_ms) +{ + auto oid = RGWSyncErrorLogger::get_shard_oid(RGW_SYNC_ERROR_LOG_SHARD_PREFIX, + shard_id); + // call cls_log_trim() until it returns -ENODATA + for (;;) { + int ret = store->time_log_trim(oid, start_time, end_time, + start_marker, end_marker); + if (ret == -ENODATA) { + return 0; + } + if (ret < 0) { + return ret; + } + if (delay_ms) { + std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms)); + } + } + // unreachable +} + int main(int argc, const char **argv) { vector args; @@ -2655,6 +2681,8 @@ int main(int argc, const char **argv) boost::optional compression_type; + int trim_delay_ms = 0; + for (std::vector::iterator i = args.begin(); i != args.end(); ) { if (ceph_argparse_double_dash(args, i)) { break; @@ -2984,6 +3012,8 @@ int main(int argc, const char **argv) perm_policy_doc = val; } else if (ceph_argparse_witharg(args, i, &val, "--path-prefix", (char*)NULL)) { path_prefix = val; + } else if (ceph_argparse_witharg(args, i, &val, "--trim-delay-ms", (char*)NULL)) { + trim_delay_ms = atoi(val.c_str()); } else if (strncmp(*i, "-", 1) == 0) { cerr << "ERROR: invalid flag " << *i << std::endl; return EINVAL; @@ -7037,9 +7067,10 @@ next: } for (; shard_id < ERROR_LOGGER_SHARDS; ++shard_id) { - string oid = RGWSyncErrorLogger::get_shard_oid(RGW_SYNC_ERROR_LOG_SHARD_PREFIX, shard_id); - ret = store->time_log_trim(oid, start_time.to_real_time(), end_time.to_real_time(), start_marker, end_marker); - if (ret < 0 && ret != -ENODATA) { + ret = trim_sync_error_log(shard_id, start_time.to_real_time(), + end_time.to_real_time(), start_marker, + end_marker, trim_delay_ms); + if (ret < 0) { cerr << "ERROR: sync error trim: " << cpp_strerror(-ret) << std::endl; return -ret; }