Skip to content

Commit

Permalink
librbd: reserve async request id globally
Browse files Browse the repository at this point in the history
We don't want it to be reset after an image is reopen as it may
cause requests being treated as duplicate.

Signed-off-by: Mykola Golub <[email protected]>
  • Loading branch information
trociny committed Nov 25, 2020
1 parent 8b08c7b commit 2578b4e
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 21 deletions.
2 changes: 1 addition & 1 deletion src/librbd/ImageWatcher.cc
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ template <typename I>
void ImageWatcher<I>::notify_quiesce(uint64_t *request_id,
ProgressContext &prog_ctx,
Context *on_finish) {
*request_id = m_image_ctx.operations->reserve_async_request_id();
*request_id = util::reserve_async_request_id();

ldout(m_image_ctx.cct, 10) << this << " " << __func__ << ": request_id="
<< request_id << dendl;
Expand Down
30 changes: 15 additions & 15 deletions src/librbd/Operations.cc
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,7 @@ bool needs_invalidate(I& image_ctx, uint64_t object_no,

template <typename I>
Operations<I>::Operations(I &image_ctx)
: m_image_ctx(image_ctx), m_async_request_seq(0),
: m_image_ctx(image_ctx),
m_queue_lock(ceph::make_mutex(
util::unique_lock_name("librbd::Operations::m_queue_lock",
this))) {
Expand Down Expand Up @@ -492,7 +492,7 @@ int Operations<I>::flatten(ProgressContext &prog_ctx) {
}
}

uint64_t request_id = ++m_async_request_seq;
uint64_t request_id = util::reserve_async_request_id();
r = invoke_async_request(OPERATION_FLATTEN,
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL,
false,
Expand Down Expand Up @@ -566,7 +566,7 @@ int Operations<I>::rebuild_object_map(ProgressContext &prog_ctx) {
return r;
}

uint64_t request_id = ++m_async_request_seq;
uint64_t request_id = util::reserve_async_request_id();
r = invoke_async_request(OPERATION_REBUILD_OBJECT_MAP,
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, true,
boost::bind(&Operations<I>::execute_rebuild_object_map,
Expand Down Expand Up @@ -672,7 +672,7 @@ int Operations<I>::rename(const char *dstname) {
}

if (m_image_ctx.test_features(RBD_FEATURE_JOURNALING)) {
uint64_t request_id = ++m_async_request_seq;
uint64_t request_id = util::reserve_async_request_id();
r = invoke_async_request(OPERATION_RENAME,
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL,
true,
Expand Down Expand Up @@ -771,7 +771,7 @@ int Operations<I>::resize(uint64_t size, bool allow_shrink, ProgressContext& pro
return -EINVAL;
}

uint64_t request_id = ++m_async_request_seq;
uint64_t request_id = util::reserve_async_request_id();
r = invoke_async_request(OPERATION_RESIZE,
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL,
false,
Expand Down Expand Up @@ -866,7 +866,7 @@ void Operations<I>::snap_create(const cls::rbd::SnapshotNamespace &snap_namespac
}
m_image_ctx.image_lock.unlock_shared();

uint64_t request_id = ++m_async_request_seq;
uint64_t request_id = util::reserve_async_request_id();
C_InvokeAsyncRequest<I> *req = new C_InvokeAsyncRequest<I>(
m_image_ctx, OPERATION_SNAP_CREATE,
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, true,
Expand Down Expand Up @@ -1065,7 +1065,7 @@ void Operations<I>::snap_remove(const cls::rbd::SnapshotNamespace& snap_namespac
m_image_ctx.image_lock.unlock_shared();

if (proxy_op) {
uint64_t request_id = ++m_async_request_seq;
uint64_t request_id = util::reserve_async_request_id();
auto request_type = exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL;
if (cls::rbd::get_snap_namespace_type(snap_namespace) ==
cls::rbd::SNAPSHOT_NAMESPACE_TYPE_TRASH) {
Expand Down Expand Up @@ -1165,7 +1165,7 @@ int Operations<I>::snap_rename(const char *srcname, const char *dstname) {
}

if (m_image_ctx.test_features(RBD_FEATURE_JOURNALING)) {
uint64_t request_id = ++m_async_request_seq;
uint64_t request_id = util::reserve_async_request_id();
r = invoke_async_request(OPERATION_SNAP_RENAME,
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL,
true,
Expand Down Expand Up @@ -1267,7 +1267,7 @@ int Operations<I>::snap_protect(const cls::rbd::SnapshotNamespace& snap_namespac
}

if (m_image_ctx.test_features(RBD_FEATURE_JOURNALING)) {
uint64_t request_id = ++m_async_request_seq;
uint64_t request_id = util::reserve_async_request_id();
r = invoke_async_request(OPERATION_SNAP_PROTECT,
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL,
true,
Expand Down Expand Up @@ -1365,7 +1365,7 @@ int Operations<I>::snap_unprotect(const cls::rbd::SnapshotNamespace& snap_namesp
}

if (m_image_ctx.test_features(RBD_FEATURE_JOURNALING)) {
uint64_t request_id = ++m_async_request_seq;
uint64_t request_id = util::reserve_async_request_id();
r = invoke_async_request(OPERATION_SNAP_UNPROTECT,
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL,
true,
Expand Down Expand Up @@ -1566,7 +1566,7 @@ int Operations<I>::update_features(uint64_t features, bool enabled) {

r = cond_ctx.wait();
} else {
uint64_t request_id = ++m_async_request_seq;
uint64_t request_id = util::reserve_async_request_id();
r = invoke_async_request(OPERATION_UPDATE_FEATURES,
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL,
false,
Expand Down Expand Up @@ -1641,7 +1641,7 @@ int Operations<I>::metadata_set(const std::string &key,
return -EROFS;
}

uint64_t request_id = ++m_async_request_seq;
uint64_t request_id = util::reserve_async_request_id();
r = invoke_async_request(OPERATION_METADATA_UPDATE,
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL,
false,
Expand Down Expand Up @@ -1701,7 +1701,7 @@ int Operations<I>::metadata_remove(const std::string &key) {
if(r < 0)
return r;

uint64_t request_id = ++m_async_request_seq;
uint64_t request_id = util::reserve_async_request_id();
r = invoke_async_request(OPERATION_METADATA_UPDATE,
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL,
false,
Expand Down Expand Up @@ -1766,7 +1766,7 @@ int Operations<I>::migrate(ProgressContext &prog_ctx) {
}
}

uint64_t request_id = ++m_async_request_seq;
uint64_t request_id = util::reserve_async_request_id();
r = invoke_async_request(OPERATION_MIGRATE,
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL,
false,
Expand Down Expand Up @@ -1832,7 +1832,7 @@ int Operations<I>::sparsify(size_t sparse_size, ProgressContext &prog_ctx) {
return -EINVAL;
}

uint64_t request_id = ++m_async_request_seq;
uint64_t request_id = util::reserve_async_request_id();
int r = invoke_async_request(OPERATION_SPARSIFY,
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL,
false,
Expand Down
5 changes: 0 additions & 5 deletions src/librbd/Operations.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,6 @@ class Operations {
public:
Operations(ImageCtxT &image_ctx);

uint64_t reserve_async_request_id() {
return ++m_async_request_seq;
}

void start_op(enum Operation op, Context *ctx);
void finish_op(enum Operation op, int r);

Expand Down Expand Up @@ -143,7 +139,6 @@ class Operations {

private:
ImageCtxT &m_image_ctx;
std::atomic<uint64_t> m_async_request_seq;

mutable ceph::mutex m_queue_lock;
std::set<Operation> m_in_flight_ops;
Expand Down
6 changes: 6 additions & 0 deletions src/librbd/Utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -194,5 +194,11 @@ SnapContext get_snap_context(
return snapc;
}

uint64_t reserve_async_request_id() {
static std::atomic<uint64_t> async_request_seq = 0;

return ++async_request_seq;
}

} // namespace util
} // namespace librbd
2 changes: 2 additions & 0 deletions src/librbd/Utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,8 @@ SnapContext get_snap_context(
std::pair<std::uint64_t,
std::vector<std::uint64_t>>>& write_snap_context);

uint64_t reserve_async_request_id();

} // namespace util
} // namespace librbd

Expand Down

0 comments on commit 2578b4e

Please sign in to comment.