From: Jianpeng Ma Date: Mon, 1 Nov 2021 00:33:23 +0000 (+0800) Subject: librbd: send FLUSH_SOURCE_INTERNAL when do copy/deep_copy. X-Git-Tag: v17.1.0~529^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=a2ae83f8aab18933eae77cf3034b740082a39e4f;p=ceph.git librbd: send FLUSH_SOURCE_INTERNAL when do copy/deep_copy. copy/deep_copy use object_map to judge whether object exist. If w/ librbdo pwl cache, flush can't flush data to osd which change objectmap state. So we should send flush w/ FLUSH_SOURCE_INTERNAL to make data flush to osd. Fixes:https://tracker.ceph.com/issues/53057 Signed-off-by: Jianpeng Ma --- diff --git a/src/librbd/api/Image.cc b/src/librbd/api/Image.cc index 25ae76b1319e7..772dd7f058eaf 100644 --- a/src/librbd/api/Image.cc +++ b/src/librbd/api/Image.cc @@ -26,6 +26,8 @@ #include "librbd/image/PreRemoveRequest.h" #include "librbd/io/ImageDispatcherInterface.h" #include "librbd/io/ObjectDispatcherInterface.h" +#include "librbd/io/AioCompletion.h" +#include "librbd/io/ImageDispatchSpec.h" #include #define dout_subsys ceph_subsys_rbd @@ -680,6 +682,22 @@ int Image::deep_copy(I *src, librados::IoCtx& dest_md_ctx, template int Image::deep_copy(I *src, I *dest, bool flatten, ProgressContext &prog_ctx) { + // ensure previous writes are visible to dest + C_SaferCond flush_ctx; + { + std::shared_lock owner_locker{src->owner_lock}; + auto aio_comp = io::AioCompletion::create_and_start(&flush_ctx, src, + io::AIO_TYPE_FLUSH); + auto req = io::ImageDispatchSpec::create_flush( + *src, io::IMAGE_DISPATCH_LAYER_INTERNAL_START, + aio_comp, io::FLUSH_SOURCE_INTERNAL, {}); + req->send(); + } + int r = flush_ctx.wait(); + if (r < 0) { + return r; + } + librados::snap_t snap_id_start = 0; librados::snap_t snap_id_end; { @@ -696,7 +714,7 @@ int Image::deep_copy(I *src, I *dest, bool flatten, src, dest, snap_id_start, snap_id_end, 0U, flatten, boost::none, asio_engine.get_work_queue(), &snap_seqs, &progress_handler, &cond); req->send(); - int r = cond.wait(); + r = cond.wait(); if (r < 0) { return r; } diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index dba15bdf23a18..42542b22d28b4 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1281,12 +1281,27 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) { return -EINVAL; } + // ensure previous writes are visible to dest + C_SaferCond flush_ctx; + { + auto aio_comp = io::AioCompletion::create_and_start(&flush_ctx, src, + io::AIO_TYPE_FLUSH); + auto req = io::ImageDispatchSpec::create_flush( + *src, io::IMAGE_DISPATCH_LAYER_INTERNAL_START, + aio_comp, io::FLUSH_SOURCE_INTERNAL, {}); + req->send(); + } + int r = flush_ctx.wait(); + if (r < 0) { + return r; + } + C_SaferCond ctx; auto req = deep_copy::MetadataCopyRequest<>::create( src, dest, &ctx); req->send(); - int r = ctx.wait(); + r = ctx.wait(); if (r < 0) { lderr(cct) << "failed to copy metadata: " << cpp_strerror(r) << dendl; return r;