GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/cache_tiered.h
Date: 2024-04-28 02:33:07
Exec Total Coverage
Lines: 10 18 55.6%
Branches: 0 0 -%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 *
4 * This provides a framework for a cache with an upper and a lower branch.
5 */
6
7 #ifndef CVMFS_CACHE_TIERED_H_
8 #define CVMFS_CACHE_TIERED_H_
9
10 #include <string>
11
12 #include "cache.h"
13 #include "gtest/gtest_prod.h"
14
15 /**
16 * Cache manager implementation that provides a hierarchical cache.
17 * Given an "upper" and "lower" cache manager object:
18 * - Reads are done first from the upper cache
19 * - On upper cache miss, then this tries the lower cache.
20 * If there's a lower cache hit, then the file is written
21 * to the upper cache.
22 * - Writes are done to both caches simultaneously.
23 *
24 * The quota manager is only applied to the upper cache.
25 */
26 class TieredCacheManager : public CacheManager {
27 FRIEND_TEST(T_MountPoint, TieredCacheMgr);
28 FRIEND_TEST(T_MountPoint, TieredComplex);
29
30 public:
31 3 virtual CacheManagerIds id() { return kTieredCacheManager; }
32 virtual std::string Describe();
33
34 static CacheManager *Create(CacheManager *upper_cache,
35 CacheManager *lower_cache);
36 1 void SetLowerReadOnly() { lower_readonly_ = true; }
37
38 virtual ~TieredCacheManager();
39 virtual bool AcquireQuotaManager(QuotaManager *quota_mgr) {
40 bool result = upper_->AcquireQuotaManager(quota_mgr);
41 quota_mgr_ = upper_->quota_mgr();
42 return result;
43 }
44
45 virtual int Open(const LabeledObject &object);
46 2 virtual int64_t GetSize(int fd) {return upper_->GetSize(fd);}
47 2 virtual int Close(int fd) {return upper_->Close(fd);}
48 2 virtual int64_t Pread(int fd, void *buf, uint64_t size, uint64_t offset)
49 2 { return upper_->Pread(fd, buf, size, offset); }
50 virtual int Dup(int fd) { return upper_->Dup(fd); }
51 virtual int Readahead(int fd) { return upper_->Readahead(fd); }
52
53 3 virtual uint32_t SizeOfTxn()
54 3 { return upper_->SizeOfTxn() + lower_->SizeOfTxn(); }
55 virtual int StartTxn(const shash::Any &id, uint64_t size, void *txn);
56 virtual void CtrlTxn(const Label &label, const int flags, void *txn);
57 virtual int64_t Write(const void *buf, uint64_t size, void *txn);
58 virtual int Reset(void *txn);
59 virtual int OpenFromTxn(void *txn) { return upper_->OpenFromTxn(txn); }
60 virtual int AbortTxn(void *txn);
61 virtual int CommitTxn(void *txn);
62 virtual void Spawn();
63
64 virtual manifest::Breadcrumb LoadBreadcrumb(const std::string &fqrn);
65 virtual bool StoreBreadcrumb(const manifest::Manifest &manifest);
66
67 protected:
68 virtual void *DoSaveState();
69 virtual int DoRestoreState(void *data);
70 virtual bool DoFreeState(void *data);
71
72 private:
73 static const unsigned kCopyBufferSize = 64 * 1024; // 64kB
74
75 struct SavedState {
76 SavedState() : state_upper(NULL), state_lower(NULL) { }
77 void *state_upper;
78 void *state_lower;
79 };
80
81 // NOTE: TieredCacheManager takes ownership of both caches passed.
82 9 TieredCacheManager(CacheManager *upper_cache,
83 CacheManager *lower_cache)
84 9 : upper_(upper_cache), lower_(lower_cache), lower_readonly_(false) { }
85
86 CacheManager *upper_;
87 CacheManager *lower_;
88 bool lower_readonly_;
89 }; // class TieredCacheManager
90
91 #endif // CVMFS_CACHE_TIERED_H_
92