From 4c8731fe3c400f1b9008a39fac1e6420d68b15f0 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 18 Apr 2018 11:08:24 -0400 Subject: [PATCH] librbd: separate read vs write migration parent overlaps Signed-off-by: Jason Dillaman Signed-off-by: Mykola Golub --- src/librbd/image/RefreshRequest.cc | 22 +++++++++++++++++----- src/librbd/io/CopyupRequest.cc | 3 +-- src/librbd/io/ObjectRequest.cc | 15 +++++++++++---- src/librbd/io/ObjectRequest.h | 2 +- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/librbd/image/RefreshRequest.cc b/src/librbd/image/RefreshRequest.cc index a53a3528bfc57..9b3947c2751a9 100644 --- a/src/librbd/image/RefreshRequest.cc +++ b/src/librbd/image/RefreshRequest.cc @@ -1404,11 +1404,7 @@ bool RefreshRequest::get_migration_info(ParentInfo *parent_md, parent_md->spec.pool_id = m_migration_spec.pool_id; parent_md->spec.image_id = m_migration_spec.image_id; parent_md->spec.snap_id = CEPH_NOSNAP; - parent_md->overlap = m_migration_spec.overlap; - - *migration_info = {m_migration_spec.pool_id, m_migration_spec.image_name, - m_migration_spec.image_id, {}, m_migration_spec.overlap, - m_migration_spec.flatten}; + parent_md->overlap = std::min(m_size, m_migration_spec.overlap); auto snap_seqs = m_migration_spec.snap_seqs; // If new snapshots have been created on destination image after @@ -1423,6 +1419,22 @@ bool RefreshRequest::get_migration_info(ParentInfo *parent_md, snap_seqs[CEPH_NOSNAP] = CEPH_NOSNAP; } + std::set snap_ids; + for (auto& it : snap_seqs) { + snap_ids.insert(it.second); + } + uint64_t overlap = snap_ids.find(CEPH_NOSNAP) != snap_ids.end() ? + parent_md->overlap : 0; + for (size_t i = 0; i < m_snapc.snaps.size(); ++i) { + if (snap_ids.find(m_snapc.snaps[i].val) != snap_ids.end()) { + overlap = std::max(overlap, m_snap_infos[i].image_size); + } + } + + *migration_info = {m_migration_spec.pool_id, m_migration_spec.image_name, + m_migration_spec.image_id, {}, overlap, + m_migration_spec.flatten}; + deep_copy::util::compute_snap_map(0, CEPH_NOSNAP, snap_seqs, &migration_info->snap_map); return true; diff --git a/src/librbd/io/CopyupRequest.cc b/src/librbd/io/CopyupRequest.cc index f33830b153053..a09f36a4d0991 100644 --- a/src/librbd/io/CopyupRequest.cc +++ b/src/librbd/io/CopyupRequest.cc @@ -223,8 +223,7 @@ bool CopyupRequest::is_update_object_map_required() { template bool CopyupRequest::is_deep_copy() const { - return !m_ictx->migration_info.empty() && - m_ictx->migration_info.snap_map.size() > 1; + return !m_ictx->migration_info.empty(); } template diff --git a/src/librbd/io/ObjectRequest.cc b/src/librbd/io/ObjectRequest.cc index 5fd37482dee88..647282853b1ad 100644 --- a/src/librbd/io/ObjectRequest.cc +++ b/src/librbd/io/ObjectRequest.cc @@ -131,7 +131,8 @@ void ObjectRequest::add_write_hint(I& image_ctx, } template -bool ObjectRequest::compute_parent_extents(Extents *parent_extents) { +bool ObjectRequest::compute_parent_extents(Extents *parent_extents, + bool read_request) { assert(m_ictx->snap_lock.is_locked()); assert(m_ictx->parent_lock.is_locked()); @@ -146,7 +147,13 @@ bool ObjectRequest::compute_parent_extents(Extents *parent_extents) { lderr(m_ictx->cct) << "failed to retrieve parent overlap: " << cpp_strerror(r) << dendl; return false; - } else if (parent_overlap == 0) { + } + + if (!read_request && !m_ictx->migration_info.empty()) { + parent_overlap = m_ictx->migration_info.overlap; + } + + if (parent_overlap == 0) { return false; } @@ -323,7 +330,7 @@ void ObjectReadRequest::copyup() { image_ctx->snap_lock.get_read(); image_ctx->parent_lock.get_read(); Extents parent_extents; - if (!this->compute_parent_extents(&parent_extents) || + if (!this->compute_parent_extents(&parent_extents, true) || (image_ctx->exclusive_lock != nullptr && !image_ctx->exclusive_lock->is_lock_owner())) { image_ctx->parent_lock.put_read(); @@ -372,7 +379,7 @@ AbstractObjectWriteRequest::AbstractObjectWriteRequest( { RWLock::RLocker snap_locker(ictx->snap_lock); RWLock::RLocker parent_locker(ictx->parent_lock); - this->compute_parent_extents(&m_parent_extents); + this->compute_parent_extents(&m_parent_extents, false); } if (this->m_object_off == 0 && diff --git a/src/librbd/io/ObjectRequest.h b/src/librbd/io/ObjectRequest.h index e5b94b2d8e157..689a5e0edc1a1 100644 --- a/src/librbd/io/ObjectRequest.h +++ b/src/librbd/io/ObjectRequest.h @@ -74,7 +74,7 @@ public: virtual const char *get_op_type() const = 0; protected: - bool compute_parent_extents(Extents *parent_extents); + bool compute_parent_extents(Extents *parent_extents, bool read_request); ImageCtxT *m_ictx; std::string m_oid; -- 2.39.5