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
<< ").osd e" << osdmap.get_epoch() << " ";
}
+OSDMonitor::OSDMonitor(Monitor *mn, Paxos *p, 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) { }
+
bool OSDMonitor::_have_pending_crush()
{
return pending_inc.crush.length();
}
}
+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;
+}
using namespace std;
#include "include/types.h"
+#include "common/simple_cache.hpp"
#include "msg/Messenger.h"
#include "osd/OSDMap.h"
* optimization to try to avoid sending the same inc maps twice.
*/
map<int,epoch_t> osd_epoch;
+ SimpleLRU<version_t, bufferlist> inc_osd_cache;
+ SimpleLRU<version_t, bufferlist> full_osd_cache;
void check_failures(utime_t now);
bool check_failure(utime_t now, int target_osd, failure_info_t& fi);
bool prepare_remove_snaps(struct MRemoveSnaps *m);
public:
- OSDMonitor(Monitor *mn, Paxos *p, string service_name)
- : PaxosService(mn, p, service_name),
- thrash_map(0), thrash_last_up_osd(-1) { }
+ OSDMonitor(Monitor *mn, Paxos *p, string service_name);
void tick(); // check state, take actions
send_incremental(m, start);
}
+ int get_version(version_t ver, bufferlist& bl);
+ int get_version_full(version_t ver, bufferlist& bl);
+
epoch_t blacklist(const entity_addr_t& a, utime_t until);
void dump_info(Formatter *f);
* @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);
}
/**
* @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);
}