From 40af4f87b64f944de786f6fcb6cc18eddd3633ef Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Wed, 5 Sep 2018 20:24:00 +0300 Subject: [PATCH] librbd: flatten operation should use object map If the object is known to exist in the image, the copy-up operation can be skipped for that object. Fixes: http://tracker.ceph.com/issues/23445 Signed-off-by: Mykola Golub --- src/librbd/operation/FlattenRequest.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/librbd/operation/FlattenRequest.cc b/src/librbd/operation/FlattenRequest.cc index 071cbe43d1741..0b861ebe59d01 100644 --- a/src/librbd/operation/FlattenRequest.cc +++ b/src/librbd/operation/FlattenRequest.cc @@ -40,6 +40,15 @@ public: return -ERESTART; } + { + RWLock::RLocker snap_lock(image_ctx.snap_lock); + if (image_ctx.object_map != nullptr && + !image_ctx.object_map->object_may_not_exist(m_object_no)) { + // can skip because the object already exists + return 1; + } + } + bufferlist bl; string oid = image_ctx.get_object_name(m_object_no); auto req = new io::ObjectWriteRequest(&image_ctx, oid, m_object_no, 0, -- 2.39.5