]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/OSDMap: improve efficiency for OSD::handle_osd_map 51444/head
authorzhangjianwei <zhangjianwei2@cmss.chinamobile.com>
Thu, 11 May 2023 13:34:13 +0000 (13:34 +0000)
committerzhangjianwei <zhangjianwei2@cmss.chinamobile.com>
Tue, 16 May 2023 07:11:01 +0000 (07:11 +0000)
- 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 <yanghonggang_yewu@cmss.chinamobile.com>
Signed-off-by: zhangjianwei <zhangjianwei2_yewu@cmss.chinamobile.com>
src/osd/OSD.cc

index 6ad11ed98921ede7733e7bc683939f0be3033dc1..d55b0828d57db07ee58f0b067f9b953b2353d7f3 100644 (file)
@@ -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<epoch_t,OSDMapRef> added_maps;
-  map<epoch_t,bufferlist> 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;
     }