OPTION(filestore_debug_inject_read_err, OPT_BOOL, false)
OPTION(filestore_debug_omap_check, OPT_BOOL, 0) // Expensive debugging check on sync
+OPTION(filestore_omap_header_cache_size, OPT_INT, 1024)
// Use omap for xattrs for attrs over
// filestore_max_inline_xattr_size or
while (map_header_in_use.count(oid))
header_cond.Wait(header_lock);
+ _Header *header = new _Header();
+ {
+ Mutex::Locker l(cache_lock);
+ if (caches.lookup(oid, header)) {
+ return Header(header, RemoveMapHeaderOnDelete(this, oid));
+ }
+ }
+
map<string, bufferlist> out;
set<string> to_get;
to_get.insert(map_header_key(oid));
int r = db->get(HOBJECT_TO_SEQ, to_get, &out);
- if (r < 0)
- return Header();
- if (out.empty())
+ if (r < 0 || out.empty()) {
+ delete header;
return Header();
-
- Header ret(new _Header(), RemoveMapHeaderOnDelete(this, oid));
+ }
+
+ Header ret(header, RemoveMapHeaderOnDelete(this, oid));
bufferlist::iterator iter = out.begin()->second.begin();
ret->decode(iter);
+ {
+ Mutex::Locker l(cache_lock);
+ caches.add(oid, *ret);
+ }
+
return ret;
}
set<string> to_remove;
to_remove.insert(map_header_key(oid));
t->rmkeys(HOBJECT_TO_SEQ, to_remove);
+ {
+ Mutex::Locker l(cache_lock);
+ caches.clear(oid);
+ }
}
void DBObjectMap::set_map_header(const ghobject_t &oid, _Header header,
map<string, bufferlist> to_set;
header.encode(to_set[map_header_key(oid)]);
t->set(HOBJECT_TO_SEQ, to_set);
+ {
+ Mutex::Locker l(cache_lock);
+ caches.add(oid, header);
+ }
}
bool DBObjectMap::check_spos(const ghobject_t &oid,
#include "osd/osd_types.h"
#include "common/Mutex.h"
#include "common/Cond.h"
+#include "common/simple_cache.hpp"
/**
* DBObjectMap: Implements ObjectMap in terms of KeyValueDB
set<uint64_t> in_use;
set<ghobject_t> map_header_in_use;
- DBObjectMap(KeyValueDB *db) : db(db),
- header_lock("DBOBjectMap")
+ DBObjectMap(KeyValueDB *db) : db(db), header_lock("DBOBjectMap"),
+ cache_lock("DBObjectMap::CacheLock"),
+ caches(g_conf->filestore_omap_header_cache_size)
{}
int set_keys(
private:
/// Implicit lock on Header->seq
typedef ceph::shared_ptr<_Header> Header;
+ Mutex cache_lock;
+ SimpleLRU<ghobject_t, _Header> caches;
string map_header_key(const ghobject_t &oid);
string header_key(uint64_t seq);