From 0cfb4a51eff22cce1d8b4e8351101a2edf18dba9 Mon Sep 17 00:00:00 2001 From: "J. Eric Ivancich" Date: Thu, 23 Jul 2020 16:54:14 -0400 Subject: [PATCH] rgw: ordered list map efficiency Adding an object to the result map required two "find" operations back-to-back, each of which was O(log n). By using std::map::insert_or_assign function and getting an iterator, we can avoid the second find. Signed-off-by: J. Eric Ivancich --- src/rgw/rgw_rados.cc | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 441b56574f6..329e713fc32 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -8533,10 +8533,16 @@ int RGWRados::cls_bucket_list_ordered(const DoutPrefixProvider *dpp, ldpp_dout(dpp, 10) << "RGWRados::" << __func__ << ": got " << dirent.key << dendl; - m[name] = std::move(dirent); - last_entry_visited = &(m[name]); - ++count; - } else { // r == -ENOENT + auto [it, inserted] = m.insert_or_assign(name, std::move(dirent)); + last_entry_visited = &it->second; + if (inserted) { + ++count; + } else { + ldpp_dout(dpp, 0) << "WARNING: RGWRados::" << __func__ << + ": reassigned map value at \"" << name << + "\", which should not happen" << dendl; + } + } else { ldpp_dout(dpp, 10) << "RGWRados::" << __func__ << ": skipping " << dirent.key.name << "[" << dirent.key.instance << "]" << dendl; last_entry_visited = &tracker.dir_entry(); -- 2.39.5