Skip to content

Commit

Permalink
Merge pull request #5697: mon: add a cache layer over MonitorDBStore
Browse files Browse the repository at this point in the history
Reviewed-by: Loic Dachary <ldachary@redhat.com>
  • Loading branch information
ldachary committed Aug 30, 2015
2 parents 4c395c6 + 0bc909e commit d67f004
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 5 deletions.
2 changes: 2 additions & 0 deletions src/common/config_opts.h
Expand Up @@ -176,6 +176,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
Expand Down
29 changes: 29 additions & 0 deletions src/mon/OSDMonitor.cc
Expand Up @@ -70,6 +70,12 @@ static ostream& _prefix(std::ostream *_dout, Monitor *mon, OSDMap& osdmap) {
<< ").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();
Expand Down Expand Up @@ -2246,6 +2252,29 @@ void OSDMonitor::send_incremental(epoch_t first, MonSession *session,
}
}

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;
}



Expand Down
10 changes: 7 additions & 3 deletions src/mon/OSDMonitor.h
Expand Up @@ -26,6 +26,7 @@
using namespace std;

#include "include/types.h"
#include "common/simple_cache.hpp"
#include "msg/Messenger.h"

#include "osd/OSDMap.h"
Expand Down Expand Up @@ -139,6 +140,8 @@ class OSDMonitor : public PaxosService {
* 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 note_osd_has_epoch(int osd, epoch_t epoch);

Expand Down Expand Up @@ -380,9 +383,7 @@ class OSDMonitor : public PaxosService {
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

Expand All @@ -407,6 +408,9 @@ class OSDMonitor : public PaxosService {
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);
Expand Down
4 changes: 2 additions & 2 deletions src/mon/PaxosService.h
Expand Up @@ -859,7 +859,7 @@ class PaxosService {
* @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);
}
/**
Expand All @@ -869,7 +869,7 @@ class PaxosService {
* @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);
}
Expand Down

0 comments on commit d67f004

Please sign in to comment.