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
snap_seqs[CEPH_NOSNAP] = CEPH_NOSNAP;
}
+ std::set<uint64_t> 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;
}
template <typename I>
-bool ObjectRequest<I>::compute_parent_extents(Extents *parent_extents) {
+bool ObjectRequest<I>::compute_parent_extents(Extents *parent_extents,
+ bool read_request) {
assert(m_ictx->snap_lock.is_locked());
assert(m_ictx->parent_lock.is_locked());
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;
}
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();
{
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 &&