From: Yan, Zheng Date: Tue, 27 Nov 2018 08:15:21 +0000 (+0800) Subject: osdc/Journaler: make try_read_entry store data in contiguous memory X-Git-Tag: v14.1.0~683^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=39d044be3c8c29941443afd7daaf61603efec2c9;p=ceph.git osdc/Journaler: make try_read_entry store data in contiguous memory If bufferlist consists of discontiguous memory, decoding types whose denc_traits needs contiguous memory is inefficient. The bufferlist may get copied to temporary memory multiple times. (copy_shallow() in src/include/denc.h actually does deep copy) Signed-off-by: "Yan, Zheng" Fixes: http://tracker.ceph.com/issues/37399 --- diff --git a/src/osdc/Journaler.cc b/src/osdc/Journaler.cc index a464d0fd75b5..8eac98eebc74 100644 --- a/src/osdc/Journaler.cc +++ b/src/osdc/Journaler.cc @@ -1263,6 +1263,13 @@ bool Journaler::try_read_entry(bufferlist& bl) // prefetch? _prefetch(); + + // If bufferlist consists of discontiguous memory, decoding types whose + // denc_traits needs contiguous memory is inefficient. The bufferlist may + // get copied to temporary memory multiple times (copy_shallow() in + // src/include/denc.h actually does deep copy) + if (bl.get_num_buffers() > 1) + bl.rebuild(); return true; }