From: Song Shun Date: Wed, 15 Nov 2017 06:17:03 +0000 (+0800) Subject: rbd: speed up librbd::copy based on objectmap X-Git-Tag: v13.0.2~848^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F18967%2Fhead;p=ceph.git rbd: speed up librbd::copy based on objectmap speed up librbd::copy based on objectmap Signed-off-by: Song Shun --- diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index f583d9632a84..c1872295c68b 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();