CernVM-FS  2.12.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
quota_posix.h
Go to the documentation of this file.
1 
5 #ifndef CVMFS_QUOTA_POSIX_H_
6 #define CVMFS_QUOTA_POSIX_H_
7 
8 #include <pthread.h>
9 #include <stdint.h>
10 #include <sys/types.h>
11 #include <unistd.h>
12 
13 #include <map>
14 #include <string>
15 #include <vector>
16 
17 #include "crypto/hash.h"
18 #include "duplex_sqlite3.h"
19 #include "gtest/gtest_prod.h"
20 #include "quota.h"
21 #include "statistics.h"
22 #include "util/single_copy.h"
23 #include "util/string.h"
24 
25 namespace perf {
26 class Recorder;
27 }
28 
36  FRIEND_TEST(T_QuotaManager, BindReturnPipe);
37  FRIEND_TEST(T_QuotaManager, Cleanup);
38  FRIEND_TEST(T_QuotaManager, Contains);
39  FRIEND_TEST(T_QuotaManager, InitDatabase);
40  FRIEND_TEST(T_QuotaManager, MakeReturnPipe);
41 
42  public:
43  static PosixQuotaManager *Create(const std::string &cache_workspace,
44  const uint64_t limit, const uint64_t cleanup_threshold,
45  const bool rebuild_database);
47  const std::string &exe_path,
48  const std::string &cache_workspace,
49  const uint64_t limit,
50  const uint64_t cleanup_threshold,
51  bool foreground);
52  static int MainCacheManager(int argc, char **argv);
53 
54  virtual ~PosixQuotaManager();
55  virtual bool HasCapability(Capabilities capability) { return true; }
56 
57  virtual void Insert(const shash::Any &hash, const uint64_t size,
58  const std::string &description);
59  virtual void InsertVolatile(const shash::Any &hash, const uint64_t size,
60  const std::string &description);
61  virtual bool Pin(const shash::Any &hash, const uint64_t size,
62  const std::string &description, const bool is_catalog);
63  virtual void Unpin(const shash::Any &hash);
64  virtual void Touch(const shash::Any &hash);
65  virtual void Remove(const shash::Any &file);
66  virtual bool Cleanup(const uint64_t leave_size);
67 
68  virtual void RegisterBackChannel(int back_channel[2],
69  const std::string &channel_id);
70  virtual void UnregisterBackChannel(int back_channel[2],
71  const std::string &channel_id);
72 
73  virtual std::vector<std::string> List();
74  virtual std::vector<std::string> ListPinned();
75  virtual std::vector<std::string> ListCatalogs();
76  virtual std::vector<std::string> ListVolatile();
77  virtual uint64_t GetMaxFileSize();
78  virtual uint64_t GetCapacity();
79  virtual uint64_t GetSize();
80  virtual uint64_t GetSizePinned();
81  virtual bool SetLimit(uint64_t limit);
82  virtual uint64_t GetCleanupRate(uint64_t period_s);
83 
84  virtual void Spawn();
85  virtual pid_t GetPid();
86  virtual uint32_t GetProtocolRevision();
87 
88  void ManagedReadHalfPipe(int fd, void *buf, size_t nbyte);
90 
91 
92  private:
96  enum FileTypes {
99  };
100 
104  enum CommandType {
105  kTouch = 0,
123  // as of protocol revision 2
127  };
128 
134  struct LruCommand {
136  uint64_t size;
143  uint16_t desc_length;
144 
146  : command_type(static_cast<CommandType>(0))
147  , size(0)
148  , return_pipe(-1)
149  , desc_length(0)
150  {
151  memset(digest, 0, shash::kMaxDigestSize);
152  }
153 
154  void SetSize(const uint64_t new_size) {
155  uint64_t mask = 7;
156  mask = ~(mask << (64-3));
157  size = (new_size & mask) | size;
158  }
159 
160  uint64_t GetSize() const {
161  uint64_t mask = 7;
162  mask = ~(mask << (64-3));
163  return size & mask;
164  }
165 
166  void StoreHash(const shash::Any &hash) {
167  memcpy(digest, hash.digest, hash.GetDigestSize());
168  // Exclude MD5
169  uint64_t algo_flags = hash.algorithm - 1;
170  algo_flags = algo_flags << (64-3);
171  size |= algo_flags;
172  }
173 
175  uint64_t algo_flags = size >> (64-3);
176  shash::Any result(static_cast<shash::Algorithms>(algo_flags+1));
177  memcpy(result.digest, digest, result.GetDigestSize());
178  return result;
179  }
180  };
181 
185  struct EvictCandidate {
186  uint64_t size;
187  uint64_t acseq;
189  EvictCandidate(const shash::Any &h, uint64_t s, uint64_t a)
190  : size(s), acseq(a), hash(h) {}
191  };
192 
196  static const unsigned kLockFileMagicNumber = 142857;
197 
201  static const unsigned kSqliteMemPerThread = 2*1024*1024;
202 
207  static const unsigned kCommandBufferSize = 32;
208 
212  static const unsigned kEvictBatchSize = 1000;
213 
218  static const unsigned kMaxDescription = 512-sizeof(LruCommand);
219 
224  static const unsigned kHighPinWatermark = 75;
225 
231  static const uint64_t kVolatileFlag = 1ULL << 63;
232 
233  bool InitDatabase(const bool rebuild_database);
234  bool RebuildDatabase();
235  void CloseDatabase();
236  bool Contains(const std::string &hash_str);
237  bool DoCleanup(const uint64_t leave_size);
238  bool EmptyTrash(const std::vector<std::string> &trash);
239 
240  void MakeReturnPipe(int pipe[2]);
241  int BindReturnPipe(int pipe_wronly);
242  void UnbindReturnPipe(int pipe_wronly);
243  void UnlinkReturnPipe(int pipe_wronly);
244  void CloseReturnPipe(int pipe[2]);
245  void CleanupPipes();
246 
247  void CheckFreeSpace();
248  void CheckHighPinWatermark();
249  void ProcessCommandBunch(const unsigned num,
250  const LruCommand *commands,
251  const char *descriptions);
252  static void *MainCommandServer(void *data);
253 
254  void DoInsert(const shash::Any &hash, const uint64_t size,
255  const std::string &description, const CommandType command_type);
256  std::vector<std::string> DoList(const CommandType list_command);
257  void GetSharedStatus(uint64_t *gauge, uint64_t *pinned);
258  bool SetSharedLimit(uint64_t limit);
259  void GetLimits(uint64_t *limit, uint64_t *cleanup_threshold);
260 
261  static void ParseDirectories(const std::string cache_workspace,
262  std::string *cache_dir,
263  std::string *workspace_dir);
264  PosixQuotaManager(const uint64_t limit, const uint64_t cleanup_threshold,
265  const std::string &cache_workspace);
266 
271  bool shared_;
272 
277  bool spawned_;
278 
282  uint64_t limit_;
283 
288 
292  uint64_t gauge_;
293 
297  uint64_t pinned_;
298 
303  uint64_t seq_;
304 
308  std::string cache_dir_;
309 
315  std::string workspace_dir_;
316 
320  std::map<shash::Any, uint64_t> pinned_chunks_;
321 
325  int pipe_lru_[2];
326 
330  pthread_t thread_lru_;
331 
336 
342 
343 
349 
355 
356  sqlite3 *database_;
357  sqlite3_stmt *stmt_touch_;
358  sqlite3_stmt *stmt_unpin_;
359  sqlite3_stmt *stmt_block_;
360  sqlite3_stmt *stmt_unblock_;
361  sqlite3_stmt *stmt_new_;
362  sqlite3_stmt *stmt_lru_;
363  sqlite3_stmt *stmt_size_;
364  sqlite3_stmt *stmt_rm_;
365  sqlite3_stmt *stmt_rm_batch_;
366  sqlite3_stmt *stmt_list_;
367  sqlite3_stmt *stmt_list_pinned_;
368  sqlite3_stmt *stmt_list_catalogs_;
369  sqlite3_stmt *stmt_list_volatile_;
370 
375 }; // class PosixQuotaManager
376 
377 #endif // CVMFS_QUOTA_POSIX_H_
virtual uint32_t GetProtocolRevision()
Definition: quota_posix.cc:719
sqlite3_stmt * stmt_new_
Definition: quota_posix.h:361
sqlite3_stmt * stmt_block_
Definition: quota_posix.h:359
sqlite3_stmt * stmt_list_pinned_
Definition: quota_posix.h:367
virtual void UnregisterBackChannel(int back_channel[2], const std::string &channel_id)
std::vector< std::string > DoList(const CommandType list_command)
Definition: quota_posix.cc:631
virtual pid_t GetPid()
Definition: quota_posix.cc:697
virtual uint64_t GetCleanupRate(uint64_t period_s)
Definition: quota_posix.cc:793
static const unsigned kCommandBufferSize
Definition: quota_posix.h:207
sqlite3_stmt * stmt_list_
Definition: quota_posix.h:366
void GetLimits(uint64_t *limit, uint64_t *cleanup_threshold)
Definition: quota_posix.cc:673
virtual uint64_t GetSize()
Definition: quota_posix.cc:777
sqlite3_stmt * stmt_rm_
Definition: quota_posix.h:364
virtual bool Cleanup(const uint64_t leave_size)
Definition: quota_posix.cc:125
static const unsigned kSqliteMemPerThread
Definition: quota_posix.h:201
virtual uint64_t GetMaxFileSize()
Definition: quota_posix.cc:692
uint64_t cleanup_threshold_
Definition: quota_posix.h:287
Capabilities
Definition: quota.h:47
bool DoCleanup(const uint64_t leave_size)
Definition: quota_posix.cc:472
uint64_t GetSize() const
Definition: quota_posix.h:160
static void * MainCommandServer(void *data)
virtual void Insert(const shash::Any &hash, const uint64_t size, const std::string &description)
sqlite3_stmt * stmt_rm_batch_
Definition: quota_posix.h:365
bool InitDatabase(const bool rebuild_database)
Definition: quota_posix.cc:811
int BindReturnPipe(int pipe_wronly)
Definition: quota_posix.cc:64
std::string cache_dir_
Definition: quota_posix.h:308
bool Contains(const std::string &hash_str)
Definition: quota_posix.cc:191
Algorithms algorithm
Definition: hash.h:125
perf::MultiRecorder cleanup_recorder_
Definition: quota_posix.h:354
sqlite3 * database_
Definition: quota_posix.h:356
unsigned char digest[digest_size_]
Definition: hash.h:124
virtual bool SetLimit(uint64_t limit)
Definition: quota_posix.cc:767
virtual std::vector< std::string > ListCatalogs()
void CheckHighPinWatermark()
Definition: quota_posix.cc:82
sqlite3_stmt * stmt_lru_
Definition: quota_posix.h:362
void GetSharedStatus(uint64_t *gauge, uint64_t *pinned)
Definition: quota_posix.cc:738
pid_t pid_
Definition: cvmfs.cc:154
unsigned GetDigestSize() const
Definition: hash.h:168
std::string workspace_dir_
Definition: quota_posix.h:315
void MakeReturnPipe(int pipe[2])
virtual std::vector< std::string > ListPinned()
pthread_t thread_lru_
Definition: quota_posix.h:330
virtual uint64_t GetSizePinned()
Definition: quota_posix.cc:785
void ManagedReadHalfPipe(int fd, void *buf, size_t nbyte)
virtual bool HasCapability(Capabilities capability)
Definition: quota_posix.h:55
virtual bool Pin(const shash::Any &hash, const uint64_t size, const std::string &description, const bool is_catalog)
virtual std::vector< std::string > ListVolatile()
virtual uint64_t GetCapacity()
Definition: quota_posix.cc:657
FRIEND_TEST(T_QuotaManager, BindReturnPipe)
static const unsigned kEvictBatchSize
Definition: quota_posix.h:212
void SetSize(const uint64_t new_size)
Definition: quota_posix.h:154
shash::Any RetrieveHash() const
Definition: quota_posix.h:174
static const unsigned kHighPinWatermark
Definition: quota_posix.h:224
virtual void RegisterBackChannel(int back_channel[2], const std::string &channel_id)
void UnlinkReturnPipe(int pipe_wronly)
virtual void Remove(const shash::Any &file)
static PosixQuotaManager * Create(const std::string &cache_workspace, const uint64_t limit, const uint64_t cleanup_threshold, const bool rebuild_database)
Definition: quota_posix.cc:232
sqlite3_stmt * stmt_touch_
Definition: quota_posix.h:357
void DoInsert(const shash::Any &hash, const uint64_t size, const std::string &description, const CommandType command_type)
Definition: quota_posix.cc:606
sqlite3_stmt * stmt_list_volatile_
Definition: quota_posix.h:369
void ProcessCommandBunch(const unsigned num, const LruCommand *commands, const char *descriptions)
sqlite3_stmt * stmt_unblock_
Definition: quota_posix.h:360
virtual void Unpin(const shash::Any &hash)
PosixQuotaManager(const uint64_t limit, const uint64_t cleanup_threshold, const std::string &cache_workspace)
virtual std::vector< std::string > List()
static int MainCacheManager(int argc, char **argv)
bool EmptyTrash(const std::vector< std::string > &trash)
Definition: quota_posix.cc:566
static const unsigned kMaxDescription
Definition: quota_posix.h:218
bool SetSharedLimit(uint64_t limit)
Definition: quota_posix.cc:751
virtual void InsertVolatile(const shash::Any &hash, const uint64_t size, const std::string &description)
static const unsigned kLockFileMagicNumber
Definition: quota_posix.h:196
unsigned char digest[shash::kMaxDigestSize]
Definition: quota_posix.h:138
sqlite3_stmt * stmt_list_catalogs_
Definition: quota_posix.h:368
static PosixQuotaManager * CreateShared(const std::string &exe_path, const std::string &cache_workspace, const uint64_t limit, const uint64_t cleanup_threshold, bool foreground)
Definition: quota_posix.cc:264
const unsigned kMaxDigestSize
Definition: hash.h:72
void SetCacheMgrPid(pid_t pid_)
Definition: quota_posix.h:89
virtual ~PosixQuotaManager()
const int mask
Definition: logging.h:23
static void ParseDirectories(const std::string cache_workspace, std::string *cache_dir, std::string *workspace_dir)
std::map< shash::Any, uint64_t > pinned_chunks_
Definition: quota_posix.h:320
sqlite3_stmt * stmt_unpin_
Definition: quota_posix.h:358
void CloseReturnPipe(int pipe[2])
Definition: quota_posix.cc:181
EvictCandidate(const shash::Any &h, uint64_t s, uint64_t a)
Definition: quota_posix.h:189
virtual void Spawn()
static void size_t size
Definition: smalloc.h:54
void UnbindReturnPipe(int pipe_wronly)
virtual void Touch(const shash::Any &hash)
void StoreHash(const shash::Any &hash)
Definition: quota_posix.h:166
static const uint64_t kVolatileFlag
Definition: quota_posix.h:231
sqlite3_stmt * stmt_size_
Definition: quota_posix.h:363