forked from cvmfs/cvmfs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
magic_xattr.h
371 lines (295 loc) · 9.56 KB
/
magic_xattr.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
/**
* This file is part of the CernVM File System.
*/
#ifndef CVMFS_MAGIC_XATTR_H_
#define CVMFS_MAGIC_XATTR_H_
#include <map>
#include <string>
#include "backoff.h"
#include "catalog_counters.h"
#include "directory_entry.h"
#include "shortstring.h"
#include "util/exception.h"
#include "util/string.h"
class MountPoint;
enum MagicXattrFlavor {
kXattrBase = 0,
kXattrWithHash,
kXattrRegular,
kXattrSymlink,
kXattrAuthz
};
/**
* This is a base class for magic extended attribute. Concrete extended
* attributes inherit from this class. It should be generally used only
* in cooperation with MagicXattrManager.
* It contains an access mutex. Users should use Lock() and Release()
* before and after usage (Lock() is called implicitly in MagicXattrManager).
*
* To read out the attribute value, do:
* 0. Get an instance through MagicXattrManager::Get()
* 1. Call PrepareValueFenced() inside FuseRemounter::fence()
* 2. Call GetValue() to get the actual value (can be called outside the fence)
*/
class BaseMagicXattr {
friend class MagicXattrManager;
public:
BaseMagicXattr() {
int retval = pthread_mutex_init(&access_mutex_, NULL);
assert(retval == 0);
}
/**
* This function is used to obtain the necessary information while
* inside FuseRemounter::fence(), which should prevent data races.
*/
virtual bool PrepareValueFenced() { return true; }
/**
* This function needs to be called after PrepareValueFenced(),
* which prepares the necessary data.
* It does the computationaly intensive part, which should not
* be done inside the FuseRemounter::fence(), and returns the
* value.
*/
virtual std::string GetValue() = 0;
virtual MagicXattrFlavor GetXattrFlavor() { return kXattrBase; }
void Lock(PathString path, catalog::DirectoryEntry *dirent) {
int retval = pthread_mutex_lock(&access_mutex_);
assert(retval == 0);
path_ = path;
dirent_ = dirent;
}
void Release() {
int retval = pthread_mutex_unlock(&access_mutex_);
assert(retval == 0);
}
virtual ~BaseMagicXattr() {}
protected:
MountPoint *mount_point_;
PathString path_;
catalog::DirectoryEntry *dirent_;
pthread_mutex_t access_mutex_;
};
/**
* This wrapper ensures that the attribute instance "ptr_" is
* released after the user finishes using it (on wrapper destruction).
*/
class MagicXattrRAIIWrapper: public SingleCopy {
public:
inline MagicXattrRAIIWrapper() : ptr_(NULL) { }
inline explicit MagicXattrRAIIWrapper(
BaseMagicXattr *ptr,
PathString path,
catalog::DirectoryEntry *d)
: ptr_(ptr)
{
if (ptr_ != NULL) ptr_->Lock(path, d);
}
/// Wraps around a BaseMagicXattr* tha is already locked (or NULL)
inline explicit MagicXattrRAIIWrapper(BaseMagicXattr *ptr) : ptr_(ptr) { }
inline ~MagicXattrRAIIWrapper() { if (ptr_ != NULL) ptr_->Release(); }
inline BaseMagicXattr* operator->() const { return ptr_; }
inline bool IsNull() const { return ptr_ == NULL; }
inline BaseMagicXattr* Move() {
BaseMagicXattr* ret = ptr_;
ptr_ = NULL;
return ret;
}
protected:
BaseMagicXattr *ptr_;
};
class WithHashMagicXattr : public BaseMagicXattr {
virtual MagicXattrFlavor GetXattrFlavor() { return kXattrWithHash; }
};
class RegularMagicXattr : public BaseMagicXattr {
virtual MagicXattrFlavor GetXattrFlavor() { return kXattrRegular; }
};
class SymlinkMagicXattr : public BaseMagicXattr {
virtual MagicXattrFlavor GetXattrFlavor() { return kXattrSymlink; }
};
/**
* This class is acting as a user entry point for magic extended attributes.
* It instantiates all defined attributes in the constructor.
* Users can:
* 1. Register additional attributes
* 2. Get a string containing zero-byte delimited list of attribute names
* (used in "cvmfs.cc")
* 3. Get an attribute by name. Specifically, get a RAII wrapper around
* a singleton attribute instance. This means that the attribute instance
* registered with the manager does not get cloned or copied inside Get().
* Instead, member variables are set and the original instance is returned.
* A mutex prevents from race conditions in case of concurrent access.
*/
class MagicXattrManager : public SingleCopy {
public:
enum EVisibility { kVisibilityAlways, kVisibilityNever, kVisibilityRootOnly };
MagicXattrManager(MountPoint *mountpoint, EVisibility visibility);
/// The returned BaseMagicXattr* is supposed to be wrapped by a
/// MagicXattrRAIIWrapper
BaseMagicXattr* GetLocked(const std::string &name, PathString path,
catalog::DirectoryEntry *d);
std::string GetListString(catalog::DirectoryEntry *dirent);
void Register(const std::string &name, BaseMagicXattr *magic_xattr);
EVisibility visibility() { return visibility_; }
protected:
std::map<std::string, BaseMagicXattr *> xattr_list_;
MountPoint *mount_point_;
EVisibility visibility_;
};
class AuthzMagicXattr : public BaseMagicXattr {
virtual bool PrepareValueFenced();
virtual std::string GetValue();
virtual MagicXattrFlavor GetXattrFlavor();
};
class CatalogCountersMagicXattr : public BaseMagicXattr {
std::string subcatalog_path_;
shash::Any hash_;
catalog::Counters counters_;
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class ChunkListMagicXattr : public RegularMagicXattr {
std::string chunk_list_;
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class ChunksMagicXattr : public RegularMagicXattr {
uint64_t n_chunks_;
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class CompressionMagicXattr : public RegularMagicXattr {
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class DirectIoMagicXattr : public RegularMagicXattr {
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class ExternalFileMagicXattr : public RegularMagicXattr {
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class ExternalHostMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class ExternalTimeoutMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class FqrnMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class HashMagicXattr : public WithHashMagicXattr {
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class HostMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class HostListMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class LHashMagicXattr : public WithHashMagicXattr {
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class LogBufferXattr : public BaseMagicXattr {
public:
LogBufferXattr();
private:
// Generating the log buffer report involves 64 string copies. To mitigate
// memory fragmentation and performance loss, throttle the use of this
// attribute a little.
BackoffThrottle throttle_;
virtual std::string GetValue();
};
class NCleanup24MagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class NClgMagicXattr : public BaseMagicXattr {
int n_catalogs_;
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class NDirOpenMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class NDownloadMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class NIOErrMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class NOpenMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class HitrateMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class ProxyMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class PubkeysMagicXattr : public BaseMagicXattr {
std::string pubkeys_;
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class RawlinkMagicXattr : public SymlinkMagicXattr {
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class RepoCountersMagicXattr : public BaseMagicXattr {
catalog::Counters counters_;
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class RepoMetainfoMagicXattr : public BaseMagicXattr {
static uint64_t kMaxMetainfoLength;
shash::Any metainfo_hash_;
std::string error_reason_;
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class RevisionMagicXattr : public BaseMagicXattr {
uint64_t revision_;
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class RootHashMagicXattr : public BaseMagicXattr {
shash::Any root_hash_;
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class RxMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class SpeedMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class TagMagicXattr : public BaseMagicXattr {
std::string tag_;
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
class TimeoutMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class TimeoutDirectMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class TimestampLastIOErrMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class UsedFdMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class UsedDirPMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class VersionMagicXattr : public BaseMagicXattr {
virtual std::string GetValue();
};
class ExternalURLMagicXattr : public BaseMagicXattr {
virtual bool PrepareValueFenced();
virtual std::string GetValue();
};
#endif // CVMFS_MAGIC_XATTR_H_