The IO was being unblocked before object map was created, allowing
a potential copyup request to fail to update a still-to-be-created
object map.
Fixes: http://tracker.ceph.com/issues/24516
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit
1e874403bf861cb8b74261308d8b73434cf90341)
Conflicts:
src/librbd/object_map/SnapshotCreateRequest.cc: trivial resolution
src/librbd/operation/SnapshotCreateRequest.cc: trivial resolution
void SnapshotCreateRequest::send_read_map() {
assert(m_image_ctx.snap_lock.is_locked());
- assert(m_image_ctx.get_snap_info(m_snap_id) != NULL);
CephContext *cct = m_image_ctx.cct;
std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, CEPH_NOSNAP));
void SnapshotCreateRequest::update_object_map() {
RWLock::WLocker snap_locker(m_image_ctx.snap_lock);
RWLock::WLocker object_map_locker(m_image_ctx.object_map_lock);
-
+
auto it = m_object_map.begin();
auto end_it = m_object_map.end();
for (; it != end_it; ++it) {
Context *SnapshotCreateRequest<I>::send_create_object_map() {
I &image_ctx = this->m_image_ctx;
- update_snap_context();
-
image_ctx.snap_lock.get_read();
if (image_ctx.object_map == nullptr || m_skip_object_map) {
image_ctx.snap_lock.put_read();
+ update_snap_context();
image_ctx.io_work_queue->unblock_writes();
return this->create_context_finisher(0);
}
CephContext *cct = image_ctx.cct;
ldout(cct, 5) << this << " " << __func__ << ": r=" << *result << dendl;
- assert(*result == 0);
-
+ update_snap_context();
image_ctx.io_work_queue->unblock_writes();
+ if (*result < 0) {
+ lderr(cct) << this << " " << __func__ << ": failed to snapshot object map: "
+ << cpp_strerror(*result) << dendl;
+ return this->create_context_finisher(*result);
+ }
+
return this->create_context_finisher(0);
}
expect_allocate_snap_id(mock_image_ctx, 0);
expect_snap_create(mock_image_ctx, 0);
if (!mock_image_ctx.old_format) {
- expect_update_snap_context(mock_image_ctx);
expect_object_map_snap_create(mock_image_ctx);
+ expect_update_snap_context(mock_image_ctx);
}
expect_unblock_writes(mock_image_ctx);
expect_allocate_snap_id(mock_image_ctx, -ESTALE);
expect_snap_create(mock_image_ctx, -ESTALE);
if (!mock_image_ctx.old_format) {
- expect_update_snap_context(mock_image_ctx);
expect_object_map_snap_create(mock_image_ctx);
+ expect_update_snap_context(mock_image_ctx);
}
expect_unblock_writes(mock_image_ctx);