CernVM-FS  2.13.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
nfs_maps_leveldb.h
Go to the documentation of this file.
1 
5 #ifndef CVMFS_NFS_MAPS_LEVELDB_H_
6 #define CVMFS_NFS_MAPS_LEVELDB_H_
7 
8 #include <pthread.h>
9 
10 #include <string>
11 
12 #include "crypto/hash.h"
13 #include "leveldb/env.h"
14 #include "nfs_maps.h"
15 #include "util/atomic.h"
16 
17 
18 namespace leveldb {
19 class DB;
20 class Cache;
21 class FilterPolicy;
22 } // namespace leveldb
23 namespace perf {
24 class Counter;
25 class Statistics;
26 } // namespace perf
27 
28 
29 class NfsMapsLeveldb : public NfsMaps {
30  public:
31  virtual ~NfsMapsLeveldb();
32  virtual uint64_t GetInode(const PathString &path);
33  virtual bool GetPath(const uint64_t inode, PathString *path);
34  virtual void SetInodeResidue(unsigned residue_class, unsigned remainder);
35  virtual void Spawn() { spawned_ = true; }
36  virtual std::string GetStatistics();
37 
38  static NfsMapsLeveldb *Create(const std::string &leveldb_dir,
39  const uint64_t root_inode,
40  const bool rebuild,
41  perf::Statistics *statistics);
42 
43  private:
44  class ForkAwareEnv;
45  struct FuncArg {
46  void (*function)(void *);
47  void *arg;
48  class ForkAwareEnv *env;
49  };
50 
56  class ForkAwareEnv : public leveldb::EnvWrapper {
57  public:
58  explicit ForkAwareEnv(NfsMapsLeveldb *maps);
59  void StartThread(void (*f)(void *), void *a);
60  void Schedule(void (*function)(void *), void *arg);
61  void WaitForBGThreads();
62  void SleepForMicroseconds(int micros);
63 
64  private:
65  static void *MainFakeThread(void *data);
66 
69  };
70 
72  void PutInode2Path(const uint64_t inode, const PathString &path);
73  void PutPath2Inode(const shash::Md5 &path, const uint64_t inode);
74  uint64_t FindInode(const shash::Md5 &path);
75 
76  leveldb::DB *db_inode2path_;
77  leveldb::DB *db_path2inode_;
78  leveldb::Cache *cache_inode2path_;
79  leveldb::Cache *cache_path2inode_;
80  const leveldb::FilterPolicy *filter_inode2path_;
81  const leveldb::FilterPolicy *filter_path2inode_;
83  uint64_t root_inode_;
84  uint64_t seq_;
85  pthread_mutex_t *lock_;
86  bool spawned_;
87 
89  unsigned inode_remainder_;
90 
92 };
93 
94 #endif // CVMFS_NFS_MAPS_LEVELDB_H_
virtual bool GetPath(const uint64_t inode, PathString *path)
pthread_mutex_t * lock_
virtual void SetInodeResidue(unsigned residue_class, unsigned remainder)
const leveldb::FilterPolicy * filter_inode2path_
uint64_t root_inode_
virtual void Spawn()
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_
leveldb::DB * db_path2inode_
unsigned inode_residue_class_
void PutInode2Path(const uint64_t inode, const PathString &path)
ForkAwareEnv(NfsMapsLeveldb *maps)
int32_t atomic_int32
Definition: atomic.h:17
static void * MainFakeThread(void *data)
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 SleepForMicroseconds(int micros)
const leveldb::FilterPolicy * filter_path2inode_
ForkAwareEnv * fork_aware_env_
leveldb::Cache * cache_inode2path_
class ForkAwareEnv * env