24 #include "leveldb/cache.h"
25 #include "leveldb/db.h"
26 #include "leveldb/filter_policy.h"
39 : leveldb::EnvWrapper(leveldb::Env::Default())
47 if (maps_->spawned_) {
48 leveldb::Env::Default()->StartThread(f, a);
52 "single threaded leveldb::StartThread called");
59 if (maps_->spawned_) {
60 leveldb::Env::Default()->Schedule(
function, arg);
64 "single threaded leveldb::Schedule called");
69 atomic_inc32(&num_bg_threads_);
71 int retval = pthread_create(&bg_thread, NULL, MainFakeThread, funcarg);
73 retval = pthread_detach(bg_thread);
79 while (atomic_read32(&num_bg_threads_) > 0)
105 const string &leveldb_dir,
106 const uint64_t root_inode,
113 "nfs.leveldb.n_added",
"total number of issued inode");
117 leveldb::Status status;
118 leveldb::Options leveldb_options;
119 leveldb_options.create_if_missing =
true;
125 "rebuilding NFS maps, might result in stale entries");
126 bool retval =
RemoveTree(leveldb_dir +
"/inode2path") &&
143 status.ToString().c_str());
151 leveldb_options.block_size = 512;
160 status.ToString().c_str());
168 if (maps->
seq_ == 0) {
183 if (residue_class < 2) {
196 leveldb::Status status;
197 leveldb::Slice key(reinterpret_cast<const char *>(path.
digest),
201 status =
db_path2inode_->Get(leveldb::ReadOptions(), key, &result);
202 if (!status.ok() && !status.IsNotFound()) {
204 path.
ToString().c_str(), status.ToString().c_str());
207 if (status.IsNotFound()) {
212 const uint64_t *inode =
reinterpret_cast<const uint64_t *
>(result.data());
250 leveldb::Status status;
251 leveldb::Slice key(reinterpret_cast<const char *>(&inode),
sizeof(inode));
254 status =
db_inode2path_->Get(leveldb::ReadOptions(), key, &result);
255 if (status.IsNotFound()) {
257 "failed to find inode %" PRIu64
" in NFS maps, returning ESTALE",
263 "failed to read from inode2path db inode %" PRIu64
": %s", inode,
264 status.ToString().c_str());
267 path->
Assign(result.data(), result.length());
269 inode, path->
c_str());
277 db_inode2path_->GetProperty(leveldb::Slice(
"leveldb.stats"), &stats);
278 stats +=
"inode --> path database:\n" + stats +
"\n";
280 db_path2inode_->GetProperty(leveldb::Slice(
"leveldb.stats"), &stats);
281 stats +=
"path --> inode database:\n" + stats +
"\n";
303 lock_ =
reinterpret_cast<pthread_mutex_t *
>(smalloc(
sizeof(pthread_mutex_t)));
304 int retval = pthread_mutex_init(
lock_, NULL);
321 pthread_mutex_destroy(
lock_);
327 const uint64_t inode,
330 leveldb::Status status;
331 leveldb::Slice key(reinterpret_cast<const char *>(&inode),
sizeof(inode));
334 status =
db_inode2path_->Put(leveldb::WriteOptions(), key, value);
337 "failed to write inode2path entry (%" PRIu64
" --> %s): %s", inode,
338 path.
c_str(), status.ToString().c_str());
341 inode, path.
c_str());
347 const uint64_t inode)
349 leveldb::Status status;
350 leveldb::Slice key(reinterpret_cast<const char *>(path.
digest),
352 leveldb::Slice value(reinterpret_cast<const char *>(&inode),
sizeof(inode));
354 status =
db_path2inode_->Put(leveldb::WriteOptions(), key, value);
357 "failed to write path2inode entry (%s --> %" PRIu64
"): %s",
358 path.
ToString().c_str(), inode, status.ToString().c_str());
#define LogCvmfs(source, mask,...)
Counter * Register(const std::string &name, const std::string &desc)
virtual bool GetPath(const uint64_t inode, PathString *path)
virtual void SetInodeResidue(unsigned residue_class, unsigned remainder)
const leveldb::FilterPolicy * filter_inode2path_
atomic_int32 num_bg_threads_
std::string ToString(const bool with_suffix=false) const
void Assign(const char *chars, const unsigned length)
static NfsMapsLeveldb * Create(const std::string &leveldb_dir, const uint64_t root_inode, const bool rebuild, perf::Statistics *statistics)
uint64_t FindInode(const shash::Md5 &path)
virtual uint64_t GetInode(const PathString &path)
perf::Counter * n_db_added_
assert((mem||(size==0))&&"Out Of Memory")
leveldb::DB * db_path2inode_
unsigned char digest[digest_size_]
unsigned inode_residue_class_
void PutInode2Path(const uint64_t inode, const PathString &path)
ForkAwareEnv(NfsMapsLeveldb *maps)
static void * MainFakeThread(void *data)
unsigned GetDigestSize() const
virtual std::string GetStatistics()
leveldb::DB * db_inode2path_
leveldb::Cache * cache_path2inode_
unsigned inode_remainder_
void Schedule(void(*function)(void *), void *arg)
void PutPath2Inode(const shash::Md5 &path, const uint64_t inode)
virtual ~NfsMapsLeveldb()
void StartThread(void(*f)(void *), void *a)
void Inc(class Counter *counter)
bool RemoveTree(const std::string &path)
void SleepForMicroseconds(int micros)
const leveldb::FilterPolicy * filter_path2inode_
void SafeSleepMs(const unsigned ms)
unsigned GetLength() const
ForkAwareEnv * fork_aware_env_
const char * c_str() const
const char * GetChars() const
leveldb::Cache * cache_inode2path_