GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/quota.h
Date: 2024-04-28 02:33:07
Exec Total Coverage
Lines: 16 39 41.0%
Branches: 2 4 50.0%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #ifndef CVMFS_QUOTA_H_
6 #define CVMFS_QUOTA_H_
7
8 #include <pthread.h>
9 #include <stdint.h>
10 #include <unistd.h>
11
12 #include <map>
13 #include <string>
14 #include <vector>
15
16 #include "crypto/hash.h"
17 #include "util/single_copy.h"
18
19 /**
20 * The QuotaManager keeps track of the cache contents. It is informed by the
21 * cache manager about opens and inserts. The cache manager picks a quota
22 * manager that fits to the backend storage (e.g. POSIX, key-value store). File
23 * catalogs are "pinned" in the quota manager. Since they remain loaded
24 * (virtual file descriptor stays open), it does not make sense to remove them.
25 * Regular files might get pinned occasionally as well, for instance for the
26 * CernVM "core files".
27 *
28 * Multiple cache managers can share a single quota manager instance, as it is
29 * done for the local shared hard disk cache.
30 *
31 * Sometimes it is necessary that a quota manager instance gives feedback to its
32 * users. This is where back channels are used. Users can register a back
33 * channel, which gets informed for instance if the number of pinned catalogs
34 * get large and should be released.
35 */
36 class QuotaManager : SingleCopy {
37 public:
38 /**
39 * Quota manager protocol revision.
40 * Revision 1:
41 * - backchannel command 'R': release pinned files if possible
42 * Revision 2:
43 * - add kCleanupRate command
44 */
45 static const uint32_t kProtocolRevision;
46
47 enum Capabilities {
48 kCapIntrospectSize = 0,
49 kCapIntrospectCleanupRate,
50 kCapList,
51 kCapShrink,
52 kCapListeners,
53 };
54
55 QuotaManager();
56 virtual ~QuotaManager();
57 virtual bool HasCapability(Capabilities capability) = 0;
58
59 virtual void Insert(const shash::Any &hash, const uint64_t size,
60 const std::string &description) = 0;
61 virtual void InsertVolatile(const shash::Any &hash, const uint64_t size,
62 const std::string &description) = 0;
63 virtual bool Pin(const shash::Any &hash, const uint64_t size,
64 const std::string &description, const bool is_catalog) = 0;
65 virtual void Unpin(const shash::Any &hash) = 0;
66 virtual void Touch(const shash::Any &hash) = 0;
67 virtual void Remove(const shash::Any &file) = 0;
68 virtual bool Cleanup(const uint64_t leave_size) = 0;
69
70 virtual std::vector<std::string> List() = 0;
71 virtual std::vector<std::string> ListPinned() = 0;
72 virtual std::vector<std::string> ListCatalogs() = 0;
73 virtual std::vector<std::string> ListVolatile() = 0;
74 virtual uint64_t GetMaxFileSize() = 0;
75 virtual uint64_t GetCapacity() = 0;
76 virtual uint64_t GetSize() = 0;
77 virtual uint64_t GetSizePinned() = 0;
78 virtual uint64_t GetCleanupRate(uint64_t period_s) = 0;
79
80 virtual void Spawn() = 0;
81 virtual pid_t GetPid() = 0;
82 virtual uint32_t GetProtocolRevision() = 0;
83
84 virtual void RegisterBackChannel(int back_channel[2],
85 const std::string &channel_id) = 0;
86 virtual void UnregisterBackChannel(int back_channel[2],
87 const std::string &channel_id) = 0;
88 void BroadcastBackchannels(const std::string &message);
89
90 protected:
91 /**
92 * Hashes over the channel identifier mapped to writing ends of pipes.
93 */
94 std::map<shash::Md5, int> back_channels_;
95 pthread_mutex_t *lock_back_channels_;
96 8 void LockBackChannels() {
97 8 int retval = pthread_mutex_lock(lock_back_channels_);
98
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 assert(retval == 0);
99 8 }
100 8 void UnlockBackChannels() {
101 8 int retval = pthread_mutex_unlock(lock_back_channels_);
102
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 assert(retval == 0);
103 8 }
104
105 /**
106 * Protocol of the running cache manager instance. Needs to be figured out
107 * and set during initialization of concrete instances.
108 */
109 uint32_t protocol_revision_;
110 };
111
112
113 /**
114 * No quota management.
115 */
116 class NoopQuotaManager : public QuotaManager {
117 public:
118 860 virtual ~NoopQuotaManager() { }
119 virtual bool HasCapability(Capabilities capability) { return false; }
120
121 95 virtual void Insert(const shash::Any &hash, const uint64_t size,
122 95 const std::string &description) { }
123 virtual void InsertVolatile(const shash::Any &hash, const uint64_t size,
124 const std::string &description) { }
125 19 virtual bool Pin(const shash::Any &hash, const uint64_t size,
126 const std::string &description, const bool is_catalog)
127 {
128 19 return true;
129 }
130 13 virtual void Unpin(const shash::Any &hash) { }
131 29 virtual void Touch(const shash::Any &hash) { }
132 virtual void Remove(const shash::Any &file) { }
133 virtual bool Cleanup(const uint64_t leave_size) { return false; }
134
135 virtual void RegisterBackChannel(int back_channel[2],
136 const std::string &channel_id) { }
137 virtual void UnregisterBackChannel(int back_channel[2],
138 const std::string &channel_id) { }
139
140 virtual std::vector<std::string> List() { return std::vector<std::string>(); }
141 virtual std::vector<std::string> ListPinned() {
142 return std::vector<std::string>();
143 }
144 virtual std::vector<std::string> ListCatalogs() {
145 return std::vector<std::string>();
146 }
147 virtual std::vector<std::string> ListVolatile() {
148 return std::vector<std::string>();
149 }
150 108 virtual uint64_t GetMaxFileSize() { return uint64_t(-1); }
151 virtual uint64_t GetCapacity() { return uint64_t(-1); }
152 virtual uint64_t GetSize() { return 0; }
153 virtual uint64_t GetSizePinned() { return 0; }
154 virtual uint64_t GetCleanupRate(uint64_t period_s) { return 0; }
155
156 virtual void Spawn() { }
157 virtual pid_t GetPid() { return getpid(); }
158 virtual uint32_t GetProtocolRevision() { return 0; }
159 };
160
161 #endif // CVMFS_QUOTA_H_
162