GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/mountpoint.h
Date: 2026-07-12 02:35:48
Exec Total Coverage
Lines: 54 130 41.5%
Branches: 1 2 50.0%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 *
4 * Steers the booting of CernVM-FS repositories.
5 */
6
7 #ifndef CVMFS_MOUNTPOINT_H_
8 #define CVMFS_MOUNTPOINT_H_
9
10 #include <pthread.h>
11 #include <sys/statvfs.h>
12 #include <unistd.h>
13
14 #include <ctime>
15 #include <set>
16 #include <string>
17 #include <vector>
18
19 #include "cache.h"
20 #include "crypto/hash.h"
21 #include "path_filters/inclusion_spec.h"
22 #include "duplex_testing.h"
23 #include "file_watcher.h"
24 #include "loader.h"
25 #include "magic_xattr.h"
26 #include "util/algorithm.h"
27
28 class AuthzAttachment;
29 class AuthzFetcher;
30 class AuthzSessionManager;
31 class BackoffThrottle;
32 class CacheManager;
33 namespace catalog {
34 class ClientCatalogManager;
35 class InodeAnnotation;
36 } // namespace catalog
37 struct ChunkTables;
38 namespace cvmfs {
39 class Fetcher;
40 class Uuid;
41 } // namespace cvmfs
42 namespace download {
43 class DownloadManager;
44 }
45 namespace glue {
46 class InodeTracker;
47 class DentryTracker;
48 class PageCacheTracker;
49 } // namespace glue
50 namespace lru {
51 class InodeCache;
52 class Md5PathCache;
53 class PathCache;
54 } // namespace lru
55 class NfsMaps;
56 class OptionsManager;
57 namespace perf {
58 class Counter;
59 class Statistics;
60 class TelemetryAggregator;
61 } // namespace perf
62 namespace signature {
63 class SignatureManager;
64 }
65 class SimpleChunkTables;
66 class Tracer;
67
68
69 /**
70 * Construction of FileSystem and MountPoint can go wrong. In this case, we'd
71 * like to know why. This is a base class for both FileSystem and MountPoint.
72 */
73 class BootFactory {
74 public:
75 4637 BootFactory() : boot_status_(loader::kFailUnknown) { }
76 283 bool IsValid() { return boot_status_ == loader::kFailOk; }
77 3863 loader::Failures boot_status() { return boot_status_; }
78 93 std::string boot_error() { return boot_error_; }
79
80 /**
81 * Used in the fuse module to artificially set boot errors that are specific
82 * to the fuse boot procedure.
83 */
84 void set_boot_status(loader::Failures code) { boot_status_ = code; }
85
86 protected:
87 loader::Failures boot_status_;
88 std::string boot_error_;
89 };
90
91
92 /**
93 * The FileSystem object initializes cvmfs' global state. It sets up sqlite and
94 * the cache directory and it can contain multiple mount points. It currently
95 * does so only for libcvmfs; the cvmfs fuse module has exactly one FileSystem
96 * object and one MountPoint object.
97 */
98 class FileSystem : SingleCopy, public BootFactory {
99 FRIEND_TEST(T_MountPoint, MkCacheParm);
100 FRIEND_TEST(T_MountPoint, CacheSettings);
101 FRIEND_TEST(T_MountPoint, CheckInstanceName);
102 FRIEND_TEST(T_MountPoint, CheckPosixCacheSettings);
103 FRIEND_TEST(T_Cvmfs, Basics);
104
105 public:
106 enum Type {
107 kFsFuse = 0,
108 kFsLibrary
109 };
110
111 struct FileSystemInfo {
112 1868 FileSystemInfo()
113 3736 : type(kFsFuse)
114 1868 , options_mgr(NULL)
115 1868 , wait_workspace(false)
116 1868 , foreground(false) { }
117 /**
118 * Name can is used to identify this particular instance of cvmfs in the
119 * cache (directory). Normally it is the fully qualified repository name.
120 * For libcvmfs and in other special mount conditions, it can be something
121 * else. Only file systems with different names can share a cache because
122 * the name is part of a lock file.
123 */
124 std::string name;
125
126 /**
127 * Used to fork & execve into different flavors of the binary, e.g. the
128 * quota manager.
129 */
130 std::string exe_path;
131
132 /**
133 * Fuse mount point or libcvmfs.
134 */
135 Type type;
136
137 /**
138 * All further configuration has to be present in the options manager.
139 */
140 OptionsManager *options_mgr;
141
142 /**
143 * Decides if FileSystem construction should block if the workspace is
144 * currently taken. This is used to coordinate fuse mounts where the next
145 * mount happens while the previous fuse module is not yet fully cleaned
146 * up.
147 */
148 bool wait_workspace;
149 /**
150 * The fuse module should not daemonize. That means the quota manager
151 * should not daemonize, too, but print debug messages to stdout.
152 */
153 bool foreground;
154 };
155
156 /**
157 * Keeps information about I/O errors, e.g. writing local files, permanent
158 * network errors, etc. It counts the number of errors and the timestamp
159 * of the latest errors for consumption by monitoring tools such as Nagios
160 */
161 class IoErrorInfo {
162 public:
163 IoErrorInfo();
164
165 void Reset();
166 void AddIoError();
167 void SetCounter(perf::Counter *c);
168 int64_t count();
169 time_t timestamp_last();
170
171 private:
172 perf::Counter *counter_;
173 time_t timestamp_last_;
174 };
175
176 /**
177 * No NFS maps.
178 */
179 static const unsigned kNfsNone = 0x00;
180 /**
181 * Normal NFS maps by leveldb
182 */
183 static const unsigned kNfsMaps = 0x01;
184 /**
185 * NFS maps maintained by sqlite so that they can reside on an NFS mount
186 */
187 static const unsigned kNfsMapsHa = 0x02;
188
189 static FileSystem *Create(const FileSystemInfo &fs_info);
190 ~FileSystem();
191
192 // Used to setup logging before the file system object is created
193 static void SetupLoggingStandalone(const OptionsManager &options_mgr,
194 const std::string &prefix);
195
196 2089 bool IsNfsSource() { return nfs_mode_ & kNfsMaps; }
197 46 bool IsHaNfsSource() { return nfs_mode_ & kNfsMapsHa; }
198 void ResetErrorCounters();
199 void TearDown2ReadOnly();
200 void RemapCatalogFd(int from, int to);
201
202 // Used in cvmfs' RestoreState to prevent change of cache manager type
203 // during reload
204 void ReplaceCacheManager(CacheManager *new_cache_mgr);
205
206 4565 CacheManager *cache_mgr() { return cache_mgr_; }
207 276 std::string cache_mgr_instance() { return cache_mgr_instance_; }
208 std::string exe_path() { return exe_path_; }
209 92 bool found_previous_crash() { return found_previous_crash_; }
210 Log2Histogram *hist_fs_lookup() { return hist_fs_lookup_; }
211 Log2Histogram *hist_fs_forget() { return hist_fs_forget_; }
212 Log2Histogram *hist_fs_forget_multi() { return hist_fs_forget_multi_; }
213 Log2Histogram *hist_fs_getattr() { return hist_fs_getattr_; }
214 Log2Histogram *hist_fs_readlink() { return hist_fs_readlink_; }
215 Log2Histogram *hist_fs_opendir() { return hist_fs_opendir_; }
216 Log2Histogram *hist_fs_releasedir() { return hist_fs_releasedir_; }
217 Log2Histogram *hist_fs_readdir() { return hist_fs_readdir_; }
218 Log2Histogram *hist_fs_open() { return hist_fs_open_; }
219 Log2Histogram *hist_fs_read() { return hist_fs_read_; }
220 Log2Histogram *hist_fs_release() { return hist_fs_release_; }
221
222 perf::Counter *n_fs_dir_open() { return n_fs_dir_open_; }
223 perf::Counter *n_fs_forget() { return n_fs_forget_; }
224 perf::Counter *n_fs_inode_replace() { return n_fs_inode_replace_; }
225 perf::Counter *n_fs_lookup() { return n_fs_lookup_; }
226 perf::Counter *n_fs_lookup_negative() { return n_fs_lookup_negative_; }
227 perf::Counter *n_fs_open() { return n_fs_open_; }
228 perf::Counter *n_fs_read() { return n_fs_read_; }
229 perf::Counter *n_fs_readlink() { return n_fs_readlink_; }
230 744 perf::Counter *n_fs_stat() { return n_fs_stat_; }
231 perf::Counter *n_fs_stat_stale() { return n_fs_stat_stale_; }
232 perf::Counter *n_fs_statfs() { return n_fs_statfs_; }
233 perf::Counter *n_fs_statfs_cached() { return n_fs_statfs_cached_; }
234 IoErrorInfo *io_error_info() { return &io_error_info_; }
235 1617 std::string name() { return name_; }
236 NfsMaps *nfs_maps() { return nfs_maps_; }
237 perf::Counter *no_open_dirs() { return no_open_dirs_; }
238 perf::Counter *no_open_files() { return no_open_files_; }
239 perf::Counter *n_eio_total() { return n_eio_total_; }
240 perf::Counter *n_eio_01() { return n_eio_01_; }
241 perf::Counter *n_eio_02() { return n_eio_02_; }
242 perf::Counter *n_eio_03() { return n_eio_03_; }
243 perf::Counter *n_eio_04() { return n_eio_04_; }
244 perf::Counter *n_eio_05() { return n_eio_05_; }
245 perf::Counter *n_eio_06() { return n_eio_06_; }
246 perf::Counter *n_eio_07() { return n_eio_07_; }
247 perf::Counter *n_eio_08() { return n_eio_08_; }
248 perf::Counter *n_emfile() { return n_emfile_; }
249 4250 OptionsManager *options_mgr() { return options_mgr_; }
250 1663 perf::Statistics *statistics() { return statistics_; }
251 3893 Type type() { return type_; }
252 1709 cvmfs::Uuid *uuid_cache() { return uuid_cache_; }
253 3206 std::string workspace() { return workspace_; }
254
255 protected:
256 void SetHasCustomVfs(bool setting) { has_custom_sqlitevfs_ = setting; }
257
258 private:
259 /**
260 * Only one instance may be alive at any given time
261 */
262 static bool g_alive;
263 static const char *kDefaultCacheBase; // /var/lib/cvmfs
264 static const unsigned kDefaultQuotaLimit = 1024 * 1024 * 1024; // 1GB
265 static const unsigned kDefaultNfiles = 8192; // if CVMFS_NFILES is unset
266 static const char *kDefaultCacheMgrInstance; // "default"
267
268 struct PosixCacheSettings {
269 2574 PosixCacheSettings()
270 2574 : is_shared(false)
271 2574 , is_alien(false)
272 2574 , is_managed(false)
273 2574 , avoid_rename(false)
274 2574 , cache_base_defined(false)
275 2574 , cache_dir_defined(false)
276 2574 , quota_limit(0)
277 2574 , do_refcount(true)
278 2574 , cleanup_unused_first(false) { }
279 bool is_shared;
280 bool is_alien;
281 bool is_managed;
282 bool avoid_rename;
283 bool cache_base_defined;
284 bool cache_dir_defined;
285 /**
286 * Soft limit in bytes for the cache. The quota manager removes half the
287 * cache when the limit is exceeded.
288 */
289 int64_t quota_limit;
290 bool do_refcount;
291 bool cleanup_unused_first;
292 std::string cache_path;
293 /**
294 * Different from cache_path only if CVMFS_WORKSPACE or
295 * CVMFS_CACHE_WORKSPACE is set.
296 */
297 std::string workspace;
298 };
299
300 static void LogSqliteError(void *user_data __attribute__((unused)),
301 int sqlite_extended_error,
302 const char *message);
303
304 explicit FileSystem(const FileSystemInfo &fs_info);
305
306 void SetupLogging();
307 void CreateStatistics();
308 void SetupSqlite();
309 bool DetermineNfsMode();
310 bool SetupWorkspace();
311 bool SetupCwd();
312 bool LockWorkspace();
313 bool SetupCrashGuard();
314 bool SetupNfsMaps();
315 void SetupUuid();
316
317 std::string MkCacheParm(const std::string &generic_parameter,
318 const std::string &instance);
319 bool CheckInstanceName(const std::string &instance);
320 bool TriageCacheMgr();
321 CacheManager *SetupCacheMgr(const std::string &instance);
322 CacheManager *SetupPosixCacheMgr(const std::string &instance);
323 CacheManager *SetupRamCacheMgr(const std::string &instance);
324 CacheManager *SetupTieredCacheMgr(const std::string &instance);
325 CacheManager *SetupExternalCacheMgr(const std::string &instance);
326 PosixCacheSettings DeterminePosixCacheSettings(const std::string &instance);
327 bool CheckPosixCacheSettings(const PosixCacheSettings &settings);
328 bool SetupPosixQuotaMgr(const PosixCacheSettings &settings,
329 CacheManager *cache_mgr);
330
331 // See FileSystemInfo for the following fields
332 std::string name_;
333 std::string exe_path_;
334 Type type_;
335 /**
336 * Not owned by the FileSystem object
337 */
338 OptionsManager *options_mgr_;
339 bool wait_workspace_;
340 bool foreground_;
341
342 perf::Counter *n_fs_open_;
343 perf::Counter *n_fs_dir_open_;
344 perf::Counter *n_fs_lookup_;
345 perf::Counter *n_fs_lookup_negative_;
346 perf::Counter *n_fs_stat_;
347 perf::Counter *n_fs_stat_stale_;
348 perf::Counter *n_fs_statfs_;
349 perf::Counter *n_fs_statfs_cached_;
350 perf::Counter *n_fs_read_;
351 perf::Counter *n_fs_readlink_;
352 perf::Counter *n_fs_forget_;
353 perf::Counter *n_fs_inode_replace_;
354 perf::Counter *no_open_files_;
355 perf::Counter *no_open_dirs_;
356 perf::Counter *n_eio_total_;
357 perf::Counter *n_eio_01_;
358 perf::Counter *n_eio_02_;
359 perf::Counter *n_eio_03_;
360 perf::Counter *n_eio_04_;
361 perf::Counter *n_eio_05_;
362 perf::Counter *n_eio_06_;
363 perf::Counter *n_eio_07_;
364 perf::Counter *n_eio_08_;
365 perf::Counter *n_emfile_;
366 IoErrorInfo io_error_info_;
367 perf::Statistics *statistics_;
368
369 Log2Histogram *hist_fs_lookup_;
370 Log2Histogram *hist_fs_forget_;
371 Log2Histogram *hist_fs_forget_multi_;
372 Log2Histogram *hist_fs_getattr_;
373 Log2Histogram *hist_fs_readlink_;
374 Log2Histogram *hist_fs_opendir_;
375 Log2Histogram *hist_fs_releasedir_;
376 Log2Histogram *hist_fs_readdir_;
377 Log2Histogram *hist_fs_open_;
378 Log2Histogram *hist_fs_read_;
379 Log2Histogram *hist_fs_release_;
380
381 /**
382 * A writeable local directory. Only small amounts of data (few bytes) will
383 * be stored here. Needed because the cache can be read-only. The workspace
384 * and the cache directory can be identical. A workspace can be shared among
385 * FileSystem instances if their name is different.
386 */
387 std::string workspace_;
388 /**
389 * During setup, the fuse module changes its working directory to workspace.
390 * Afterwards, workspace_ is ".". Store the original one in
391 * workspace_fullpath_
392 */
393 std::string workspace_fullpath_;
394 int fd_workspace_lock_;
395 std::string path_workspace_lock_;
396
397 /**
398 * An empty file that is removed on proper shutdown.
399 */
400 std::string path_crash_guard_;
401
402 /**
403 * A crash guard was found, thus we assume the file system was not shutdown
404 * properly last time.
405 */
406 bool found_previous_crash_;
407
408 /**
409 * Only needed for fuse to detect and prevent double mounting at the same
410 * location.
411 */
412 std::string mountpoint_;
413 /**
414 * The user-provided name of the parimay cache manager or 'default' if none
415 * is specified.
416 */
417 std::string cache_mgr_instance_;
418 /**
419 * Keep track of all the cache instances to detect circular definitions with
420 * the tiered cache.
421 */
422 std::set<std::string> constructed_instances_;
423 std::string nfs_maps_dir_;
424 /**
425 * Combination of kNfs... flags
426 */
427 unsigned nfs_mode_;
428 CacheManager *cache_mgr_;
429 /**
430 * Persistent for the cache directory + name combination. It is used in the
431 * Geo-API to allow for per-client responses when no proxy is used.
432 */
433 cvmfs::Uuid *uuid_cache_;
434
435 /**
436 * TODO(jblomer): Move to MountPoint. Tricky because of the sqlite maps
437 * and the sqlite configuration done for the file catalogs.
438 */
439 NfsMaps *nfs_maps_;
440 /**
441 * Used internally to remember if the Sqlite memory manager need to be shut
442 * down.
443 */
444 bool has_custom_sqlitevfs_;
445 };
446
447 /**
448 * The StatfsCache class is a class purely designed as "struct" (= holding
449 * object for all its parameters).
450 * All its logic, including the locking mechanism, is implemented in the
451 * function cvmfs_statfs in cvmfs.cc
452 */
453 class StatfsCache : SingleCopy {
454 public:
455 923 explicit StatfsCache(uint64_t cacheValid)
456 923 : expiry_deadline_(0), cache_timeout_(cacheValid) {
457 923 memset(&info_, 0, sizeof(info_));
458 923 lock_ = reinterpret_cast<pthread_mutex_t *>(
459 923 smalloc(sizeof(pthread_mutex_t)));
460 923 const int retval = pthread_mutex_init(lock_, NULL);
461
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 923 times.
923 assert(retval == 0);
462 923 }
463 923 ~StatfsCache() {
464 923 pthread_mutex_destroy(lock_);
465 923 free(lock_);
466 923 }
467 uint64_t *expiry_deadline() { return &expiry_deadline_; }
468 const uint64_t cache_timeout() { return cache_timeout_; }
469 struct statvfs *info() { return &info_; }
470 pthread_mutex_t *lock() { return lock_; }
471
472 private:
473 pthread_mutex_t *lock_;
474 // Timestamp/deadline when the currently cached statvfs info_ becomes invalid
475 uint64_t expiry_deadline_;
476 // Time in seconds how long statvfs info_ should be cached
477 uint64_t cache_timeout_;
478 struct statvfs info_;
479 };
480
481 /**
482 * A MountPoint provides a clip around all the different *Manager objects that
483 * in combination represent a mounted cvmfs repository. Its main purpose is
484 * the controlled construction and deconstruction of the involved ensemble of
485 * classes based on the information passed from an options manager.
486 *
487 * A MountPoint is constructed on top of a successfully constructed FileSystem.
488 *
489 * We use pointers to manager classes to make the order of construction and
490 * destruction explicit and also to keep the include list for this header small.
491 */
492 class MountPoint : SingleCopy, public BootFactory {
493 friend class T_BundleMgr;
494
495 public:
496 /**
497 * If catalog reload fails, try again in 3 minutes
498 */
499 static const unsigned kShortTermTTL = 180;
500 static const time_t kIndefiniteDeadline = time_t(-1);
501
502 static MountPoint *Create(const std::string &fqrn,
503 FileSystem *file_system,
504 OptionsManager *options_mgr = NULL);
505 ~MountPoint();
506
507 // Check whether permission is needed to read from user process environment
508 static bool NeedsReadEnviron(OptionsManager *omgr);
509
510 unsigned GetMaxTtlMn();
511 unsigned GetEffectiveTtlSec();
512 void SetMaxTtlMn(unsigned value_minutes);
513 void SetMaxTtlSec(unsigned value_secs);
514 void ReEvaluateAuthz();
515
516 AuthzSessionManager *authz_session_mgr() { return authz_session_mgr_; }
517 BackoffThrottle *backoff_throttle() { return backoff_throttle_; }
518 2183 catalog::ClientCatalogManager *catalog_mgr() { return catalog_mgr_; }
519 ChunkTables *chunk_tables() { return chunk_tables_; }
520 230 download::DownloadManager *download_mgr() { return download_mgr_; }
521 184 download::DownloadManager *external_download_mgr() {
522 184 return external_download_mgr_;
523 }
524 download::DownloadManager *full_replica_download_mgr() {
525 return full_replica_download_mgr_;
526 }
527 file_watcher::FileWatcher *resolv_conf_watcher() {
528 return resolv_conf_watcher_;
529 }
530 1739 cvmfs::Fetcher *fetcher() { return fetcher_; }
531 bool fixed_catalog() { return fixed_catalog_; }
532 1491 std::string fqrn() const { return fqrn_; }
533 // TODO(jblomer): use only a singler fetcher object
534 cvmfs::Fetcher *external_fetcher() { return external_fetcher_; }
535 AuthzFetcher *authz_fetcher() { return authz_fetcher_; };
536 1451 FileSystem *file_system() { return file_system_; }
537 MagicXattrManager *magic_xattr_mgr() { return magic_xattr_mgr_; }
538 20 bool has_membership_req() { return has_membership_req_; }
539 bool enforce_acls() { return enforce_acls_; }
540 bool cache_symlinks() { return cache_symlinks_; }
541 bool fuse_expire_entry() { return fuse_expire_entry_; }
542 catalog::InodeAnnotation *inode_annotation() { return inode_annotation_; }
543 glue::InodeTracker *inode_tracker() { return inode_tracker_; }
544 lru::InodeCache *inode_cache() { return inode_cache_; }
545 double kcache_timeout_sec() { return kcache_timeout_sec_; }
546 1426 lru::Md5PathCache *md5path_cache() { return md5path_cache_; }
547 std::string membership_req() { return membership_req_; }
548 glue::DentryTracker *dentry_tracker() { return dentry_tracker_; }
549 glue::PageCacheTracker *page_cache_tracker() { return page_cache_tracker_; }
550 lru::PathCache *path_cache() { return path_cache_; }
551 std::string repository_tag() { return repository_tag_; }
552 SimpleChunkTables *simple_chunk_tables() { return simple_chunk_tables_; }
553 4353 perf::Statistics *statistics() { return statistics_; }
554 perf::TelemetryAggregator *telemetry_aggr() { return telemetry_aggr_; }
555 1451 signature::SignatureManager *signature_mgr() { return signature_mgr_; }
556 uid_t talk_socket_uid() { return talk_socket_uid_; }
557 gid_t talk_socket_gid() { return talk_socket_gid_; }
558 std::string talk_socket_path() { return talk_socket_path_; }
559 Tracer *tracer() { return tracer_; }
560 cvmfs::Uuid *uuid() { return uuid_; }
561 StatfsCache *statfs_cache() { return statfs_cache_; }
562
563 /**
564 * Returns the partial replication inclusion spec if this mount point is
565 * connected to a partial Stratum-1, or NULL otherwise. Not owned by caller.
566 */
567 catalog::InclusionSpec *partial_inclusion_spec() const {
568 return partial_inclusion_spec_;
569 }
570
571 /**
572 * Returns true if the partial replica mode is "fail" (return EIO for missing
573 * objects instead of failing over to a full replica).
574 */
575 bool partial_replica_fail_mode() const { return partial_replica_fail_mode_; }
576
577 bool ReloadBlacklists();
578 void DisableCacheSymlinks();
579 void EnableFuseExpireEntry();
580
581 MountPoint(const std::string &fqrn,
582 FileSystem *file_system,
583 OptionsManager *options_mgr);
584
585 private:
586 /**
587 * The maximum TTL can be used to cap a root catalogs registered ttl. By
588 * default this is disabled (= 0).
589 */
590 static const unsigned kDefaultMaxTtlSec = 0;
591 /**
592 * Let fuse cache dentries for 1 minute.
593 */
594 static const unsigned kDefaultKCacheTtlSec = 60;
595 /**
596 * Number of Md5Path entries in the libcvmfs cache.
597 */
598 static const unsigned kLibPathCacheSize = 32000;
599 /**
600 * Cache seven times more md5 paths than inodes in the fuse module.
601 */
602 static const unsigned kInodeCacheFactor = 7;
603 /**
604 * Default to 16M RAM for meta-data caches; does not include the inode tracker
605 */
606 static const unsigned kDefaultMemcacheSize = 16 * 1024 * 1024;
607 /**
608 * Where to look for external authz helpers.
609 */
610 static const char *kDefaultAuthzSearchPath; // "/usr/libexec/cvmfs/authz"
611 /**
612 * Maximum number of concurrent HTTP connections.
613 */
614 static const unsigned kDefaultNumConnections = 16;
615 /**
616 * Default network timeout
617 */
618 static const unsigned kDefaultTimeoutSec = 5;
619 static const unsigned kDefaultRetries = 1;
620 static const unsigned kDefaultBackoffInitMs = 2000;
621 static const unsigned kDefaultBackoffMaxMs = 10000;
622 /**
623 * Memory buffer sizes for an activated tracer
624 */
625 static const unsigned kTracerBufferSize = 8192;
626 static const unsigned kTracerFlushThreshold = 7000;
627 static const char *kDefaultBlacklist; // "/etc/cvmfs/blacklist"
628 /**
629 * Default values for telemetry aggregator
630 */
631 static const int kDefaultTelemetrySendRateSec = 5 * 60; // 5min
632 static const int kMinimumTelemetrySendRateSec = 5; // 5sec
633
634
635 void CreateStatistics();
636 void CreateAuthz();
637 bool CreateSignatureManager();
638 bool CheckBlacklists();
639 bool CreateDownloadManagers();
640 bool CreateResolvConfWatcher();
641 void CreateFetchers();
642 void SetupPartialReplica();
643 bool CreateCatalogManager();
644 void CreateTables();
645 bool CreateTracer();
646 bool SetupBehavior();
647 void SetupDnsTuning(download::DownloadManager *manager);
648 void SetupHttpTuning();
649 bool SetupExternalDownloadMgr(bool dogeosort);
650 void SetupInodeAnnotation();
651 bool SetupOwnerMaps();
652 bool DetermineRootHash(shash::Any *root_hash);
653 bool FetchHistory(std::string *history_path);
654 std::string ReplaceHosts(std::string hosts);
655 std::string GetUniqFileSuffix();
656
657 std::string fqrn_;
658 cvmfs::Uuid *uuid_;
659 /**
660 * In contrast to the manager objects, the FileSystem is not owned.
661 */
662 FileSystem *file_system_;
663 /**
664 * The options manager is not owned.
665 */
666 OptionsManager *options_mgr_;
667
668 perf::Statistics *statistics_;
669 perf::TelemetryAggregator *telemetry_aggr_;
670 AuthzFetcher *authz_fetcher_;
671 AuthzSessionManager *authz_session_mgr_;
672 AuthzAttachment *authz_attachment_;
673 BackoffThrottle *backoff_throttle_;
674 signature::SignatureManager *signature_mgr_;
675 download::DownloadManager *download_mgr_;
676 download::DownloadManager *external_download_mgr_;
677 /**
678 * Optional download manager targeting a full Stratum-1, used as a fallback
679 * when this mount point's primary server is a partial replica. Owned.
680 */
681 download::DownloadManager *full_replica_download_mgr_;
682 cvmfs::Fetcher *fetcher_;
683 cvmfs::Fetcher *external_fetcher_;
684 /**
685 * Parsed inclusion spec downloaded from the partial Stratum-1, or NULL.
686 */
687 catalog::InclusionSpec *partial_inclusion_spec_;
688 /** True when partial replica mode is "fail" (vs. "failover"). */
689 bool partial_replica_fail_mode_;
690 catalog::InodeAnnotation *inode_annotation_;
691 catalog::ClientCatalogManager *catalog_mgr_;
692 ChunkTables *chunk_tables_;
693 SimpleChunkTables *simple_chunk_tables_;
694 lru::InodeCache *inode_cache_;
695 lru::PathCache *path_cache_;
696 lru::Md5PathCache *md5path_cache_;
697 Tracer *tracer_;
698 glue::InodeTracker *inode_tracker_;
699 glue::DentryTracker *dentry_tracker_;
700 glue::PageCacheTracker *page_cache_tracker_;
701 MagicXattrManager *magic_xattr_mgr_;
702 StatfsCache *statfs_cache_;
703
704 file_watcher::FileWatcher *resolv_conf_watcher_;
705
706 unsigned max_ttl_sec_;
707 pthread_mutex_t lock_max_ttl_;
708 double kcache_timeout_sec_;
709 bool fixed_catalog_;
710 bool enforce_acls_;
711 bool cache_symlinks_;
712 bool fuse_expire_entry_;
713 std::string repository_tag_;
714 std::vector<std::string> blacklist_paths_;
715
716 // TODO(jblomer): this should go in the catalog manager
717 std::string membership_req_;
718 bool has_membership_req_;
719
720 std::string talk_socket_path_;
721 uid_t talk_socket_uid_;
722 gid_t talk_socket_gid_;
723 }; // class MointPoint
724
725 #endif // CVMFS_MOUNTPOINT_H_
726
727