From: zhangjianwei Date: Thu, 11 May 2023 13:34:13 +0000 (+0000) Subject: osd/OSDMap: improve efficiency for OSD::handle_osd_map X-Git-Tag: v19.0.0~1217^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F51444%2Fhead;p=ceph.git osd/OSDMap: improve efficiency for OSD::handle_osd_map - improve OSDMap::decode performance by page-aligning bufferlist - align osdmap buffer memory pages in OSDService::_get_map_bl() - align osdmap bluffer memory pages in OSDService::get_inc_map_bl - use OSDMap::deepish_copy_from in OSD::handle_osd_map instead of OSDMap::decode co-author: yanghonggang Signed-off-by: zhangjianwei --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 6ad11ed98921..d55b0828d57d 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1506,6 +1506,9 @@ bool OSDService::_get_map_bl(epoch_t e, bufferlist& bl) OSD::get_osdmap_pobject_name(e), 0, 0, bl, CEPH_OSD_OP_FLAG_FADVISE_WILLNEED) >= 0; if (found) { + if (!bl.is_page_aligned()) { + bl.rebuild_page_aligned(); + } _add_map_bl(e, bl); } return found; @@ -1524,6 +1527,9 @@ bool OSDService::get_inc_map_bl(epoch_t e, bufferlist& bl) OSD::get_inc_osdmap_pobject_name(e), 0, 0, bl, CEPH_OSD_OP_FLAG_FADVISE_WILLNEED) >= 0; if (found) { + if (!bl.is_page_aligned()) { + bl.rebuild_page_aligned(); + } _add_map_inc_bl(e, bl); } return found; @@ -7954,7 +7960,6 @@ void OSD::handle_osd_map(MOSDMap *m) ceph_assert(ceph_mutex_is_locked(osd_lock)); map added_maps; - map added_maps_bl; if (m->fsid != monc->get_fsid()) { dout(0) << "handle_osd_map fsid " << m->fsid << " != " << monc->get_fsid() << dendl; @@ -8054,6 +8059,9 @@ void OSD::handle_osd_map(MOSDMap *m) OSDMap *o = new OSDMap; bufferlist& bl = p->second; + if (!bl.is_page_aligned()) { + bl.rebuild_page_aligned(); + } o->decode(bl); purged_snaps[e] = o->get_new_purged_snaps(); @@ -8061,7 +8069,6 @@ void OSD::handle_osd_map(MOSDMap *m) ghobject_t fulloid = get_osdmap_pobject_name(e); t.write(coll_t::meta(), fulloid, 0, bl.length(), bl); added_maps[e] = add_map(o); - added_maps_bl[e] = bl; got_full_map(e); continue; } @@ -8075,17 +8082,21 @@ void OSD::handle_osd_map(MOSDMap *m) OSDMap *o = new OSDMap; if (e > 1) { - bufferlist obl; - bool got = get_map_bl(e - 1, obl); - if (!got) { - auto p = added_maps_bl.find(e - 1); - ceph_assert(p != added_maps_bl.end()); - obl = p->second; - } - o->decode(obl); + OSDMapRef prev; + auto p = added_maps.find(e - 1); + if (p != added_maps.end()) { + prev = p->second; + } else { + prev = get_map(e - 1); + } + + o->deepish_copy_from(*prev); } OSDMap::Incremental inc; + if (!bl.is_page_aligned()) { + bl.rebuild_page_aligned(); + } auto p = bl.cbegin(); inc.decode(p); @@ -8130,7 +8141,6 @@ void OSD::handle_osd_map(MOSDMap *m) ghobject_t fulloid = get_osdmap_pobject_name(e); t.write(coll_t::meta(), fulloid, 0, fbl.length(), fbl); added_maps[e] = add_map(o); - added_maps_bl[e] = fbl; continue; }