CernVM-FS  2.13.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
kvstore.h
Go to the documentation of this file.
1 
5 #ifndef CVMFS_KVSTORE_H_
6 #define CVMFS_KVSTORE_H_
7 
8 #include <pthread.h>
9 #include <unistd.h>
10 
11 #include <string>
12 #include <vector>
13 
14 #include "cache.h"
15 #include "lru.h"
16 #include "malloc_heap.h"
17 #include "statistics.h"
18 #include "util/async.h"
19 #include "util/single_copy.h"
20 
21 using namespace std; // NOLINT
22 
23 
29 struct AllocHeader {
30  AllocHeader() : version(0), id() { }
31  uint8_t version;
33 };
34 
35 
40 struct MemoryBuffer {
42  : address(NULL), size(0), refcount(0), object_flags(0), id() { }
43  void *address;
44  size_t size;
45  unsigned int refcount;
48 };
49 
50 
62 class MemoryKvStore : SingleCopy, public Callbackable<MallocHeap::BlockPtr> {
63  public:
67  };
68 
69  struct Counters {
83 
84  explicit Counters(perf::StatisticsTemplate statistics) {
85  sz_size = statistics.RegisterTemplated("sz_size", "Total size");
86  n_getsize = statistics.RegisterTemplated("n_getsize",
87  "Number of GetSize calls");
88  n_getrefcount = statistics.RegisterTemplated(
89  "n_getrefcount", "Number of GetRefcount calls");
90  n_incref = statistics.RegisterTemplated("n_incref",
91  "Number of IncRef calls");
92  n_unref = statistics.RegisterTemplated("n_unref",
93  "Number of Unref calls");
94  n_read = statistics.RegisterTemplated("n_read", "Number of Read calls");
95  n_commit = statistics.RegisterTemplated("n_commit",
96  "Number of Commit calls");
97  n_delete = statistics.RegisterTemplated("n_delete",
98  "Number of Delete calls");
99  n_shrinkto = statistics.RegisterTemplated("n_shrinkto",
100  "Number of ShrinkTo calls");
101  sz_read = statistics.RegisterTemplated("sz_read", "Bytes read");
102  sz_committed = statistics.RegisterTemplated("sz_committed",
103  "Bytes committed");
104  sz_deleted = statistics.RegisterTemplated("sz_deleted", "Bytes deleted");
105  sz_shrunk = statistics.RegisterTemplated("sz_shrunk", "Bytes shrunk");
106  }
107  };
108 
109  MemoryKvStore(unsigned int cache_entries,
110  MemoryAllocator alloc,
111  unsigned alloc_size,
112  perf::StatisticsTemplate statistics);
113 
114  ~MemoryKvStore();
115 
121  bool Contains(const shash::Any &id);
122 
129  int64_t GetSize(const shash::Any &id);
130 
137  int64_t GetRefcount(const shash::Any &id);
138 
144  bool IncRef(const shash::Any &id);
145 
152  bool Unref(const shash::Any &id);
153 
163  int64_t Read(const shash::Any &id, void *buf, size_t size, size_t offset);
164 
172  int Commit(const MemoryBuffer &buf);
173 
180  bool Delete(const shash::Any &id);
181 
188  bool ShrinkTo(size_t size);
189 
193  size_t GetUsed() { return used_bytes_; }
194 
195  private:
196  // Compact memory once utilization falls below the threshold
197  static const double kCompactThreshold; // = 0.8
198 
199  bool DoDelete(const shash::Any &id);
200  int DoMalloc(MemoryBuffer *buf);
201  void DoFree(MemoryBuffer *buf);
202  int DoCommit(const MemoryBuffer &buf);
203  void OnBlockMove(const MallocHeap::BlockPtr &ptr);
204  bool CompactMemory();
205 
207  size_t used_bytes_;
208  unsigned int entry_count_;
209  unsigned int max_entries_;
212  pthread_rwlock_t rwlock_;
214 };
215 
216 #endif // CVMFS_KVSTORE_H_
unsigned int max_entries_
Definition: kvstore.h:209
perf::Counter * n_delete
Definition: kvstore.h:77
static const double kCompactThreshold
Definition: kvstore.h:197
Counters(perf::StatisticsTemplate statistics)
Definition: kvstore.h:84
perf::Counter * n_read
Definition: kvstore.h:75
perf::Counter * n_getrefcount
Definition: kvstore.h:72
uint8_t version
Definition: kvstore.h:31
perf::Counter * n_unref
Definition: kvstore.h:74
static void Read(void *buf, size_t nbyte)
Definition: helper_util.cc:97
unsigned int entry_count_
Definition: kvstore.h:208
size_t used_bytes_
Definition: kvstore.h:207
unsigned int refcount
Definition: kvstore.h:45
perf::Counter * n_getsize
Definition: kvstore.h:71
perf::Counter * sz_deleted
Definition: kvstore.h:81
MemoryAllocator allocator_
Definition: kvstore.h:206
Counter * RegisterTemplated(const std::string &name_minor, const std::string &desc)
Definition: statistics.h:109
perf::Counter * sz_size
Definition: kvstore.h:70
AllocHeader()
Definition: kvstore.h:30
perf::Counter * n_commit
Definition: kvstore.h:76
size_t GetUsed()
Definition: kvstore.h:193
perf::Counter * sz_shrunk
Definition: kvstore.h:82
MemoryBuffer()
Definition: kvstore.h:41
shash::Any id
Definition: kvstore.h:47
pthread_rwlock_t rwlock_
Definition: kvstore.h:212
MallocHeap * heap_
Definition: kvstore.h:211
int object_flags
Definition: kvstore.h:46
lru::LruCache< shash::Any, MemoryBuffer > entries_
Definition: kvstore.h:210
void * address
Definition: kvstore.h:43
size_t size
Definition: kvstore.h:44
shash::Any id
Definition: kvstore.h:32
perf::Counter * n_incref
Definition: kvstore.h:73
perf::Counter * sz_read
Definition: kvstore.h:79
perf::Counter * n_shrinkto
Definition: kvstore.h:78
Counters counters_
Definition: kvstore.h:213
static void size_t size
Definition: smalloc.h:54
perf::Counter * sz_committed
Definition: kvstore.h:80