From 6faa2391976c1ba0cbe0f36482f80094c86148a6 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Tue, 27 Nov 2018 16:15:21 +0800 Subject: [PATCH] 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 (cherry picked from commit 39d044be3c8c29941443afd7daaf61603efec2c9) --- src/osdc/Journaler.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/osdc/Journaler.cc b/src/osdc/Journaler.cc index 8ca0c4b27188e..79b1524a7382b 100644 --- a/src/osdc/Journaler.cc +++ b/src/osdc/Journaler.cc @@ -1267,6 +1267,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; } -- 2.39.5