From a32e042b0dd4f68aa29cf5d17d46a6f8bd912b58 Mon Sep 17 00:00:00 2001 From: Song Shun Date: Wed, 15 Nov 2017 14:17:03 +0800 Subject: [PATCH] rbd: speed up librbd::copy based on objectmap speed up librbd::copy based on objectmap Signed-off-by: Song Shun --- src/librbd/internal.cc | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index f583d9632a8..c1872295c68 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1940,10 +1940,30 @@ bool compare_by_name(const child_info_t& c1, const child_info_t& c2) uint64_t period = src->get_stripe_period(); unsigned fadvise_flags = LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL | LIBRADOS_OP_FLAG_FADVISE_NOCACHE; + uint64_t object_id = 0; for (uint64_t offset = 0; offset < src_size; offset += period) { if (throttle.pending_error()) { return throttle.wait_for_ret(); } + + { + RWLock::RLocker snap_locker(src->snap_lock); + if (src->object_map != nullptr) { + bool skip = true; + // each period is related to src->stripe_count objects, check them all + for (uint64_t i=0; i < src->stripe_count; i++) { + if (object_id < src->object_map->size() && + src->object_map->object_may_exist(object_id)) { + skip = false; + } + ++object_id; + } + + if (skip) continue; + } else { + object_id += src->stripe_count; + } + } uint64_t len = min(period, src_size - offset); bufferlist *bl = new bufferlist(); -- 2.47.3