From 59336a5deafc3c676c20a3fb0e1ffdb079ddc99a Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Mon, 18 Jun 2018 20:00:04 +0300 Subject: [PATCH] librbd: migrate: skip update object map for snaps that don't overlap Signed-off-by: Mykola Golub --- src/librbd/io/CopyupRequest.cc | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/librbd/io/CopyupRequest.cc b/src/librbd/io/CopyupRequest.cc index 77ffaace2719e..b67fa8d45fec0 100644 --- a/src/librbd/io/CopyupRequest.cc +++ b/src/librbd/io/CopyupRequest.cc @@ -362,7 +362,8 @@ bool CopyupRequest::send_object_map_head() { if (!m_ictx->snaps.empty()) { if (is_deep_copy()) { - // don't copy ids for the snaps updated by object deep copy + // don't copy ids for the snaps updated by object deep copy or + // that don't overlap std::set deep_copied; for (auto &it : m_ictx->migration_info.snap_map) { if (it.first != CEPH_NOSNAP) { @@ -371,8 +372,30 @@ bool CopyupRequest::send_object_map_head() { } std::copy_if(m_ictx->snaps.begin(), m_ictx->snaps.end(), std::back_inserter(m_snap_ids), - [&deep_copied](uint64_t i) { - return !deep_copied.count(i); + [this, cct, &deep_copied](uint64_t snap_id) { + if (deep_copied.count(snap_id)) { + return false; + } + RWLock::RLocker parent_locker(m_ictx->parent_lock); + uint64_t parent_overlap = 0; + int r = m_ictx->get_parent_overlap(snap_id, + &parent_overlap); + if (r < 0) { + ldout(cct, 5) << "failed getting parent overlap for " + << "snap_id: " << snap_id << ": " + << cpp_strerror(r) << dendl; + } + if (parent_overlap == 0) { + return false; + } + std::vector> extents; + Striper::extent_to_file(cct, &m_ictx->layout, + m_object_no, 0, + m_ictx->layout.object_size, + extents); + auto overlap = m_ictx->prune_parent_extents( + extents, parent_overlap); + return overlap > 0; }); } else { m_snap_ids.insert(m_snap_ids.end(), m_ictx->snaps.begin(), -- 2.39.5