Skip to content

Commit

Permalink
librbd: race when disabling object map with overlapping in-flight writes
Browse files Browse the repository at this point in the history
The block guard that protects against overlapping updates to the object
map needs to be flushed prior to closing the object map instance.

Fixes: https://tracker.ceph.com/issues/46083
Signed-off-by: Jason Dillaman <[email protected]>
  • Loading branch information
Jason Dillaman committed Jun 20, 2020
1 parent 3a0f015 commit ee69323
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 2 deletions.
12 changes: 10 additions & 2 deletions src/librbd/ObjectMap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,14 @@ void ObjectMap<I>::close(Context *on_finish) {
return;
}

auto req = object_map::UnlockRequest<I>::create(m_image_ctx, ctx);
req->send();
ctx = new LambdaContext([this, ctx](int r) {
auto req = object_map::UnlockRequest<I>::create(m_image_ctx, ctx);
req->send();
});

// ensure the block guard for aio updates is empty before unlocking
// the object map
m_async_op_tracker.wait_for_ops(ctx);
}

template <typename I>
Expand Down Expand Up @@ -276,6 +282,7 @@ void ObjectMap<I>::detained_aio_update(UpdateOperation &&op) {
lderr(cct) << "failed to detain object map update: " << cpp_strerror(r)
<< dendl;
m_image_ctx.op_work_queue->queue(op.on_finish, r);
m_async_op_tracker.finish_op();
return;
} else if (r > 0) {
ldout(cct, 20) << "detaining object map update due to in-flight update: "
Expand Down Expand Up @@ -315,6 +322,7 @@ void ObjectMap<I>::handle_detained_aio_update(BlockGuardCell *cell, int r,
}

on_finish->complete(r);
m_async_op_tracker.finish_op();
}

template <typename I>
Expand Down
3 changes: 3 additions & 0 deletions src/librbd/ObjectMap.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "include/fs_types.h"
#include "include/rados/librados_fwd.hpp"
#include "include/rbd/object_map_types.h"
#include "common/AsyncOpTracker.h"
#include "common/bit_vector.hpp"
#include "common/RWLock.h"
#include "common/RefCountedObj.h"
Expand Down Expand Up @@ -102,6 +103,7 @@ class ObjectMap : public RefCountedObject {
return false;
}

m_async_op_tracker.start_op();
UpdateOperation update_operation(start_object_no, end_object_no,
new_state, current_state, parent_trace,
ignore_enoent,
Expand Down Expand Up @@ -150,6 +152,7 @@ class ObjectMap : public RefCountedObject {
mutable ceph::shared_mutex m_lock;
ceph::BitVector<2> m_object_map;

AsyncOpTracker m_async_op_tracker;
UpdateGuard *m_update_guard = nullptr;

void detained_aio_update(UpdateOperation &&update_operation);
Expand Down

0 comments on commit ee69323

Please sign in to comment.