From: Kefu Chai Date: Mon, 10 Aug 2015 11:25:03 +0000 (-0700) Subject: mon: add a cache layer over MonitorDBStore X-Git-Tag: v9.1.0~290^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5e99a578050976ca22b549812ac80d494fe7041d;p=ceph.git mon: add a cache layer over MonitorDBStore the cache of of leveldb does not perform well under some condition, so we need a cache in our own stack. * add an option "mon_osd_cache_size" to control the size of cache size of MonitorDBStore. Fixes: #12638 Signed-off-by: Kefu Chai --- diff --git a/src/common/config_opts.h b/src/common/config_opts.h index d30e15e3428a..f7ef5bc6a44a 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -186,6 +186,8 @@ OPTION(mon_sync_fs_threshold, OPT_INT, 5) // sync() when writing this many obj OPTION(mon_compact_on_start, OPT_BOOL, false) // compact leveldb on ceph-mon start OPTION(mon_compact_on_bootstrap, OPT_BOOL, false) // trigger leveldb compaction on bootstrap OPTION(mon_compact_on_trim, OPT_BOOL, true) // compact (a prefix) when we trim old states +OPTION(mon_osd_cache_size, OPT_INT, 10) // the size of osdmaps cache, not to rely on underlying store's cache + OPTION(mon_tick_interval, OPT_INT, 5) OPTION(mon_subscribe_interval, OPT_DOUBLE, 300) OPTION(mon_delta_reset_interval, OPT_DOUBLE, 10) // seconds of inactivity before we reset the pg delta to 0 diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 6c2893d0f503..7730670b84e5 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -71,6 +71,14 @@ static ostream& _prefix(std::ostream *_dout, Monitor *mon, OSDMap& osdmap) { << ").osd e" << osdmap.get_epoch() << " "; } +OSDMonitor::OSDMonitor(CephContext *cct, Monitor *mn, Paxos *p, const string& service_name) + : PaxosService(mn, p, service_name), + inc_osd_cache(g_conf->mon_osd_cache_size), + full_osd_cache(g_conf->mon_osd_cache_size), + thrash_map(0), thrash_last_up_osd(-1), + op_tracker(cct, true, 1) +{} + bool OSDMonitor::_have_pending_crush() { return pending_inc.crush.length(); @@ -2409,6 +2417,29 @@ void OSDMonitor::send_incremental(epoch_t first, } } +int OSDMonitor::get_version(version_t ver, bufferlist& bl) +{ + if (inc_osd_cache.lookup(ver, &bl)) { + return 0; + } + int ret = PaxosService::get_version(ver, bl); + if (!ret) { + inc_osd_cache.add(ver, bl); + } + return ret; +} + +int OSDMonitor::get_version_full(version_t ver, bufferlist& bl) +{ + if (full_osd_cache.lookup(ver, &bl)) { + return 0; + } + int ret = PaxosService::get_version_full(ver, bl); + if (!ret) { + full_osd_cache.add(ver, bl); + } + return ret; +} epoch_t OSDMonitor::blacklist(const entity_addr_t& a, utime_t until) { diff --git a/src/mon/OSDMonitor.h b/src/mon/OSDMonitor.h index ef9f15779c02..a185954e1188 100644 --- a/src/mon/OSDMonitor.h +++ b/src/mon/OSDMonitor.h @@ -26,6 +26,7 @@ using namespace std; #include "include/types.h" +#include "common/simple_cache.hpp" #include "msg/Messenger.h" #include "osd/OSDMap.h" @@ -136,6 +137,9 @@ private: map osd_weight; + SimpleLRU inc_osd_cache; + SimpleLRU full_osd_cache; + void check_failures(utime_t now); bool check_failure(utime_t now, int target_osd, failure_info_t& fi); @@ -157,7 +161,6 @@ private: void encode_pending(MonitorDBStore::TransactionRef t); void on_active(); void on_shutdown(); - /** * we haven't delegated full version stashing to paxosservice for some time * now, making this function useless in current context. @@ -387,11 +390,7 @@ private: int load_metadata(int osd, map& m, ostream *err); public: - OSDMonitor(CephContext *cct, Monitor *mn, Paxos *p, string service_name) - : PaxosService(mn, p, service_name), - thrash_map(0), thrash_last_up_osd(-1), - op_tracker(cct, true, 1) - { } + OSDMonitor(CephContext *cct, Monitor *mn, Paxos *p, const string& service_name); void tick(); // check state, take actions @@ -417,6 +416,9 @@ private: send_incremental(op, start); } + int get_version(version_t ver, bufferlist& bl) override; + int get_version_full(version_t ver, bufferlist& bl) override; + epoch_t blacklist(const entity_addr_t& a, utime_t until); void dump_info(Formatter *f); diff --git a/src/mon/PaxosService.h b/src/mon/PaxosService.h index c7f6cf919f93..54d26a69501d 100644 --- a/src/mon/PaxosService.h +++ b/src/mon/PaxosService.h @@ -892,7 +892,7 @@ public: * @param bl The bufferlist to be populated * @return 0 on success; <0 otherwise */ - int get_version(version_t ver, bufferlist& bl) { + virtual int get_version(version_t ver, bufferlist& bl) { return mon->store->get(get_service_name(), ver, bl); } /** @@ -902,7 +902,7 @@ public: * @param bl The bufferlist to be populated * @returns 0 on success; <0 otherwise */ - int get_version_full(version_t ver, bufferlist& bl) { + virtual int get_version_full(version_t ver, bufferlist& bl) { string key = mon->store->combine_strings(full_prefix_name, ver); return mon->store->get(get_service_name(), key, bl); }