}
image_locker.unlock();
- ldout(image_ctx->cct, 20) << dendl;
+ ldout(image_ctx->cct, 20) << "snap_id=" << read_snap_id << dendl;
neorados::ReadOp read_op;
for (auto& extent: *this->m_extents) {
neorados::WriteOp write_op;
if (m_copyup_enabled) {
- ldout(image_ctx->cct, 20) << "guarding write" << dendl;
if (m_guarding_migration_write) {
+ auto snap_seq = (this->m_io_context->write_snap_context() ?
+ this->m_io_context->write_snap_context()->first : 0);
+ ldout(image_ctx->cct, 20) << "guarding write: snap_seq=" << snap_seq
+ << dendl;
+
cls_client::assert_snapc_seq(
- &write_op,
- (this->m_io_context->write_snap_context() ?
- this->m_io_context->write_snap_context()->first : 0),
- cls::rbd::ASSERT_SNAPC_SEQ_LE_SNAPSET_SEQ);
+ &write_op, snap_seq, cls::rbd::ASSERT_SNAPC_SEQ_LE_SNAPSET_SEQ);
} else {
+ ldout(image_ctx->cct, 20) << "guarding write" << dendl;
write_op.assert_exists();
}
}
<< "clone_end_snap_id=" << clone_end_snap_id << ", "
<< "diff=" << diff << ", "
<< "end_size=" << end_size << ", "
- << "exists=" << exists << dendl;
+ << "exists=" << exists << ", "
+ << "whole_object=" << read_whole_object << dendl;
if (end_snap_id <= first_snap_id) {
// don't include deltas from the starting snapshots, but we iterate over
// it to track its existence and size
ldout(m_cct, 10) << dendl;
// note that all source image ctx properties are placeholders
- *m_src_image_ctx = I::create("", "", m_src_snap_id, m_io_ctx, true);
+ *m_src_image_ctx = I::create("", "", CEPH_NOSNAP, m_io_ctx, true);
auto src_image_ctx = *m_src_image_ctx;
src_image_ctx->child = m_dst_image_ctx;
import_only = false;
}
+ ldout(m_cct, 15) << "source_spec=" << source_spec << ", "
+ << "source_snap_id=" << m_src_snap_id << ", "
+ << "import_only=" << import_only << dendl;
+
SourceSpecBuilder<I> source_spec_builder{src_image_ctx};
json_spirit::mObject source_spec_object;
int r = source_spec_builder.parse_source_spec(source_spec,
auto& [snap_id, snap_info] = *it;
snapc.snaps.push_back(snap_id);
+ ldout(m_cct, 10) << "adding snap: ns=" << snap_info.snap_namespace << ", "
+ << "name=" << snap_info.name << ", "
+ << "id=" << snap_id << dendl;
src_image_ctx->add_snap(
snap_info.snap_namespace, snap_info.name, snap_id,
snap_info.size, snap_info.parent, snap_info.protection_status,
}
src_image_ctx->snapc = snapc;
+ ldout(m_cct, 15) << "read snap id: " << m_src_snap_id << ", "
+ << "write snapc={"
+ << "seq=" << snapc.seq << ", "
+ << "snaps=" << snapc.snaps << "}" << dendl;
+
// ensure data_ctx and data_io_context are pointing to correct snapshot
- if (src_image_ctx->open_snap_id != CEPH_NOSNAP) {
- int r = src_image_ctx->snap_set(src_image_ctx->open_snap_id);
- ceph_assert(r == 0);
- src_image_ctx->open_snap_id = CEPH_NOSNAP;
+ if (m_src_snap_id != CEPH_NOSNAP) {
+ int r = src_image_ctx->snap_set(m_src_snap_id);
+ if (r < 0) {
+ src_image_ctx->image_lock.unlock();
+
+ lderr(m_cct) << "error setting source image snap id: "
+ << cpp_strerror(r) << dendl;
+ finish(r);
+ return;
+ }
}
src_image_ctx->image_lock.unlock();