]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: avoid dynamically refreshing non-atomic configuration settings 18042/head
authorJason Dillaman <dillaman@redhat.com>
Fri, 29 Sep 2017 16:22:57 +0000 (12:22 -0400)
committerJason Dillaman <dillaman@redhat.com>
Fri, 29 Sep 2017 16:22:57 +0000 (12:22 -0400)
Fixes: http://tracker.ceph.com/issues/21529
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/ImageCtx.cc
src/librbd/ImageCtx.h
src/librbd/image/OpenRequest.cc
src/librbd/image/RefreshRequest.cc
src/test/librbd/image/test_mock_RefreshRequest.cc
src/test/librbd/mock/MockImageCtx.h

index 3db79a7ed30c24a2faeefbd9fb4dc60f3081880b..3918a768181904417293e75228114bcaba08510d 100644 (file)
@@ -963,7 +963,8 @@ struct C_InvalidateCache : public Context {
     return true;
   }
 
-  void ImageCtx::apply_metadata(const std::map<std::string, bufferlist> &meta) {
+  void ImageCtx::apply_metadata(const std::map<std::string, bufferlist> &meta,
+                                bool thread_safe) {
     ldout(cct, 20) << __func__ << dendl;
     std::map<string, bool> 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> *ImageCtx::create_exclusive_lock() {
index 6fcad3c27e9ce69a9dfe92a2cf30713245bd1e27..910182a70dd6412a1e71e713e1505d730d0a2ea8 100644 (file)
@@ -309,7 +309,8 @@ namespace librbd {
     void cancel_async_requests();
     void cancel_async_requests(Context *on_finish);
 
-    void apply_metadata(const std::map<std::string, bufferlist> &meta);
+    void apply_metadata(const std::map<std::string, bufferlist> &meta,
+                        bool thread_safe);
 
     ExclusiveLock<ImageCtx> *create_exclusive_lock();
     ObjectMap<ImageCtx> *create_object_map(uint64_t snap_id);
index a78778af636271eebc8ef74ade04c7015262ba28..531a820c0364907d2a23ecf49f3c5fb25e934209 100644 (file)
@@ -73,7 +73,7 @@ Context *OpenRequest<I>::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<I>::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;
index 4ec161698f5dc03e0ed6e6b5eb971c5f281f4251..111cc133cf574a1810a6290b78b42035f2f65636 100644 (file)
@@ -345,7 +345,7 @@ Context *RefreshRequest<I>::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;
index 07490146a56b0a5f5c62fea42af6f9e2b8d297f6..02ab30d4432e215869a736a015a9b32f61b83f5d 100644 (file)
@@ -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));
   }
 
index ca44657c8c2cb01c34862921d07f7da7d9d0b5c5..fab19fa4a7569e23970f2081c63a6342f6444fae 100644 (file)
@@ -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<std::string, bufferlist> &));
+  MOCK_METHOD2(apply_metadata, int(const std::map<std::string, bufferlist> &,
+                                   bool));
 
   ImageCtx *image_ctx;
   CephContext *cct;