From ede691323d94dc04a30f81aca5576a3d6d1930af Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Fri, 29 Sep 2017 12:22:57 -0400 Subject: [PATCH] librbd: avoid dynamically refreshing non-atomic configuration settings Fixes: http://tracker.ceph.com/issues/21529 Signed-off-by: Jason Dillaman --- src/librbd/ImageCtx.cc | 8 ++++++-- src/librbd/ImageCtx.h | 3 ++- src/librbd/image/OpenRequest.cc | 4 ++-- src/librbd/image/RefreshRequest.cc | 2 +- src/test/librbd/image/test_mock_RefreshRequest.cc | 2 +- src/test/librbd/mock/MockImageCtx.h | 3 ++- 6 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index 3db79a7ed30c2..3918a76818190 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -963,7 +963,8 @@ struct C_InvalidateCache : public Context { return true; } - void ImageCtx::apply_metadata(const std::map &meta) { + void ImageCtx::apply_metadata(const std::map &meta, + bool thread_safe) { ldout(cct, 20) << __func__ << dendl; std::map configs = boost::assign::map_list_of( "rbd_non_blocking_aio", false)( @@ -1052,13 +1053,16 @@ struct C_InvalidateCache : public Context { ASSIGN_OPTION(journal_object_flush_interval, int64_t); ASSIGN_OPTION(journal_object_flush_bytes, int64_t); ASSIGN_OPTION(journal_object_flush_age, double); - ASSIGN_OPTION(journal_pool, std::string); ASSIGN_OPTION(journal_max_payload_bytes, uint64_t); ASSIGN_OPTION(journal_max_concurrent_object_sets, int64_t); ASSIGN_OPTION(mirroring_resync_after_disconnect, bool); ASSIGN_OPTION(mirroring_replay_delay, int64_t); ASSIGN_OPTION(skip_partial_discard, bool); ASSIGN_OPTION(blkin_trace_all, bool); + + if (thread_safe) { + ASSIGN_OPTION(journal_pool, std::string); + } } ExclusiveLock *ImageCtx::create_exclusive_lock() { diff --git a/src/librbd/ImageCtx.h b/src/librbd/ImageCtx.h index 6fcad3c27e9ce..910182a70dd64 100644 --- a/src/librbd/ImageCtx.h +++ b/src/librbd/ImageCtx.h @@ -309,7 +309,8 @@ namespace librbd { void cancel_async_requests(); void cancel_async_requests(Context *on_finish); - void apply_metadata(const std::map &meta); + void apply_metadata(const std::map &meta, + bool thread_safe); ExclusiveLock *create_exclusive_lock(); ObjectMap *create_object_map(uint64_t snap_id); diff --git a/src/librbd/image/OpenRequest.cc b/src/librbd/image/OpenRequest.cc index a78778af63627..531a820c03649 100644 --- a/src/librbd/image/OpenRequest.cc +++ b/src/librbd/image/OpenRequest.cc @@ -73,7 +73,7 @@ Context *OpenRequest::handle_v1_detect_header(int *result) { m_image_ctx->old_format = true; m_image_ctx->header_oid = util::old_header_name(m_image_ctx->name); - m_image_ctx->apply_metadata({}); + m_image_ctx->apply_metadata({}, true); send_register_watch(); } @@ -466,7 +466,7 @@ Context *OpenRequest::handle_v2_apply_metadata(int *result) { } } - m_image_ctx->apply_metadata(m_metadata); + m_image_ctx->apply_metadata(m_metadata, true); send_register_watch(); return nullptr; diff --git a/src/librbd/image/RefreshRequest.cc b/src/librbd/image/RefreshRequest.cc index 4ec161698f5dc..111cc133cf574 100644 --- a/src/librbd/image/RefreshRequest.cc +++ b/src/librbd/image/RefreshRequest.cc @@ -345,7 +345,7 @@ Context *RefreshRequest::handle_v2_get_metadata(int *result) { } } - m_image_ctx.apply_metadata(m_metadata); + m_image_ctx.apply_metadata(m_metadata, false); send_v2_get_flags(); return nullptr; diff --git a/src/test/librbd/image/test_mock_RefreshRequest.cc b/src/test/librbd/image/test_mock_RefreshRequest.cc index 07490146a56b0..02ab30d4432e2 100644 --- a/src/test/librbd/image/test_mock_RefreshRequest.cc +++ b/src/test/librbd/image/test_mock_RefreshRequest.cc @@ -228,7 +228,7 @@ public: void expect_apply_metadata(MockRefreshImageCtx &mock_image_ctx, int r) { - EXPECT_CALL(mock_image_ctx, apply_metadata(_)) + EXPECT_CALL(mock_image_ctx, apply_metadata(_, false)) .WillOnce(Return(r)); } diff --git a/src/test/librbd/mock/MockImageCtx.h b/src/test/librbd/mock/MockImageCtx.h index ca44657c8c2cb..fab19fa4a7569 100644 --- a/src/test/librbd/mock/MockImageCtx.h +++ b/src/test/librbd/mock/MockImageCtx.h @@ -202,7 +202,8 @@ struct MockImageCtx { size_t, uint64_t, Context *, int, ZTracer::Trace *)); MOCK_METHOD8(write_to_cache, void(object_t, const bufferlist&, size_t, uint64_t, Context *, int, uint64_t, ZTracer::Trace *)); - MOCK_METHOD1(apply_metadata, int(const std::map &)); + MOCK_METHOD2(apply_metadata, int(const std::map &, + bool)); ImageCtx *image_ctx; CephContext *cct; -- 2.39.5