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>
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: "
}
on_finish->complete(r);
+ m_async_op_tracker.finish_op();
}
template <typename I>
#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"
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,
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);