From: J. Eric Ivancich Date: Thu, 23 Jul 2020 20:54:14 +0000 (-0400) Subject: rgw: ordered list map efficiency X-Git-Tag: v17.1.0~2021^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0cfb4a51eff22cce1d8b4e8351101a2edf18dba9;p=ceph.git 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 --- 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();