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: v14.0.1~845^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=326971931d15250ed26d9213ad14e76e4ef402bc;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 --- diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 685f94de35c45..07fc5c8d8b352 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -2571,6 +2571,30 @@ static int scan_totp(CephContext *cct, ceph::real_time& now, rados::cls::otp::ot return -ENOENT; } +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; @@ -2738,6 +2762,7 @@ int main(int argc, const char **argv) vector totp_pin; int totp_seconds = 0; int totp_window = 0; + int trim_delay_ms = 0; for (std::vector::iterator i = args.begin(); i != args.end(); ) { if (ceph_argparse_double_dash(args, i)) { @@ -3064,6 +3089,8 @@ int main(int argc, const char **argv) totp_seconds = atoi(val.c_str()); } else if (ceph_argparse_witharg(args, i, &val, "--totp-window", (char*)NULL)) { totp_window = atoi(val.c_str()); + } 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; @@ -7171,9 +7198,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; }