]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: refresh image after applying new/removing old metadata 18158/head
authorJason Dillaman <dillaman@redhat.com>
Fri, 6 Oct 2017 19:03:34 +0000 (15:03 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 10 Oct 2017 13:10:26 +0000 (09:10 -0400)
Fixes: http://tracker.ceph.com/issues/21711
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/Operations.cc
src/librbd/Utils.cc
src/librbd/Utils.h
src/librbd/journal/Replay.cc
src/test/librbd/journal/test_Replay.cc
src/test/librbd/journal/test_mock_Replay.cc

index 15dff8224e5acac339104e70d3647d323aa83f9f..65dea8f8c41ee1e7a5abb138bc8f16a816898d40 100644 (file)
@@ -1352,13 +1352,11 @@ int Operations<I>::metadata_set(const std::string &key,
   ldout(cct, 5) << this << " " << __func__ << ": key=" << key << ", value="
                 << value << dendl;
 
-  string start = m_image_ctx.METADATA_CONF_PREFIX;
-  size_t conf_prefix_len = start.size();
-
-  if (key.size() > conf_prefix_len && !key.compare(0, conf_prefix_len, start)) {
+  std::string config_key;
+  bool config_override = util::is_metadata_config_override(key, &config_key);
+  if (config_override) {
     // validate config setting
-    string subkey = key.substr(conf_prefix_len, key.size() - conf_prefix_len);
-    int r = md_config_t().set_val(subkey.c_str(), value);
+    int r = md_config_t().set_val(config_key.c_str(), value);
     if (r < 0) {
       return r;
     }
@@ -1392,6 +1390,11 @@ int Operations<I>::metadata_set(const std::string &key,
     r = metadata_ctx.wait();
   }
 
+  if (config_override && r >= 0) {
+    // apply new config key immediately
+    r = m_image_ctx.state->refresh_if_required();
+  }
+
   return r;
 }
 
@@ -1454,6 +1457,12 @@ int Operations<I>::metadata_remove(const std::string &key) {
     r = metadata_ctx.wait();
   }
 
+  std::string config_key;
+  if (util::is_metadata_config_override(key, &config_key) && r >= 0) {
+    // apply new config key immediately
+    r = m_image_ctx.state->refresh_if_required();
+  }
+
   return r;
 }
 
index dc6e7988e69c65169ad07ebbb0b5eb12fbff2229..6f71841d7ee771ef6e1342ae996a7421a22cc1b7 100644 (file)
@@ -9,6 +9,7 @@
 #include "include/stringify.h"
 #include "include/rbd/features.h"
 #include "common/dout.h"
+#include "librbd/ImageCtx.h"
 
 #define dout_subsys ceph_subsys_rbd
 #undef dout_prefix
@@ -98,6 +99,19 @@ bool calc_sparse_extent(const bufferptr &bp,
   }
   return false;
 }
-} // namespace util
 
+bool is_metadata_config_override(const std::string& metadata_key,
+                                 std::string* config_key) {
+  size_t prefix_len = librbd::ImageCtx::METADATA_CONF_PREFIX.size();
+  if (metadata_key.size() > prefix_len &&
+      metadata_key.compare(0, prefix_len,
+                           librbd::ImageCtx::METADATA_CONF_PREFIX) == 0) {
+    *config_key = metadata_key.substr(prefix_len,
+                                      metadata_key.size() - prefix_len);
+    return true;
+  }
+  return false;
+}
+
+} // namespace util
 } // namespace librbd
index 19c634479433988903960f0edfa4c5df019df3e0..1bdf1b6714a21ea17d9153393fe1dc0daebd2237 100644 (file)
@@ -208,6 +208,9 @@ inline ZTracer::Trace create_trace(const I &image_ctx, const char *trace_name,
   return ZTracer::Trace();
 }
 
+bool is_metadata_config_override(const std::string& metadata_key,
+                                 std::string* config_key);
+
 } // namespace util
 
 } // namespace librbd
index a5852088492978e4c62e2b0196c090640b69249c..e2e4f0e8e162bde25abdc847a30165ad6bd5352a 100644 (file)
@@ -816,7 +816,8 @@ void Replay<I>::handle_event(const journal::MetadataSetEvent &event,
     return;
   }
 
-  op_event->on_op_finish_event = new C_RefreshIfRequired<I>(
+  on_op_complete = new C_RefreshIfRequired<I>(m_image_ctx, on_op_complete);
+  op_event->on_op_finish_event = util::create_async_context_callback(
     m_image_ctx, new ExecuteOp<I, journal::MetadataSetEvent>(
       m_image_ctx, event, on_op_complete));
 
@@ -837,7 +838,8 @@ void Replay<I>::handle_event(const journal::MetadataRemoveEvent &event,
     return;
   }
 
-  op_event->on_op_finish_event = new C_RefreshIfRequired<I>(
+  on_op_complete = new C_RefreshIfRequired<I>(m_image_ctx, on_op_complete);
+  op_event->on_op_finish_event = util::create_async_context_callback(
     m_image_ctx, new ExecuteOp<I, journal::MetadataRemoveEvent>(
       m_image_ctx, event, on_op_complete));
 
index 0b7180e87cd625ba8d1985b9a4ca3be357822e73..01d510b6100026b7977be53b62f2ab5a1aa8eed7 100644 (file)
@@ -741,7 +741,8 @@ TEST_F(TestJournalReplay, MetadataSet) {
   get_journal_commit_position(ictx, &initial_tag, &initial_entry);
 
   // inject metadata_set op into journal
-  inject_into_journal(ictx, librbd::journal::MetadataSetEvent(1, "key", "value"));
+  inject_into_journal(ictx, librbd::journal::MetadataSetEvent(
+    1, "conf_rbd_mirroring_replay_delay", "9876"));
   inject_into_journal(ictx, librbd::journal::OpFinishEvent(1, 0));
   close_image(ictx);
 
@@ -755,9 +756,12 @@ TEST_F(TestJournalReplay, MetadataSet) {
   ASSERT_EQ(initial_tag + 1, current_tag);
   ASSERT_EQ(1, current_entry);
 
+  ASSERT_EQ(9876, ictx->mirroring_replay_delay);
+
   std::string value;
-  ASSERT_EQ(0, librbd::metadata_get(ictx, "key", &value));
-  ASSERT_EQ("value", value);
+  ASSERT_EQ(0, librbd::metadata_get(ictx, "conf_rbd_mirroring_replay_delay",
+                                    &value));
+  ASSERT_EQ("9876", value);
 
   // verify lock ordering constraints
   ASSERT_EQ(0, ictx->operations->metadata_set("key2", "value"));
@@ -771,7 +775,8 @@ TEST_F(TestJournalReplay, MetadataRemove) {
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
   ASSERT_EQ(0, when_acquired_lock(ictx));
 
-  ASSERT_EQ(0, ictx->operations->metadata_set("key", "value"));
+  ASSERT_EQ(0, ictx->operations->metadata_set(
+    "conf_rbd_mirroring_replay_delay", "9876"));
 
   // get current commit position
   int64_t initial_tag;
@@ -779,7 +784,8 @@ TEST_F(TestJournalReplay, MetadataRemove) {
   get_journal_commit_position(ictx, &initial_tag, &initial_entry);
 
   // inject metadata_remove op into journal
-  inject_into_journal(ictx, librbd::journal::MetadataRemoveEvent(1, "key"));
+  inject_into_journal(ictx, librbd::journal::MetadataRemoveEvent(
+    1, "conf_rbd_mirroring_replay_delay"));
   inject_into_journal(ictx, librbd::journal::OpFinishEvent(1, 0));
   close_image(ictx);
 
@@ -792,9 +798,12 @@ TEST_F(TestJournalReplay, MetadataRemove) {
   get_journal_commit_position(ictx, &current_tag, &current_entry);
   ASSERT_EQ(initial_tag, current_tag);
   ASSERT_EQ(initial_entry + 2, current_entry);
+  ASSERT_EQ(0, ictx->mirroring_replay_delay);
 
   std::string value;
-  ASSERT_EQ(-ENOENT, librbd::metadata_get(ictx, "key", &value));
+  ASSERT_EQ(-ENOENT,
+            librbd::metadata_get(ictx, "conf_rbd_mirroring_replay_delay",
+                                 &value));
 
   // verify lock ordering constraints
   ASSERT_EQ(0, ictx->operations->metadata_set("key", "value"));
index 8c39576905d7f19dfb98fd45ebdfc4451ff402c9..e318cc3916b596f4abfdc36e2d605eda7c11d181 100644 (file)
@@ -1700,8 +1700,8 @@ TEST_F(TestMockJournalReplay, MetadataSetEvent) {
 
   InSequence seq;
   Context *on_finish = nullptr;
-  expect_refresh_image(mock_image_ctx, false, 0);
   expect_metadata_set(mock_image_ctx, &on_finish, "key", "value");
+  expect_refresh_image(mock_image_ctx, false, 0);
 
   C_SaferCond on_start_ready;
   C_SaferCond on_start_safe;
@@ -1737,8 +1737,8 @@ TEST_F(TestMockJournalReplay, MetadataRemoveEvent) {
 
   InSequence seq;
   Context *on_finish = nullptr;
-  expect_refresh_image(mock_image_ctx, false, 0);
   expect_metadata_remove(mock_image_ctx, &on_finish, "key");
+  expect_refresh_image(mock_image_ctx, false, 0);
 
   C_SaferCond on_start_ready;
   C_SaferCond on_start_safe;
@@ -1774,7 +1774,6 @@ TEST_F(TestMockJournalReplay, MetadataRemoveEventDNE) {
 
   InSequence seq;
   Context *on_finish = nullptr;
-  expect_refresh_image(mock_image_ctx, false, 0);
   expect_metadata_remove(mock_image_ctx, &on_finish, "key");
 
   C_SaferCond on_start_ready;