From 60b9230d95273e9b3f064c210204dd59d7eb4a46 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Fri, 6 Aug 2021 15:14:26 -0400 Subject: [PATCH] radosgw-admin: 'sync status' is not behind if there are no mdlog entries if remote mdlogs are trimmed prematurely, sync status will report that it's behind the remote's max-marker even if there are no mdlog entries to sync for each behind shard, we fetch the next mdlog entry from the remote. if we get an empty listing, remove that shard from behind_shards. this logic now has to run before we print "behind shards:" so that empty shards aren't listed Fixes: https://tracker.ceph.com/issues/52091 Signed-off-by: Casey Bodley (cherry picked from commit 14d43f740d101c8d41a2ced4525bf8efd8c9d943) --- src/rgw/rgw_admin.cc | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 7928867648e29..20c2494f5f4e9 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -2003,25 +2003,22 @@ static void get_md_sync_status(list& status) } } - int total_behind = shards_behind.size() + (sync_status.sync_info.num_shards - num_inc); - if (total_behind == 0) { - push_ss(ss, status) << "metadata is caught up with master"; - } else { - push_ss(ss, status) << "metadata is behind on " << total_behind << " shards"; - - push_ss(ss, status) << "behind shards: " << "[" << shards_behind_set << "]"; - + // fetch remote log entries to determine the oldest change + std::optional> oldest; + if (!shards_behind.empty()) { map master_pos; ret = sync.read_master_log_shards_next(dpp(), sync_status.sync_info.period, shards_behind, &master_pos); if (ret < 0) { derr << "ERROR: failed to fetch master next positions (" << cpp_strerror(-ret) << ")" << dendl; } else { - std::optional> oldest; - for (auto iter : master_pos) { rgw_mdlog_shard_data& shard_data = iter.second; - if (!shard_data.entries.empty()) { + if (shard_data.entries.empty()) { + // there aren't any entries in this shard, so we're not really behind + shards_behind.erase(iter.first); + shards_behind_set.erase(iter.first); + } else { rgw_mdlog_entry& entry = shard_data.entries.front(); if (!oldest) { oldest.emplace(iter.first, entry.timestamp); @@ -2030,11 +2027,18 @@ static void get_md_sync_status(list& status) } } } + } + } - if (oldest) { - push_ss(ss, status) << "oldest incremental change not applied: " - << oldest->second << " [" << oldest->first << ']'; - } + int total_behind = shards_behind.size() + (sync_status.sync_info.num_shards - num_inc); + if (total_behind == 0) { + push_ss(ss, status) << "metadata is caught up with master"; + } else { + push_ss(ss, status) << "metadata is behind on " << total_behind << " shards"; + push_ss(ss, status) << "behind shards: " << "[" << shards_behind_set << "]"; + if (oldest) { + push_ss(ss, status) << "oldest incremental change not applied: " + << oldest->second << " [" << oldest->first << ']'; } } -- 2.47.3