]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Librbd: Add basic metadata aware method
authorHaomai Wang <haomaiwang@gmail.com>
Mon, 30 Mar 2015 07:57:34 +0000 (15:57 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Mon, 30 Mar 2015 08:38:08 +0000 (16:38 +0800)
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/librbd/ImageCtx.cc
src/librbd/ImageCtx.h
src/librbd/internal.cc

index 323964ae08a268fc86bcacf42138215a1e0c93e1..9fd209fa1278969b4c1b6377f58a2c4ee7991cda 100644 (file)
@@ -32,6 +32,8 @@ using librados::snap_t;
 using librados::IoCtx;
 
 namespace librbd {
+  const string ImageCtx::METADATA_CONF_PREFIX = "conf_";
+
   ImageCtx::ImageCtx(const string &image_name, const string &image_id,
                     const char *snap, IoCtx& p, bool ro)
     : cct((CephContext*)p.cct()),
@@ -803,4 +805,67 @@ namespace librbd {
       async_requests_cond.Wait(async_ops_lock);
     }
   }
+
+  bool ImageCtx::_aware_metadata_confs(const string &prefix, const char **configs, size_t len,
+                                       map<string, bufferlist> &pairs, map<string, bufferlist> *res) {
+    size_t conf_prefix_len = prefix.size();
+
+    string start = prefix;
+    int r = 0, j = 0;
+    for (map<string, bufferlist>::iterator it = pairs.begin(); it != pairs.end(); ++it) {
+      if (it->first.size() <= conf_prefix_len || !it->first.compare(0, conf_prefix_len, prefix))
+        return false;
+
+      for (int i = 0; i < len; ++i) {
+        if (!it->first.compare(conf_prefix_len, it->first.size() - conf_prefix_len, configs[i])) {
+          res->insert(make_pair(it->first, it->second));
+          break;
+        }
+      }
+    }
+    return true;
+  }
+
+  void ImageCtx::aware_metadata_confs() {
+    ldout(cct, 20) << __func__ << dendl;
+    static const char *aware_confs[] = {
+      "rbd_cache",
+      "rbd_cache_writethrough_until_flush",
+      "rbd_cache_size",
+      "rbd_cache_max_dirty",
+      "rbd_cache_target_dirty",
+      "rbd_cache_max_dirty_age",
+      "rbd_cache_max_dirty_object",
+      "rbd_cache_block_writes_upfront",
+      "rbd_concurrent_management_ops",
+      "rbd_balance_snap_reads"
+    };
+    static uint64_t max_conf_items = 128;
+    size_t conf_prefix_len = METADATA_CONF_PREFIX.size();
+
+    string start = METADATA_CONF_PREFIX;
+    int r = 0, j = 0;
+    bool is_continue;
+    do {
+      map<string, bufferlist> pairs, res;
+      r = cls_client::metadata_list(&md_ctx, header_oid, start, max_conf_items, &pairs);
+      if (r < 0) {
+        lderr(cct) << __func__ << " couldn't list conf metadatas: " << r << dendl;
+        break;
+      }
+      
+      is_continue = _aware_metadata_confs(METADATA_CONF_PREFIX, aware_confs, sizeof(aware_confs) / sizeof(char*),
+                                          pairs, &res);
+      for (map<string, bufferlist>::iterator it = res.begin(); it != res.end(); ++it) {
+        j = cct->_conf->set_val(it->first.c_str(), it->second.c_str());
+        if (j < 0)
+          lderr(cct) << __func__ << " failed to set config " << it->first << " with value "
+                     << it->second.c_str() << ": " << j << dendl;
+        break;
+      }
+      start = pairs.rbegin()->first;
+    } while (is_continue);
+    cct->_conf->apply_changes(NULL);
+  }
+
 }
index 264c817dac451e52c8aa9039885a1b4100299782..7e883f8371bb27d7659fd516ab92c84b4db6bcc9 100644 (file)
@@ -130,6 +130,7 @@ namespace librbd {
 
     xlist<AsyncResizeRequest*> async_resize_reqs;
 
+    static const string METADATA_CONF_PREFIX;
     /**
      * Either image_name or image_id must be set.
      * If id is not known, pass the empty std::string,
@@ -206,7 +207,9 @@ namespace librbd {
     void flush_async_operations(Context *on_finish);
 
     void cancel_async_requests();
-  };
+    void aware_metadata_confs();
+    static bool _aware_metadata_confs(const string &prefix, const char **configs, size_t len,
+                                      map<string, bufferlist> &pairs, map<string, bufferlist> *res);
 }
 
 #endif
index 2f1d8ca80943b3e7993a6fa5dd669535f86974d6..b4e0a225c1210b2e64582833d56dad2dd2578c41 100644 (file)
@@ -2425,6 +2425,7 @@ reprotect_and_return_err:
     int r = ictx->init();
     if (r < 0)
       goto err_close;
+    ictx->aware_metadata_confs();
 
     if (!ictx->read_only) {
       r = ictx->register_watch();