GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/mountpoint.cc
Date: 2026-05-19 11:45:12
Exec Total Coverage
Lines: 955 1359 70.3%
Branches: 1227 3060 40.1%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #include "mountpoint.h"
6
7 #include <errno.h>
8 #include <fcntl.h>
9 #include <inttypes.h>
10 #include <stdint.h>
11 #include <unistd.h>
12
13 #include <algorithm>
14 #include <cassert>
15 #include <climits>
16 #include <cstring>
17 #include <vector>
18
19 #include "duplex_fuse.h" // IWYU pragma: keep
20
21 #ifndef CVMFS_LIBCVMFS
22 #ifdef FUSE_CAP_EXPORT_SUPPORT
23 #define CVMFS_NFS_SUPPORT
24 #else
25 #warning "No NFS support, Fuse too old"
26 #endif
27 #endif
28
29 #include "authz/authz_curl.h"
30 #include "authz/authz_fetch.h"
31 #include "authz/authz_session.h"
32 #include "backoff.h"
33 #include "cache.h"
34 #include "cache_extern.h"
35 #include "cache_posix.h"
36 #include "cache_ram.h"
37 #include "cache_stream.h"
38 #include "cache_tiered.h"
39 #include "catalog.h"
40 #include "catalog_mgr_client.h"
41 #include "clientctx.h"
42 #include "crypto/signature.h"
43 #include "duplex_sqlite3.h"
44 #include "fetch.h"
45 #include "file_chunk.h"
46 #include "globals.h"
47 #include "glue_buffer.h"
48 #include "google/protobuf/stubs/common.h"
49 #include "history.h"
50 #include "history_sqlite.h"
51 #include "lru_md.h"
52 #include "manifest.h"
53 #include "manifest_fetch.h"
54 #include "network/download.h"
55 #include "nfs_maps.h"
56 #ifdef CVMFS_NFS_SUPPORT
57 #include "nfs_maps_leveldb.h"
58 #include "nfs_maps_sqlite.h"
59 #endif
60 #include "options.h"
61 #include "quota_posix.h"
62 #include "resolv_conf_event_handler.h"
63 #include "sqlitemem.h"
64 #include "sqlitevfs.h"
65 #include "statistics.h"
66 #include "telemetry_aggregator.h"
67 #include "tracer.h"
68 #include "util/logging.h"
69 #include "util/pointer.h"
70 #include "util/posix.h"
71 #include "util/string.h"
72 #include "util/uuid.h"
73 #include "wpad.h"
74
75 using namespace std; // NOLINT
76
77
78 bool FileSystem::g_alive = false;
79 const char *FileSystem::kDefaultCacheBase = "/var/lib/cvmfs";
80 const char *FileSystem::kDefaultCacheMgrInstance = "default";
81
82
83 978 FileSystem::IoErrorInfo::IoErrorInfo() : counter_(NULL), timestamp_last_(0) { }
84
85 void FileSystem::IoErrorInfo::Reset() {
86 counter_->Set(0);
87 timestamp_last_ = 0;
88 }
89
90 void FileSystem::IoErrorInfo::AddIoError() {
91 perf::Inc(counter_);
92 timestamp_last_ = time(NULL);
93 }
94
95 978 void FileSystem::IoErrorInfo::SetCounter(perf::Counter *c) { counter_ = c; }
96
97 int64_t FileSystem::IoErrorInfo::count() { return counter_->Get(); }
98
99 time_t FileSystem::IoErrorInfo::timestamp_last() { return timestamp_last_; }
100
101
102 /**
103 * A cache instance name is part of a bash parameter and can only contain
104 * certain characters.
105 */
106 112 bool FileSystem::CheckInstanceName(const std::string &instance) {
107
2/2
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 105 times.
112 if (instance.length() > 24)
108 7 return false;
109
1/2
✓ Branch 1 taken 105 times.
✗ Branch 2 not taken.
105 const sanitizer::CacheInstanceSanitizer instance_sanitizer;
110
3/4
✓ Branch 1 taken 105 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
✓ Branch 4 taken 91 times.
105 if (!instance_sanitizer.IsValid(instance)) {
111
2/4
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
28 boot_error_ = "invalid instance name (" + instance + "), "
112
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 + "only characters a-z, A-Z, 0-9, _ are allowed";
113 14 boot_status_ = loader::kFailCacheDir;
114 14 return false;
115 }
116 91 return true;
117 105 }
118
119
120 /**
121 * Not all possible combinations of cache flags / modes are valid.
122 */
123 943 bool FileSystem::CheckPosixCacheSettings(
124 const FileSystem::PosixCacheSettings &settings) {
125
4/4
✓ Branch 0 taken 119 times.
✓ Branch 1 taken 824 times.
✓ Branch 2 taken 21 times.
✓ Branch 3 taken 98 times.
943 if (settings.is_alien && settings.is_shared) {
126 boot_error_ = "Failure: shared local disk cache and alien cache mutually "
127 21 "exclusive. Please turn off shared local disk cache.";
128 21 boot_status_ = loader::kFailOptions;
129 21 return false;
130 }
131
4/4
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 824 times.
✓ Branch 2 taken 14 times.
✓ Branch 3 taken 84 times.
922 if (settings.is_alien && settings.is_managed) {
132 boot_error_ = "Failure: quota management and alien cache mutually "
133 14 "exclusive. Please turn off quota limit.";
134 14 boot_status_ = loader::kFailOptions;
135 14 return false;
136 }
137
138
2/2
✓ Branch 0 taken 506 times.
✓ Branch 1 taken 402 times.
908 if (type_ == kFsLibrary) {
139
3/4
✓ Branch 0 taken 499 times.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 499 times.
506 if (settings.is_shared || settings.is_managed) {
140 boot_error_ = "Failure: libcvmfs supports only unmanaged exclusive cache "
141 7 "or alien cache.";
142 7 boot_status_ = loader::kFailOptions;
143 7 return false;
144 }
145 }
146
147
4/4
✓ Branch 0 taken 381 times.
✓ Branch 1 taken 520 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 374 times.
901 if (settings.cache_base_defined && settings.cache_dir_defined) {
148 boot_error_ = "'CVMFS_CACHE_BASE' and 'CVMFS_CACHE_DIR' are mutually "
149 7 "exclusive";
150 7 boot_status_ = loader::kFailOptions;
151 7 return false;
152 }
153
154 894 return true;
155 }
156
157
158 /**
159 * Creation of state and manager classes. The destructor should mirror this
160 * method.
161 */
162 978 FileSystem *FileSystem::Create(const FileSystem::FileSystemInfo &fs_info) {
163
3/6
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 978 times.
✗ Branch 8 not taken.
978 UniquePtr<FileSystem> file_system(new FileSystem(fs_info));
164
165
1/2
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
978 file_system->SetupLogging();
166
1/2
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
978 LogCvmfs(kLogCvmfs, kLogDebug, "Options:\n%s",
167
1/2
✓ Branch 3 taken 978 times.
✗ Branch 4 not taken.
1956 file_system->options_mgr()->Dump().c_str());
168
169
1/2
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
978 file_system->CreateStatistics();
170
1/2
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
978 file_system->SetupSqlite();
171
2/4
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 978 times.
978 if (!file_system->DetermineNfsMode())
172 return file_system.Release();
173
3/4
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 35 times.
✓ Branch 5 taken 943 times.
978 if (!file_system->SetupWorkspace())
174 35 return file_system.Release();
175
176 // Redirect SQlite temp directory to workspace (global variable)
177 943 const unsigned length_tempdir = file_system->workspace_.length() + 1;
178
1/2
✓ Branch 1 taken 943 times.
✗ Branch 2 not taken.
943 sqlite3_temp_directory = static_cast<char *>(sqlite3_malloc(length_tempdir));
179 943 snprintf(sqlite3_temp_directory,
180 length_tempdir,
181 "%s",
182 943 file_system->workspace_.c_str());
183
184
3/4
✓ Branch 2 taken 943 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 63 times.
✓ Branch 5 taken 880 times.
943 if (!file_system->TriageCacheMgr())
185 63 return file_system.Release();
186
1/2
✓ Branch 2 taken 880 times.
✗ Branch 3 not taken.
880 file_system->SetupUuid();
187
1/4
✗ Branch 2 not taken.
✓ Branch 3 taken 880 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
880 if (!file_system->SetupNfsMaps())
188 return file_system.Release();
189
1/2
✓ Branch 2 taken 880 times.
✗ Branch 3 not taken.
880 const bool retval = sqlite::RegisterVfsRdOnly(file_system->cache_mgr_,
190 880 file_system->statistics_,
191 sqlite::kVfsOptDefault);
192
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 880 times.
880 assert(retval);
193 880 file_system->has_custom_sqlitevfs_ = true;
194
195
1/2
✓ Branch 1 taken 880 times.
✗ Branch 2 not taken.
880 ClientCtx::GetInstance();
196
197 880 file_system->boot_status_ = loader::kFailOk;
198 880 return file_system.Release();
199 978 }
200
201
202 978 void FileSystem::CreateStatistics() {
203
2/4
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
978 statistics_ = new perf::Statistics();
204
205 // Register the ShortString's static counters
206
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 statistics_->Register("pathstring.n_instances", "Number of instances");
207
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 statistics_->Register("pathstring.n_overflows", "Number of overflows");
208
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 statistics_->Register("namestring.n_instances", "Number of instances");
209
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 statistics_->Register("namestring.n_overflows", "Number of overflows");
210
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 statistics_->Register("linkstring.n_instances", "Number of instances");
211
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 statistics_->Register("linkstring.n_overflows", "Number of overflows");
212
213 // Callback counters
214
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_fs_open_ = statistics_->Register("cvmfs.n_fs_open",
215 "Overall number of file open operations");
216
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_fs_dir_open_ = statistics_->Register(
217 "cvmfs.n_fs_dir_open", "Overall number of directory open operations");
218
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_fs_lookup_ = statistics_->Register("cvmfs.n_fs_lookup",
219 "Number of lookups");
220
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_fs_lookup_negative_ = statistics_->Register("cvmfs.n_fs_lookup_negative",
221 "Number of negative lookups");
222
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_fs_stat_ = statistics_->Register("cvmfs.n_fs_stat", "Number of stats");
223
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_fs_stat_stale_ = statistics_->Register(
224 "cvmfs.n_fs_stat_stale",
225 "Number of stats for stale (open, meanwhile changed) regular files");
226
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_fs_statfs_ = statistics_->Register("cvmfs.n_fs_statfs",
227 "Overall number of statsfs calls");
228
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_fs_statfs_cached_ = statistics_->Register(
229 "cvmfs.n_fs_statfs_cached",
230 "Number of statsfs calls that accessed the cached statfs info");
231
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_fs_read_ = statistics_->Register("cvmfs.n_fs_read", "Number of files read");
232
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_fs_readlink_ = statistics_->Register("cvmfs.n_fs_readlink",
233 "Number of links read");
234
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_fs_forget_ = statistics_->Register("cvmfs.n_fs_forget",
235 "Number of inode forgets");
236
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_fs_inode_replace_ = statistics_->Register(
237 "cvmfs.n_fs_inode_replace",
238 "Number of stale inodes that got replaced by an up-to-date version");
239
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 no_open_files_ = statistics_->Register("cvmfs.no_open_files",
240 "Number of currently opened files");
241
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 no_open_dirs_ = statistics_->Register(
242 "cvmfs.no_open_dirs", "Number of currently opened directories");
243
3/6
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 978 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 978 times.
✗ Branch 9 not taken.
978 io_error_info_.SetCounter(
244 978 statistics_->Register("cvmfs.n_io_error", "Number of I/O errors"));
245
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_eio_total_ = statistics_->Register(
246 "eio.total",
247 "EIO returned to calling process. Sum of individual eio counters");
248
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_eio_01_ = statistics_->Register(
249 "eio.01", "EIO returned by cvmfs.cc:cvmfs_lookup() - lookup failed");
250
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_eio_02_ = statistics_->Register("eio.02",
251 "EIO returned by cvmfs.cc:ReplyNegative() "
252 "- CVMFS-specific metadata not found");
253
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_eio_03_ = statistics_->Register(
254 "eio.03",
255 "EIO returned by cvmfs.cc:cvmfs_opendir() - failed to open directory ");
256
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_eio_04_ = statistics_->Register("eio.04",
257 "EIO returned by cvmfs.cc:cvmfs_open() "
258 "- chunked file does not have any chunks");
259
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_eio_05_ = statistics_->Register(
260 "eio.05",
261 "EIO returned by cvmfs.cc:cvmfs_read() - failed to fetch chunk");
262
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_eio_06_ = statistics_->Register(
263 "eio.06", "EIO returned by cvmfs.cc:cvmfs_open() - failed to open file");
264
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_eio_07_ = statistics_->Register(
265 "eio.07", "EIO returned by cvmfs.cc:cvmfs_read() - failed to read chunk");
266
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_eio_08_ = statistics_->Register(
267 "eio.08", "EIO returned by cvmfs.cc:cvmfs_read() - failed to read file");
268
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 978 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 978 times.
✗ Branch 10 not taken.
978 n_emfile_ = statistics_->Register(
269 "eio.emfile",
270 "EMFILE returned by cvmfs.cc:cvmfs_read(): too many open files");
271
272 978 string optarg;
273
3/10
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 978 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
1956 if (options_mgr_->GetValue("CVMFS_INSTRUMENT_FUSE", &optarg)
274
3/10
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 978 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 978 times.
✗ Branch 12 not taken.
1956 && options_mgr_->IsOn(optarg)) {
275 HighPrecisionTimer::g_is_enabled = true;
276 }
277
278
2/4
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
978 hist_fs_lookup_ = new Log2Histogram(30);
279
2/4
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
978 hist_fs_forget_ = new Log2Histogram(30);
280
2/4
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
978 hist_fs_forget_multi_ = new Log2Histogram(30);
281
2/4
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
978 hist_fs_getattr_ = new Log2Histogram(30);
282
2/4
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
978 hist_fs_readlink_ = new Log2Histogram(30);
283
2/4
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
978 hist_fs_opendir_ = new Log2Histogram(30);
284
2/4
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
978 hist_fs_releasedir_ = new Log2Histogram(30);
285
2/4
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
978 hist_fs_readdir_ = new Log2Histogram(30);
286
2/4
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
978 hist_fs_open_ = new Log2Histogram(30);
287
2/4
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
978 hist_fs_read_ = new Log2Histogram(30);
288
2/4
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
978 hist_fs_release_ = new Log2Histogram(30);
289 978 }
290
291
292 /**
293 * Figure out mode of operation and cache directory. Checking options for
294 * sanity is in a separate method.
295 */
296 887 FileSystem::PosixCacheSettings FileSystem::DeterminePosixCacheSettings(
297 const string &instance) {
298 887 string optarg;
299 887 PosixCacheSettings settings;
300
301
5/16
✓ Branch 1 taken 887 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 887 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 887 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 887 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 887 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
1774 if (options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_REFCOUNT", instance),
302 &optarg)
303
3/10
✓ Branch 2 taken 887 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 887 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 887 times.
✗ Branch 12 not taken.
1774 && options_mgr_->IsOff(optarg)) {
304 settings.do_refcount = false;
305 }
306
307 3548 if (options_mgr_->GetValue(
308
5/16
✓ Branch 1 taken 887 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 887 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 887 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 887 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 887 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
1774 MkCacheParm("CVMFS_CACHE_CLEANUP_NONOPENLRU", instance), &optarg)
309
3/10
✓ Branch 2 taken 887 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 887 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 887 times.
✗ Branch 12 not taken.
1774 && options_mgr_->IsOn(optarg)) {
310 // Enable this policy only in a refcounted cache.
311 // Because it's the reference counter who will say if a file is open.
312 settings.cleanup_unused_first = settings.do_refcount;
313 }
314
315
6/16
✓ Branch 1 taken 887 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 887 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 887 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 887 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 14 times.
✓ Branch 14 taken 873 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
1774 if (options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_SHARED", instance),
316 &optarg)
317
7/10
✓ Branch 2 taken 887 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 353 times.
✓ Branch 5 taken 534 times.
✓ Branch 7 taken 353 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 14 times.
✓ Branch 10 taken 339 times.
✓ Branch 11 taken 887 times.
✗ Branch 12 not taken.
1774 && options_mgr_->IsOn(optarg)) {
318 14 settings.is_shared = true;
319 }
320
5/16
✓ Branch 1 taken 887 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 887 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 887 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 887 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 887 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
1774 if (options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_SERVER_MODE", instance),
321 &optarg)
322
3/10
✓ Branch 2 taken 887 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 887 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 887 times.
✗ Branch 12 not taken.
1774 && options_mgr_->IsOn(optarg)) {
323 settings.avoid_rename = true;
324 }
325
326
2/2
✓ Branch 0 taken 381 times.
✓ Branch 1 taken 506 times.
887 if (type_ == kFsFuse)
327 381 settings.quota_limit = kDefaultQuotaLimit;
328
5/8
✓ Branch 2 taken 887 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 887 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 887 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 77 times.
✓ Branch 14 taken 810 times.
887 if (options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_QUOTA_LIMIT", instance),
329 &optarg)) {
330
1/2
✓ Branch 1 taken 77 times.
✗ Branch 2 not taken.
77 settings.quota_limit = String2Int64(optarg) * 1024 * 1024;
331 }
332
2/2
✓ Branch 0 taken 325 times.
✓ Branch 1 taken 562 times.
887 if (settings.quota_limit > 0)
333 325 settings.is_managed = true;
334
335
1/2
✓ Branch 1 taken 887 times.
✗ Branch 2 not taken.
887 settings.cache_path = kDefaultCacheBase;
336
5/8
✓ Branch 2 taken 887 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 887 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 887 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 388 times.
✓ Branch 14 taken 499 times.
887 if (options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_BASE", instance),
337 &optarg)) {
338
1/2
✓ Branch 1 taken 388 times.
✗ Branch 2 not taken.
388 settings.cache_path = MakeCanonicalPath(optarg);
339 388 settings.cache_base_defined = true;
340 }
341
2/2
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 873 times.
887 if (settings.is_shared) {
342
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 settings.cache_path += "/shared";
343 } else {
344
2/4
✓ Branch 1 taken 873 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 873 times.
✗ Branch 5 not taken.
873 settings.cache_path += "/" + name_;
345 }
346
347 // CheckCacheMode makes sure that CVMFS_CACHE_DIR and CVMFS_CACHE_BASE are
348 // not set at the same time.
349
5/8
✓ Branch 2 taken 887 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 887 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 887 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 499 times.
✓ Branch 14 taken 388 times.
887 if (options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_DIR", instance),
350 &optarg)) {
351 499 settings.cache_dir_defined = true;
352
1/2
✓ Branch 1 taken 499 times.
✗ Branch 2 not taken.
499 settings.cache_path = optarg;
353 }
354
5/8
✓ Branch 2 taken 887 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 887 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 887 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 98 times.
✓ Branch 14 taken 789 times.
887 if (options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_ALIEN", instance),
355 &optarg)) {
356 98 settings.is_alien = true;
357
1/2
✓ Branch 1 taken 98 times.
✗ Branch 2 not taken.
98 settings.cache_path = optarg;
358 }
359 // We already changed the cwd to the workspace
360 // Which is only done if using FUSE
361
6/6
✓ Branch 0 taken 381 times.
✓ Branch 1 taken 506 times.
✓ Branch 3 taken 339 times.
✓ Branch 4 taken 42 times.
✓ Branch 5 taken 339 times.
✓ Branch 6 taken 548 times.
887 if ((type_ == kFsFuse) && (settings.cache_path == workspace_fullpath_)) {
362
1/2
✓ Branch 1 taken 339 times.
✗ Branch 2 not taken.
339 settings.cache_path = ".";
363 }
364
365 // The cache workspace usually is the cache directory, unless explicitly
366 // set otherwise
367
1/2
✓ Branch 1 taken 887 times.
✗ Branch 2 not taken.
887 settings.workspace = settings.cache_path;
368
6/16
✓ Branch 1 taken 887 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 887 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 887 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 887 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 42 times.
✓ Branch 14 taken 845 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
1774 if (options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_WORKSPACE", instance),
369 &optarg)
370
9/20
✓ Branch 2 taken 887 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 887 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 887 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 887 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 42 times.
✓ Branch 14 taken 845 times.
✓ Branch 15 taken 887 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 887 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 887 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
1774 || options_mgr_->GetValue("CVMFS_WORKSPACE", &optarg)) {
371 // Used for the shared quota manager
372
1/2
✓ Branch 1 taken 42 times.
✗ Branch 2 not taken.
42 settings.workspace = optarg;
373 }
374
375 1774 return settings;
376 887 }
377
378
379 978 bool FileSystem::DetermineNfsMode() {
380 978 string optarg;
381
382
4/10
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 28 times.
✓ Branch 8 taken 950 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
1956 if (options_mgr_->GetValue("CVMFS_NFS_SOURCE", &optarg)
383
6/10
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 28 times.
✓ Branch 5 taken 950 times.
✓ Branch 7 taken 28 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 28 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 978 times.
✗ Branch 12 not taken.
1956 && options_mgr_->IsOn(optarg)) {
384 28 nfs_mode_ |= kNfsMaps;
385
4/6
✓ Branch 2 taken 28 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 28 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 21 times.
✓ Branch 10 taken 7 times.
28 if (options_mgr_->GetValue("CVMFS_NFS_SHARED", &optarg)) {
386 21 nfs_mode_ |= kNfsMapsHa;
387
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
21 nfs_maps_dir_ = optarg;
388 }
389 }
390
391
3/4
✓ Branch 0 taken 533 times.
✓ Branch 1 taken 445 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 533 times.
978 if ((type_ == kFsLibrary) && (nfs_mode_ != kNfsNone)) {
392 boot_error_ = "Failure: libcvmfs does not support NFS export.";
393 boot_status_ = loader::kFailOptions;
394 return false;
395 }
396 978 return true;
397 978 }
398
399
400 978 FileSystem::FileSystem(const FileSystem::FileSystemInfo &fs_info)
401
1/2
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
978 : name_(fs_info.name)
402
1/2
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
978 , exe_path_(fs_info.exe_path)
403 978 , type_(fs_info.type)
404 978 , options_mgr_(fs_info.options_mgr)
405 978 , wait_workspace_(fs_info.wait_workspace)
406 978 , foreground_(fs_info.foreground)
407 978 , n_fs_open_(NULL)
408 978 , n_fs_dir_open_(NULL)
409 978 , n_fs_lookup_(NULL)
410 978 , n_fs_lookup_negative_(NULL)
411 978 , n_fs_stat_(NULL)
412 978 , n_fs_stat_stale_(NULL)
413 978 , n_fs_statfs_(NULL)
414 978 , n_fs_statfs_cached_(NULL)
415 978 , n_fs_read_(NULL)
416 978 , n_fs_readlink_(NULL)
417 978 , n_fs_forget_(NULL)
418 978 , n_fs_inode_replace_(NULL)
419 978 , no_open_files_(NULL)
420 978 , no_open_dirs_(NULL)
421 978 , n_eio_total_(NULL)
422 978 , n_eio_01_(NULL)
423 978 , n_eio_02_(NULL)
424 978 , n_eio_03_(NULL)
425 978 , n_eio_04_(NULL)
426 978 , n_eio_05_(NULL)
427 978 , n_eio_06_(NULL)
428 978 , n_eio_07_(NULL)
429 978 , n_eio_08_(NULL)
430 978 , n_emfile_(NULL)
431 978 , statistics_(NULL)
432 978 , fd_workspace_lock_(-1)
433 978 , found_previous_crash_(false)
434 978 , nfs_mode_(kNfsNone)
435 978 , cache_mgr_(NULL)
436 978 , uuid_cache_(NULL)
437 978 , nfs_maps_(NULL)
438 1956 , has_custom_sqlitevfs_(false) {
439
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 978 times.
978 assert(!g_alive);
440 978 g_alive = true;
441 978 g_uid = geteuid();
442 978 g_gid = getegid();
443
444 978 string optarg;
445 3912 if (options_mgr_->GetValue(
446
8/26
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 978 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 978 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 978 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 978 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 978 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 978 times.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 978 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
1956 MkCacheParm("CVMFS_CACHE_SERVER_MODE", kDefaultCacheMgrInstance),
447 &optarg)
448
3/10
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 978 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 978 times.
✗ Branch 12 not taken.
1956 && options_mgr_->IsOn(optarg)) {
449 g_raw_symlinks = true;
450 }
451 978 }
452
453
454 974 FileSystem::~FileSystem() {
455 974 ClientCtx::CleanupInstance();
456
457
2/2
✓ Branch 0 taken 877 times.
✓ Branch 1 taken 97 times.
974 if (has_custom_sqlitevfs_)
458 877 sqlite::UnregisterVfsRdOnly();
459
460
2/2
✓ Branch 0 taken 877 times.
✓ Branch 1 taken 97 times.
974 delete uuid_cache_;
461
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 974 times.
974 delete nfs_maps_;
462
2/2
✓ Branch 0 taken 877 times.
✓ Branch 1 taken 97 times.
974 delete cache_mgr_;
463
464
2/2
✓ Branch 0 taken 940 times.
✓ Branch 1 taken 34 times.
974 if (sqlite3_temp_directory) {
465 940 sqlite3_free(sqlite3_temp_directory);
466 940 sqlite3_temp_directory = NULL;
467 }
468
469
2/2
✓ Branch 1 taken 940 times.
✓ Branch 2 taken 34 times.
974 if (!path_crash_guard_.empty())
470 940 unlink(path_crash_guard_.c_str());
471
2/2
✓ Branch 1 taken 940 times.
✓ Branch 2 taken 34 times.
974 if (!path_workspace_lock_.empty())
472 940 unlink(path_workspace_lock_.c_str());
473
2/2
✓ Branch 0 taken 940 times.
✓ Branch 1 taken 34 times.
974 if (fd_workspace_lock_ >= 0)
474 940 UnlockFile(fd_workspace_lock_);
475
476 974 sqlite3_shutdown();
477 974 SqliteMemoryManager::CleanupInstance();
478
479
1/2
✓ Branch 0 taken 974 times.
✗ Branch 1 not taken.
974 delete hist_fs_lookup_;
480
1/2
✓ Branch 0 taken 974 times.
✗ Branch 1 not taken.
974 delete hist_fs_forget_multi_;
481
1/2
✓ Branch 0 taken 974 times.
✗ Branch 1 not taken.
974 delete hist_fs_forget_;
482
1/2
✓ Branch 0 taken 974 times.
✗ Branch 1 not taken.
974 delete hist_fs_getattr_;
483
1/2
✓ Branch 0 taken 974 times.
✗ Branch 1 not taken.
974 delete hist_fs_readlink_;
484
1/2
✓ Branch 0 taken 974 times.
✗ Branch 1 not taken.
974 delete hist_fs_opendir_;
485
1/2
✓ Branch 0 taken 974 times.
✗ Branch 1 not taken.
974 delete hist_fs_releasedir_;
486
1/2
✓ Branch 0 taken 974 times.
✗ Branch 1 not taken.
974 delete hist_fs_readdir_;
487
1/2
✓ Branch 0 taken 974 times.
✗ Branch 1 not taken.
974 delete hist_fs_open_;
488
1/2
✓ Branch 0 taken 974 times.
✗ Branch 1 not taken.
974 delete hist_fs_read_;
489
1/2
✓ Branch 0 taken 974 times.
✗ Branch 1 not taken.
974 delete hist_fs_release_;
490
1/2
✓ Branch 0 taken 974 times.
✗ Branch 1 not taken.
974 delete statistics_;
491
492 974 SetLogSyslogPrefix("");
493 974 SetLogMicroSyslog("");
494 974 SetLogDebugFile("");
495 974 google::protobuf::ShutdownProtobufLibrary();
496 974 g_alive = false;
497 974 }
498
499
500 944 bool FileSystem::LockWorkspace() {
501
1/2
✓ Branch 2 taken 944 times.
✗ Branch 3 not taken.
944 path_workspace_lock_ = workspace_ + "/lock." + name_;
502 944 fd_workspace_lock_ = TryLockFile(path_workspace_lock_);
503
2/2
✓ Branch 0 taken 943 times.
✓ Branch 1 taken 1 times.
944 if (fd_workspace_lock_ >= 0)
504 943 return true;
505
506
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (fd_workspace_lock_ == -1) {
507 boot_error_ = "could not acquire workspace lock (" + StringifyInt(errno)
508 + ")";
509 boot_status_ = loader::kFailCacheDir;
510 return false;
511 }
512
513
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 assert(fd_workspace_lock_ == -2);
514
515
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (!wait_workspace_) {
516 1 boot_status_ = loader::kFailLockWorkspace;
517 1 return false;
518 }
519
520 fd_workspace_lock_ = LockFile(path_workspace_lock_);
521 if (fd_workspace_lock_ < 0) {
522 boot_error_ = "could not acquire workspace lock (" + StringifyInt(errno)
523 + ")";
524 boot_status_ = loader::kFailCacheDir;
525 return false;
526 }
527 return true;
528 }
529
530
531 3812 void FileSystem::LogSqliteError(void *user_data __attribute__((unused)),
532 int sqlite_extended_error,
533 const char *message) {
534 3812 int log_dest = kLogDebug;
535 3812 const int sqlite_error = sqlite_extended_error & 0xFF;
536
2/2
✓ Branch 0 taken 214 times.
✓ Branch 1 taken 3598 times.
3812 switch (sqlite_error) {
537 214 case SQLITE_INTERNAL:
538 case SQLITE_PERM:
539 case SQLITE_NOMEM:
540 case SQLITE_IOERR:
541 case SQLITE_CORRUPT:
542 case SQLITE_FULL:
543 case SQLITE_CANTOPEN:
544 case SQLITE_MISUSE:
545 case SQLITE_FORMAT:
546 case SQLITE_NOTADB:
547 214 log_dest |= kLogSyslogErr;
548 214 break;
549 3598 case SQLITE_WARNING:
550 case SQLITE_NOTICE:
551 default:
552 3598 break;
553 }
554
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
3812 LogCvmfs(kLogCvmfs, log_dest, "SQlite3: %s (%d)", message,
555 sqlite_extended_error);
556 3812 }
557
558
559 /**
560 * Creates the cache parameter for a specific instance of the cache. Injects
561 * the instance name such that CVMFS_CACHE_FOO_BAR becomes
562 * CVMFS_CACHE_<INSTANCE>_FOO_BAR
563 */
564 9430 string FileSystem::MkCacheParm(const string &generic_parameter,
565 const string &instance) {
566
3/6
✓ Branch 2 taken 9430 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 9430 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 9430 times.
9430 assert(HasPrefix(generic_parameter, "CVMFS_CACHE_", false));
567
568
2/2
✓ Branch 1 taken 8779 times.
✓ Branch 2 taken 651 times.
9430 if (instance == kDefaultCacheMgrInstance) {
569 // Compatibility parameter names
570 8779 if ((generic_parameter == "CVMFS_CACHE_SHARED")
571
5/6
✓ Branch 0 taken 866 times.
✓ Branch 1 taken 7913 times.
✓ Branch 3 taken 866 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 866 times.
✓ Branch 6 taken 7913 times.
8779 && !options_mgr_->IsDefined(generic_parameter)) {
572
1/2
✓ Branch 2 taken 866 times.
✗ Branch 3 not taken.
866 return "CVMFS_SHARED_CACHE";
573 }
574 7913 if ((generic_parameter == "CVMFS_CACHE_ALIEN")
575
5/6
✓ Branch 0 taken 866 times.
✓ Branch 1 taken 7047 times.
✓ Branch 3 taken 866 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 866 times.
✓ Branch 6 taken 7047 times.
7913 && !options_mgr_->IsDefined(generic_parameter)) {
576
1/2
✓ Branch 2 taken 866 times.
✗ Branch 3 not taken.
866 return "CVMFS_ALIEN_CACHE";
577 }
578 7047 if ((generic_parameter == "CVMFS_CACHE_SERVER_MODE")
579
5/6
✓ Branch 0 taken 1844 times.
✓ Branch 1 taken 5203 times.
✓ Branch 3 taken 1844 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1844 times.
✓ Branch 6 taken 5203 times.
7047 && !options_mgr_->IsDefined(generic_parameter)) {
580
1/2
✓ Branch 2 taken 1844 times.
✗ Branch 3 not taken.
1844 return "CVMFS_SERVER_CACHE_MODE";
581 }
582 5203 if ((generic_parameter == "CVMFS_CACHE_QUOTA_LIMIT")
583
5/6
✓ Branch 0 taken 866 times.
✓ Branch 1 taken 4337 times.
✓ Branch 3 taken 866 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 866 times.
✓ Branch 6 taken 4337 times.
5203 && !options_mgr_->IsDefined(generic_parameter)) {
584
1/2
✓ Branch 2 taken 866 times.
✗ Branch 3 not taken.
866 return "CVMFS_QUOTA_LIMIT";
585 }
586 4337 return generic_parameter;
587 }
588
589
3/6
✓ Branch 2 taken 651 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 651 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 651 times.
✗ Branch 9 not taken.
1302 return "CVMFS_CACHE_" + instance + "_" + generic_parameter.substr(12);
590 }
591
592
593 void FileSystem::ResetErrorCounters() {
594 io_error_info_.Reset();
595 n_eio_total_->Set(0);
596 n_eio_01_->Set(0);
597 n_eio_02_->Set(0);
598 n_eio_03_->Set(0);
599 n_eio_04_->Set(0);
600 n_eio_05_->Set(0);
601 n_eio_06_->Set(0);
602 n_eio_07_->Set(0);
603 n_eio_08_->Set(0);
604 n_emfile_->Set(0);
605 }
606
607
608 /**
609 * Can be recursive for the tiered cache manager.
610 */
611 1027 CacheManager *FileSystem::SetupCacheMgr(const string &instance) {
612
3/4
✓ Branch 2 taken 1027 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✓ Branch 6 taken 1020 times.
1027 if (constructed_instances_.find(instance) != constructed_instances_.end()) {
613
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 boot_error_ = "circular cache definition: " + instance;
614 7 boot_status_ = loader::kFailCacheDir;
615 7 return NULL;
616 }
617
1/2
✓ Branch 1 taken 1020 times.
✗ Branch 2 not taken.
1020 constructed_instances_.insert(instance);
618
619
1/2
✓ Branch 2 taken 1020 times.
✗ Branch 3 not taken.
1020 LogCvmfs(kLogCvmfs, kLogDebug, "setting up cache manager instance %s",
620 instance.c_str());
621 1020 string instance_type;
622
2/2
✓ Branch 1 taken 866 times.
✓ Branch 2 taken 154 times.
1020 if (instance == kDefaultCacheMgrInstance) {
623
1/2
✓ Branch 1 taken 866 times.
✗ Branch 2 not taken.
866 instance_type = "posix";
624 } else {
625
3/6
✓ Branch 2 taken 154 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 154 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 154 times.
✗ Branch 9 not taken.
154 options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_TYPE", instance),
626 &instance_type);
627 }
628
2/2
✓ Branch 1 taken 887 times.
✓ Branch 2 taken 133 times.
1020 if (instance_type == "posix") {
629
1/2
✓ Branch 1 taken 887 times.
✗ Branch 2 not taken.
887 return SetupPosixCacheMgr(instance);
630
2/2
✓ Branch 1 taken 70 times.
✓ Branch 2 taken 63 times.
133 } else if (instance_type == "ram") {
631
1/2
✓ Branch 1 taken 70 times.
✗ Branch 2 not taken.
70 return SetupRamCacheMgr(instance);
632
2/2
✓ Branch 1 taken 56 times.
✓ Branch 2 taken 7 times.
63 } else if (instance_type == "tiered") {
633
1/2
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
56 return SetupTieredCacheMgr(instance);
634
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
7 } else if (instance_type == "external") {
635 return SetupExternalCacheMgr(instance);
636 } else {
637
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 boot_error_ = "invalid cache manager type for '" + instance
638
2/4
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
7 + "':" + instance_type;
639 7 boot_status_ = loader::kFailCacheDir;
640 7 return NULL;
641 }
642 1020 }
643
644
645 CacheManager *FileSystem::SetupExternalCacheMgr(const string &instance) {
646 string optarg;
647 unsigned nfiles = kDefaultNfiles;
648 if (options_mgr_->GetValue("CVMFS_NFILES", &optarg))
649 nfiles = String2Uint64(optarg);
650 vector<string> cmd_line;
651 if (options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_CMDLINE", instance),
652 &optarg)) {
653 cmd_line = SplitString(optarg, ',');
654 }
655
656 if (!options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_LOCATOR", instance),
657 &optarg)) {
658 boot_error_ = MkCacheParm("CVMFS_CACHE_LOCATOR", instance) + " missing";
659 boot_status_ = loader::kFailCacheDir;
660 return NULL;
661 }
662
663 const UniquePtr<ExternalCacheManager::PluginHandle> plugin_handle(
664 ExternalCacheManager::CreatePlugin(optarg, cmd_line));
665 if (!plugin_handle->IsValid()) {
666 boot_error_ = plugin_handle->error_msg();
667 boot_status_ = loader::kFailCacheDir;
668 return NULL;
669 }
670 ExternalCacheManager *cache_mgr = ExternalCacheManager::Create(
671 plugin_handle->fd_connection(), nfiles, name_ + ":" + instance);
672 if (cache_mgr == NULL) {
673 boot_error_ = "failed to create external cache manager for " + instance;
674 boot_status_ = loader::kFailCacheDir;
675 return NULL;
676 }
677 cache_mgr->AcquireQuotaManager(ExternalQuotaManager::Create(cache_mgr));
678 return cache_mgr;
679 }
680
681
682 887 CacheManager *FileSystem::SetupPosixCacheMgr(const string &instance) {
683
1/2
✓ Branch 1 taken 887 times.
✗ Branch 2 not taken.
887 const PosixCacheSettings settings = DeterminePosixCacheSettings(instance);
684
3/4
✓ Branch 1 taken 887 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 21 times.
✓ Branch 4 taken 866 times.
887 if (!CheckPosixCacheSettings(settings))
685 21 return NULL;
686 UniquePtr<PosixCacheManager> cache_mgr(PosixCacheManager::Create(
687 866 settings.cache_path, settings.is_alien,
688 866 settings.avoid_rename ? PosixCacheManager::kRenameLink
689 : PosixCacheManager::kRenameNormal,
690
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 866 times.
✓ Branch 3 taken 866 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 866 times.
✗ Branch 7 not taken.
866 settings.do_refcount, settings.cleanup_unused_first));
691
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 866 times.
866 if (!cache_mgr.IsValid()) {
692 boot_error_ = "Failed to setup posix cache '" + instance + "' in "
693 + settings.cache_path + ": " + strerror(errno);
694 boot_status_ = loader::kFailCacheDir;
695 return NULL;
696 }
697
698 // Sentinel file for future use
699 // Might be a read-only cache
700 866 const bool ignore_failure = settings.is_alien;
701
2/4
✓ Branch 1 taken 866 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 866 times.
✗ Branch 5 not taken.
866 CreateFile(settings.cache_path + "/.cvmfscache", 0600, ignore_failure);
702
703
2/2
✓ Branch 0 taken 318 times.
✓ Branch 1 taken 548 times.
866 if (settings.is_managed) {
704
2/4
✓ Branch 2 taken 318 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 318 times.
318 if (!SetupPosixQuotaMgr(settings, cache_mgr.weak_ref()))
705 return NULL;
706 }
707 866 return cache_mgr.Release();
708 887 }
709
710
711 70 CacheManager *FileSystem::SetupRamCacheMgr(const string &instance) {
712 70 string optarg;
713 70 unsigned nfiles = kDefaultNfiles;
714
3/6
✓ Branch 2 taken 70 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 70 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 70 times.
70 if (options_mgr_->GetValue("CVMFS_NFILES", &optarg)) {
715 nfiles = String2Uint64(optarg);
716 }
717 uint64_t sz_cache_bytes;
718
4/8
✓ Branch 2 taken 70 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 70 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 70 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 70 times.
✗ Branch 14 not taken.
70 if (options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_SIZE", instance),
719 &optarg)) {
720
3/6
✓ Branch 2 taken 70 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 70 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 70 times.
70 if (HasSuffix(optarg, "%", false)) {
721 sz_cache_bytes = platform_memsize() * String2Uint64(optarg) / 100;
722 } else {
723
1/2
✓ Branch 1 taken 70 times.
✗ Branch 2 not taken.
70 sz_cache_bytes = String2Uint64(optarg) * 1024 * 1024;
724 }
725 } else {
726 sz_cache_bytes = platform_memsize() >> 5; // ~3%
727 }
728 70 MemoryKvStore::MemoryAllocator alloc = MemoryKvStore::kMallocHeap;
729
5/8
✓ Branch 2 taken 70 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 70 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 70 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 14 times.
✓ Branch 14 taken 56 times.
70 if (options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_MALLOC", instance),
730 &optarg)) {
731
2/2
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 7 times.
14 if (optarg == "libc") {
732 7 alloc = MemoryKvStore::kMallocLibc;
733
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
7 } else if (optarg == "heap") {
734 alloc = MemoryKvStore::kMallocHeap;
735 } else {
736 boot_error_ = "Failure: unknown malloc "
737
4/8
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
14 + MkCacheParm("CVMFS_CACHE_MALLOC", instance) + "="
738
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 + optarg;
739 7 boot_status_ = loader::kFailOptions;
740 7 return NULL;
741 }
742 }
743 63 sz_cache_bytes = RoundUp8(
744 63 std::max(static_cast<uint64_t>(40 * 1024 * 1024), sz_cache_bytes));
745 RamCacheManager *cache_mgr = new RamCacheManager(
746 sz_cache_bytes,
747 nfiles,
748 alloc,
749
4/8
✓ Branch 1 taken 63 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 63 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 63 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 63 times.
✗ Branch 11 not taken.
63 perf::StatisticsTemplate("cache." + instance, statistics_));
750
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 63 times.
63 if (cache_mgr == NULL) {
751 boot_error_ = "failed to create ram cache manager for " + instance;
752 boot_status_ = loader::kFailCacheDir;
753 return NULL;
754 }
755
3/6
✓ Branch 1 taken 63 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 63 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 63 times.
✗ Branch 8 not taken.
63 cache_mgr->AcquireQuotaManager(new NoopQuotaManager());
756 63 return cache_mgr;
757 70 }
758
759
760 56 CacheManager *FileSystem::SetupTieredCacheMgr(const string &instance) {
761 56 string optarg;
762
5/8
✓ Branch 2 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 7 times.
✓ Branch 14 taken 49 times.
56 if (!options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_UPPER", instance),
763 &optarg)) {
764
3/6
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
7 boot_error_ = MkCacheParm("CVMFS_CACHE_UPPER", instance) + " missing";
765 7 boot_status_ = loader::kFailOptions;
766 7 return NULL;
767 }
768
2/4
✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
49 UniquePtr<CacheManager> upper(SetupCacheMgr(optarg));
769
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 49 times.
49 if (!upper.IsValid())
770 return NULL;
771
772
5/8
✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 49 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 7 times.
✓ Branch 14 taken 42 times.
49 if (!options_mgr_->GetValue(MkCacheParm("CVMFS_CACHE_LOWER", instance),
773 &optarg)) {
774
3/6
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
7 boot_error_ = MkCacheParm("CVMFS_CACHE_LOWER", instance) + " missing";
775 7 boot_status_ = loader::kFailOptions;
776 7 return NULL;
777 }
778
2/4
✓ Branch 1 taken 42 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 42 times.
✗ Branch 5 not taken.
42 UniquePtr<CacheManager> lower(SetupCacheMgr(optarg));
779
2/2
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 35 times.
42 if (!lower.IsValid())
780 7 return NULL;
781
782
1/2
✓ Branch 3 taken 35 times.
✗ Branch 4 not taken.
35 CacheManager *tiered = TieredCacheManager::Create(upper.Release(),
783 lower.Release());
784
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 35 times.
35 if (tiered == NULL) {
785 boot_error_ = "Failed to setup tiered cache manager " + instance;
786 boot_status_ = loader::kFailCacheDir;
787 return NULL;
788 }
789 140 if (options_mgr_->GetValue(
790
5/16
✓ Branch 1 taken 35 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 35 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 35 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 35 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 35 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
70 MkCacheParm("CVMFS_CACHE_LOWER_READONLY", instance), &optarg)
791
3/10
✓ Branch 2 taken 35 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 35 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 35 times.
✗ Branch 12 not taken.
70 && options_mgr_->IsOn(optarg)) {
792 static_cast<TieredCacheManager *>(tiered)->SetLowerReadOnly();
793 }
794 35 return tiered;
795 56 }
796
797
798 943 bool FileSystem::SetupCrashGuard() {
799
2/4
✓ Branch 1 taken 943 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 943 times.
✗ Branch 5 not taken.
943 path_crash_guard_ = workspace_ + "/running." + name_;
800 platform_stat64 info;
801 943 int retval = platform_stat(path_crash_guard_.c_str(), &info);
802
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 936 times.
943 if (retval == 0) {
803 7 found_previous_crash_ = true;
804
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 LogCvmfs(kLogCvmfs, kLogDebug | kLogSyslogWarn,
805 "looks like cvmfs has been crashed previously");
806 }
807
1/2
✓ Branch 2 taken 943 times.
✗ Branch 3 not taken.
943 retval = open(path_crash_guard_.c_str(), O_RDONLY | O_CREAT, 0600);
808
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 943 times.
943 if (retval < 0) {
809 boot_error_ = "could not open running sentinel (" + StringifyInt(errno)
810 + ")";
811 boot_status_ = loader::kFailCacheDir;
812 return false;
813 }
814
1/2
✓ Branch 1 taken 943 times.
✗ Branch 2 not taken.
943 close(retval);
815 943 return true;
816 }
817
818
819 943 bool FileSystem::SetupCwd() {
820
2/2
✓ Branch 0 taken 437 times.
✓ Branch 1 taken 506 times.
943 if (type_ == kFsFuse) {
821 // Try to jump to workspace / cache directory. This tests, if it is
822 // accessible and it brings speed later on.
823 437 const int retval = chdir(workspace_.c_str());
824
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 437 times.
437 if (retval != 0) {
825 boot_error_ = "workspace " + workspace_ + " is unavailable";
826 boot_status_ = loader::kFailCacheDir;
827 return false;
828 }
829 437 workspace_ = ".";
830 437 return true;
831 }
832
833 // Note: as of version 2.4 support for CVMFS_CWD_CACHE is dropped due to
834 // disproportionate large complexity to configure correctly. This affects
835 // only libcvmfs, mostly the legacy part.
836 // string optarg;
837 // if (options_mgr_->GetValue("CVMFS_CWD_CACHE", &optarg) &&
838 // options_mgr_->IsOn(optarg))
839 // {
840 // ...
841 // }
842 506 return true;
843 }
844
845
846 978 void FileSystem::SetupLoggingStandalone(const OptionsManager &options_mgr,
847 const std::string &prefix) {
848 978 string optarg;
849
4/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 978 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 246 times.
✓ Branch 10 taken 732 times.
978 if (options_mgr.GetValue("CVMFS_SYSLOG_LEVEL", &optarg))
850
2/4
✓ Branch 1 taken 246 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 246 times.
✗ Branch 5 not taken.
246 SetLogSyslogLevel(String2Uint64(optarg));
851
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 978 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 978 times.
978 if (options_mgr.GetValue("CVMFS_SYSLOG_FACILITY", &optarg))
852 SetLogSyslogFacility(String2Int64(optarg));
853
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 978 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 978 times.
978 if (options_mgr.GetValue("CVMFS_USYSLOG", &optarg))
854 SetLogMicroSyslog(optarg);
855
3/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 978 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 978 times.
978 if (options_mgr.GetValue("CVMFS_DEBUGLOG", &optarg))
856 SetLogDebugFile(optarg);
857
4/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 978 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 56 times.
✓ Branch 10 taken 922 times.
978 if (options_mgr.GetValue("CVMFS_SYSLOG_PREFIX", &optarg)) {
858
1/2
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
56 SetLogSyslogPrefix(optarg);
859 } else {
860
1/2
✓ Branch 1 taken 922 times.
✗ Branch 2 not taken.
922 SetLogSyslogPrefix(prefix);
861 }
862 978 }
863
864
865 978 void FileSystem::SetupLogging() {
866 978 SetupLoggingStandalone(*options_mgr_, name_);
867 978 }
868
869
870 880 bool FileSystem::SetupNfsMaps() {
871 #ifdef CVMFS_NFS_SUPPORT
872 if (!IsHaNfsSource())
873 nfs_maps_dir_ = workspace_;
874
875 string no_nfs_sentinel;
876 if (cache_mgr_->id() == kPosixCacheManager) {
877 PosixCacheManager *posix_cache_mgr = reinterpret_cast<PosixCacheManager *>(
878 cache_mgr_);
879 no_nfs_sentinel = posix_cache_mgr->cache_path() + "/no_nfs_maps." + name_;
880 if (!IsNfsSource()) {
881 // Might be a read-only cache
882 const bool ignore_failure = posix_cache_mgr->alien_cache();
883 CreateFile(no_nfs_sentinel, 0600, ignore_failure);
884 return true;
885 }
886 } else {
887 if (IsNfsSource()) {
888 boot_error_ = "NFS source only works with POSIX cache manager.";
889 boot_status_ = loader::kFailNfsMaps;
890 return false;
891 }
892 return true;
893 }
894
895 assert(cache_mgr_->id() == kPosixCacheManager);
896 assert(IsNfsSource());
897 if (!no_nfs_sentinel.empty() && FileExists(no_nfs_sentinel)) {
898 boot_error_ = "Cache was used without NFS maps before. "
899 "It has to be wiped out.";
900 boot_status_ = loader::kFailNfsMaps;
901 return false;
902 }
903
904 // nfs maps need to be protected by workspace lock
905 PosixCacheManager *posix_cache_mgr = reinterpret_cast<PosixCacheManager *>(
906 cache_mgr_);
907 if (posix_cache_mgr->cache_path() != workspace_) {
908 boot_error_ = "Cache directory and workspace must be identical for "
909 "NFS export";
910 boot_status_ = loader::kFailNfsMaps;
911 return false;
912 }
913
914 const string inode_cache_dir = nfs_maps_dir_ + "/nfs_maps." + name_;
915 if (!MkdirDeep(inode_cache_dir, 0700)) {
916 boot_error_ = "Failed to initialize NFS maps";
917 boot_status_ = loader::kFailNfsMaps;
918 return false;
919 }
920
921 // TODO(jblomer): make this a manager class
922 if (IsHaNfsSource()) {
923 nfs_maps_ = NfsMapsSqlite::Create(
924 inode_cache_dir,
925 catalog::ClientCatalogManager::kInodeOffset + 1,
926 found_previous_crash_,
927 statistics_);
928 } else {
929 nfs_maps_ = NfsMapsLeveldb::Create(
930 inode_cache_dir,
931 catalog::ClientCatalogManager::kInodeOffset + 1,
932 found_previous_crash_,
933 statistics_);
934 }
935
936 if (nfs_maps_ == NULL) {
937 boot_error_ = "Failed to initialize NFS maps";
938 boot_status_ = loader::kFailNfsMaps;
939 return false;
940 }
941
942 string optarg;
943 if (options_mgr_->GetValue("CVMFS_NFS_INTERLEAVED_INODES", &optarg)) {
944 vector<string> tokens = SplitString(optarg, '%');
945 if (tokens.size() != 2) {
946 boot_error_ = "invalid format for CVMFS_NFS_INTERLEAVED_INODES: "
947 + optarg;
948 boot_status_ = loader::kFailNfsMaps;
949 return false;
950 }
951 nfs_maps_->SetInodeResidue(String2Uint64(tokens[1]),
952 String2Uint64(tokens[0]));
953 }
954
955 return true;
956
957 #else
958 880 return true;
959 #endif
960 }
961
962
963 318 bool FileSystem::SetupPosixQuotaMgr(
964 const FileSystem::PosixCacheSettings &settings, CacheManager *cache_mgr) {
965
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 318 times.
318 assert(settings.quota_limit >= 0);
966 318 const int64_t quota_threshold = settings.quota_limit / 2;
967
1/2
✓ Branch 1 taken 318 times.
✗ Branch 2 not taken.
318 string cache_workspace = settings.cache_path;
968
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 318 times.
318 if (settings.cache_path != settings.workspace) {
969 LogCvmfs(kLogQuota, kLogDebug | kLogSyslog,
970 "using workspace %s to protect cache database in %s",
971 settings.workspace.c_str(), settings.cache_path.c_str());
972 cache_workspace += ":" + settings.workspace;
973 }
974 PosixQuotaManager *quota_mgr;
975
976
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 318 times.
318 if (settings.is_shared) {
977 quota_mgr = PosixQuotaManager::CreateShared(exe_path_,
978 cache_workspace,
979 settings.quota_limit,
980 quota_threshold,
981 foreground_);
982 if (quota_mgr == NULL) {
983 boot_error_ = "Failed to initialize shared lru cache";
984 boot_status_ = loader::kFailQuota;
985 return false;
986 }
987 } else {
988 636 quota_mgr = PosixQuotaManager::Create(cache_workspace,
989 318 settings.quota_limit,
990 quota_threshold,
991
1/2
✓ Branch 1 taken 318 times.
✗ Branch 2 not taken.
318 found_previous_crash_);
992
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 318 times.
318 if (quota_mgr == NULL) {
993 boot_error_ = "Failed to initialize lru cache";
994 boot_status_ = loader::kFailQuota;
995 return false;
996 }
997 }
998
999
3/6
✓ Branch 1 taken 318 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 318 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 318 times.
318 if (quota_mgr->GetSize() > quota_mgr->GetCapacity()) {
1000 LogCvmfs(kLogCvmfs, kLogDebug | kLogSyslog,
1001 "cache is already beyond quota size "
1002 "(size: %" PRId64 ", capacity: %" PRId64 "), cleaning up",
1003 quota_mgr->GetSize(), quota_mgr->GetCapacity());
1004 if (!quota_mgr->Cleanup(quota_threshold)) {
1005 delete quota_mgr;
1006 boot_error_ = "Failed to clean up cache";
1007 boot_status_ = loader::kFailQuota;
1008 return false;
1009 }
1010 }
1011
1/2
✓ Branch 1 taken 318 times.
✗ Branch 2 not taken.
318 quota_mgr->SetCleanupPolicy(settings.cleanup_unused_first);
1012
1013
1/2
✓ Branch 1 taken 318 times.
✗ Branch 2 not taken.
318 const int retval = cache_mgr->AcquireQuotaManager(quota_mgr);
1014
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 318 times.
318 assert(retval);
1015 318 LogCvmfs(kLogCvmfs, kLogDebug,
1016 "CernVM-FS: quota initialized, current size %luMB",
1017
2/4
✓ Branch 1 taken 318 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 318 times.
✗ Branch 5 not taken.
318 quota_mgr->GetSize() / (1024 * 1024));
1018 318 return true;
1019 318 }
1020
1021
1022 978 void FileSystem::SetupSqlite() {
1023 // Make sure SQlite starts clean after initialization
1024 978 sqlite3_shutdown();
1025
1026 int retval;
1027 978 retval = sqlite3_config(SQLITE_CONFIG_LOG, FileSystem::LogSqliteError, NULL);
1028
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 978 times.
978 assert(retval == SQLITE_OK);
1029 978 retval = sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
1030
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 978 times.
978 assert(retval == SQLITE_OK);
1031 978 SqliteMemoryManager::GetInstance()->AssignGlobalArenas();
1032
1033 // Disable SQlite3 file locking
1034 978 retval = sqlite3_vfs_register(sqlite3_vfs_find("unix-none"), 1);
1035
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 978 times.
978 assert(retval == SQLITE_OK);
1036 978 }
1037
1038
1039 978 bool FileSystem::SetupWorkspace() {
1040 978 string optarg;
1041 // This is very similar to "determine cache dir". It's for backward
1042 // compatibility with classic cache configuration where there was no
1043 // distinction between workspace and cache.
1044 // Complicated cache configurations should explicitly set CVMFS_WORKSPACE.
1045
1/2
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
978 workspace_ = kDefaultCacheBase;
1046
4/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 978 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 452 times.
✓ Branch 10 taken 526 times.
978 if (options_mgr_->GetValue("CVMFS_CACHE_BASE", &optarg))
1047
1/2
✓ Branch 1 taken 452 times.
✗ Branch 2 not taken.
452 workspace_ = MakeCanonicalPath(optarg);
1048
4/10
✓ Branch 1 taken 978 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 978 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14 times.
✓ Branch 8 taken 964 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
1956 if (options_mgr_->GetValue("CVMFS_SHARED_CACHE", &optarg)
1049
7/10
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 410 times.
✓ Branch 5 taken 568 times.
✓ Branch 7 taken 410 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 14 times.
✓ Branch 10 taken 396 times.
✓ Branch 11 taken 978 times.
✗ Branch 12 not taken.
1956 && options_mgr_->IsOn(optarg)) {
1050
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 workspace_ += "/shared";
1051 } else {
1052
2/4
✓ Branch 1 taken 964 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 964 times.
✗ Branch 5 not taken.
964 workspace_ += "/" + name_;
1053 }
1054
4/6
✓ Branch 2 taken 978 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 978 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 533 times.
✓ Branch 10 taken 445 times.
978 if (options_mgr_->GetValue("CVMFS_CACHE_DIR", &optarg)) {
1055
4/6
✓ Branch 2 taken 533 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 533 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 7 times.
✓ Branch 10 taken 526 times.
533 if (options_mgr_->IsDefined("CVMFS_CACHE_BASE")) {
1056 boot_error_ = "'CVMFS_CACHE_BASE' and 'CVMFS_CACHE_DIR' are mutually "
1057
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 "exclusive";
1058 7 boot_status_ = loader::kFailOptions;
1059 7 return false;
1060 }
1061
1/2
✓ Branch 1 taken 526 times.
✗ Branch 2 not taken.
526 workspace_ = optarg;
1062 }
1063
4/6
✓ Branch 2 taken 971 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 971 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 35 times.
✓ Branch 10 taken 936 times.
971 if (options_mgr_->GetValue("CVMFS_WORKSPACE", &optarg))
1064
1/2
✓ Branch 1 taken 35 times.
✗ Branch 2 not taken.
35 workspace_ = optarg;
1065
1/2
✓ Branch 1 taken 971 times.
✗ Branch 2 not taken.
971 workspace_fullpath_ = workspace_;
1066
1067 // If workspace and alien cache are the same directory, we need to open
1068 // permission now to 0770 to avoid a race when fixing it later
1069 971 const int mode = 0770;
1070
3/4
✓ Branch 1 taken 971 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 27 times.
✓ Branch 4 taken 944 times.
971 if (!MkdirDeep(workspace_, mode, false)) {
1071
1/2
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
27 boot_error_ = "cannot create workspace directory " + workspace_;
1072 27 boot_status_ = loader::kFailCacheDir;
1073 27 return false;
1074 }
1075
1076
3/4
✓ Branch 1 taken 944 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 943 times.
944 if (!LockWorkspace())
1077 1 return false;
1078
2/4
✓ Branch 1 taken 943 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 943 times.
943 if (!SetupCwd())
1079 return false;
1080
2/4
✓ Branch 1 taken 943 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 943 times.
943 if (!SetupCrashGuard())
1081 return false;
1082
1083 943 return true;
1084 978 }
1085
1086
1087 880 void FileSystem::SetupUuid() {
1088
1/2
✓ Branch 2 taken 880 times.
✗ Branch 3 not taken.
880 uuid_cache_ = cvmfs::Uuid::Create(workspace_ + "/uuid");
1089
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 880 times.
880 if (uuid_cache_ == NULL) {
1090 LogCvmfs(kLogCvmfs, kLogDebug | kLogSyslogWarn,
1091 "failed to load/store %s/uuid", workspace_.c_str());
1092 uuid_cache_ = cvmfs::Uuid::Create("");
1093 assert(uuid_cache_ != NULL);
1094 }
1095 880 }
1096
1097
1098 /**
1099 * Required by CernVM: the fuse module needs to free r/w file descriptor to the
1100 * cache in order to properly unravel the file system stack on shutdown.
1101 */
1102 void FileSystem::TearDown2ReadOnly() {
1103 if ((cache_mgr_ != NULL) && (cache_mgr_->id() == kPosixCacheManager)) {
1104 PosixCacheManager *posix_cache_mgr = reinterpret_cast<PosixCacheManager *>(
1105 cache_mgr_);
1106 posix_cache_mgr->TearDown2ReadOnly();
1107 }
1108
1109 unlink(path_crash_guard_.c_str());
1110 LogCvmfs(kLogCache, kLogSyslog, "switch to read-only cache mode");
1111 SetLogMicroSyslog("");
1112 }
1113
1114
1115 void FileSystem::RemapCatalogFd(int from, int to) {
1116 sqlite::RegisterFdMapping(from, to);
1117 }
1118
1119 void FileSystem::ReplaceCacheManager(CacheManager *new_cache_mgr) {
1120 cache_mgr_ = new_cache_mgr;
1121 sqlite::ReplaceCacheManager(new_cache_mgr);
1122 }
1123
1124
1125 943 bool FileSystem::TriageCacheMgr() {
1126
1/2
✓ Branch 1 taken 943 times.
✗ Branch 2 not taken.
943 cache_mgr_instance_ = kDefaultCacheMgrInstance;
1127 943 string instance;
1128
4/10
✓ Branch 1 taken 943 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 943 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 84 times.
✓ Branch 8 taken 859 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
1886 if (options_mgr_->GetValue("CVMFS_CACHE_PRIMARY", &instance)
1129
5/8
✓ Branch 2 taken 943 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 84 times.
✓ Branch 5 taken 859 times.
✓ Branch 7 taken 84 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 943 times.
✗ Branch 10 not taken.
1886 && !instance.empty()) {
1130
3/4
✓ Branch 1 taken 84 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 77 times.
84 if (!CheckInstanceName(instance))
1131 7 return false;
1132
1/2
✓ Branch 1 taken 77 times.
✗ Branch 2 not taken.
77 cache_mgr_instance_ = instance;
1133 }
1134
1135
1/2
✓ Branch 1 taken 936 times.
✗ Branch 2 not taken.
936 cache_mgr_ = SetupCacheMgr(cache_mgr_instance_);
1136
2/2
✓ Branch 0 taken 56 times.
✓ Branch 1 taken 880 times.
936 if (cache_mgr_ == NULL)
1137 56 return false;
1138
1139 880 std::string optarg;
1140
3/10
✓ Branch 1 taken 880 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 880 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 880 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
1760 if (options_mgr_->GetValue("CVMFS_STREAMING_CACHE", &optarg)
1141
3/10
✓ Branch 2 taken 880 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 880 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 880 times.
✗ Branch 12 not taken.
1760 && options_mgr_->IsOn(optarg)) {
1142 unsigned nfiles = kDefaultNfiles;
1143 if (options_mgr_->GetValue("CVMFS_NFILES", &optarg))
1144 nfiles = String2Uint64(optarg);
1145 size_t buffer_size = StreamingCacheManager::kDefaultBufferSize;
1146 if (options_mgr_->GetValue("CVMFS_STREAMING_CACHE_BUFFER_SIZE", &optarg))
1147 buffer_size = String2Uint64(optarg);
1148 cache_mgr_ = new StreamingCacheManager(nfiles, cache_mgr_, NULL, NULL,
1149 buffer_size, statistics_);
1150 }
1151
1152 880 return true;
1153 943 }
1154
1155
1156 //------------------------------------------------------------------------------
1157
1158
1159 const char *MountPoint::kDefaultAuthzSearchPath = "/usr/libexec/cvmfs/authz";
1160 const char *MountPoint::kDefaultBlacklist = "/etc/cvmfs/blacklist";
1161
1162 522 bool MountPoint::CheckBlacklists() {
1163 522 blacklist_paths_.clear();
1164 522 string blacklist;
1165
4/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 508 times.
✓ Branch 10 taken 14 times.
522 if (!options_mgr_->GetValue("CVMFS_BLACKLIST", &blacklist))
1166
1/2
✓ Branch 1 taken 508 times.
✗ Branch 2 not taken.
508 blacklist = kDefaultBlacklist;
1167
1/2
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
522 blacklist_paths_.push_back(blacklist);
1168
1169 522 bool append = false;
1170
3/4
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 515 times.
522 if (FileExists(blacklist)) {
1171
2/4
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 7 times.
7 if (!signature_mgr_->LoadBlacklist(blacklist, append)) {
1172 boot_error_ = "failed to load blacklist " + blacklist;
1173 boot_status_ = loader::kFailSignature;
1174 return false;
1175 }
1176 7 append = true;
1177 }
1178
1179 522 string config_repository_path;
1180
3/4
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 21 times.
✓ Branch 4 taken 501 times.
522 if (options_mgr_->HasConfigRepository(fqrn_, &config_repository_path)) {
1181
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
21 blacklist = config_repository_path + "blacklist";
1182
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
21 blacklist_paths_.push_back(blacklist);
1183
3/4
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
✓ Branch 4 taken 7 times.
21 if (FileExists(blacklist)) {
1184
2/4
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
14 if (!signature_mgr_->LoadBlacklist(blacklist, append)) {
1185 boot_error_ = "failed to load blacklist from config repository";
1186 boot_status_ = loader::kFailSignature;
1187 return false;
1188 }
1189 }
1190 }
1191
1192 522 return true;
1193 522 }
1194
1195
1196 /**
1197 * Like CheckBlacklists but supposed to be used after bootstrap, possibly in
1198 * multi-threaded context.
1199 */
1200 14 bool MountPoint::ReloadBlacklists() {
1201 14 const bool result = true;
1202 14 bool append = false;
1203
2/2
✓ Branch 1 taken 21 times.
✓ Branch 2 taken 14 times.
35 for (unsigned i = 0; i < blacklist_paths_.size(); ++i) {
1204
1/2
✓ Branch 2 taken 21 times.
✗ Branch 3 not taken.
21 const string blacklist = blacklist_paths_[i];
1205
2/4
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 21 times.
21 if (FileExists(blacklist)) {
1206 const bool retval = signature_mgr_->LoadBlacklist(blacklist, append);
1207 // TODO(jblomer): this can leave us with a half-loaded blacklist
1208 if (!retval)
1209 return false;
1210 append = true;
1211 }
1212
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
21 }
1213 14 return result;
1214 }
1215
1216 /**
1217 * Disables kernel caching of symlinks.
1218 * Symlink caching requires fuse >= 3.10 (FUSE_CAP_CACHE_SYMLINKS) and
1219 * linux kernel >= 4.2. Some OS might backport it.
1220 *
1221 * NOTE: This function should only be called before or within cvmfs_init().
1222 *
1223 */
1224 void MountPoint::DisableCacheSymlinks() { cache_symlinks_ = false; }
1225
1226 /**
1227 * Instead of invalidate dentries, they should be expired.
1228 * Fixes issues with mount-on-top mounts and symlink caching.
1229 */
1230 void MountPoint::EnableFuseExpireEntry() { fuse_expire_entry_ = true; }
1231
1232
1233 /**
1234 * The option_mgr parameter can be NULL, in which case the global option manager
1235 * from the file system is used.
1236 */
1237 529 MountPoint *MountPoint::Create(const string &fqrn,
1238 FileSystem *file_system,
1239 OptionsManager *options_mgr) {
1240
2/2
✓ Branch 0 taken 190 times.
✓ Branch 1 taken 339 times.
529 if (options_mgr == NULL)
1241 190 options_mgr = file_system->options_mgr();
1242 UniquePtr<MountPoint> mountpoint(
1243
3/6
✓ Branch 1 taken 529 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 529 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 529 times.
✗ Branch 8 not taken.
529 new MountPoint(fqrn, file_system, options_mgr));
1244
1245 // At this point, we have a repository name, the type (fuse or library) and
1246 // an options manager (which can be the same than the FileSystem's one).
1247
1248
1/2
✓ Branch 2 taken 529 times.
✗ Branch 3 not taken.
529 mountpoint->CreateStatistics();
1249
1/2
✓ Branch 2 taken 529 times.
✗ Branch 3 not taken.
529 mountpoint->CreateAuthz();
1250
2/4
✓ Branch 1 taken 529 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 529 times.
✗ Branch 5 not taken.
529 mountpoint->backoff_throttle_ = new BackoffThrottle();
1251
1252
7/10
✓ Branch 2 taken 529 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 522 times.
✓ Branch 5 taken 7 times.
✓ Branch 8 taken 522 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 522 times.
✓ Branch 12 taken 7 times.
✓ Branch 13 taken 522 times.
529 if (!mountpoint->CreateSignatureManager() || !mountpoint->CheckBlacklists())
1253 7 return mountpoint.Release();
1254
3/4
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 43 times.
✓ Branch 5 taken 479 times.
522 if (!mountpoint->CreateDownloadManagers())
1255 43 return mountpoint.Release();
1256
2/4
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 479 times.
479 if (file_system->cache_mgr()->id() == kStreamingCacheManager) {
1257 StreamingCacheManager
1258 *streaming_cachemgr = dynamic_cast<StreamingCacheManager *>(
1259 file_system->cache_mgr());
1260 streaming_cachemgr->SetRegularDownloadManager(mountpoint->download_mgr());
1261 streaming_cachemgr->SetExternalDownloadManager(
1262 mountpoint->external_download_mgr());
1263 }
1264
2/4
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 479 times.
479 if (!mountpoint->CreateResolvConfWatcher()) {
1265 return mountpoint.Release();
1266 }
1267
1/2
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
479 mountpoint->CreateFetchers();
1268
3/4
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 103 times.
✓ Branch 5 taken 376 times.
479 if (!mountpoint->CreateCatalogManager())
1269 103 return mountpoint.Release();
1270
2/4
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 376 times.
376 if (!mountpoint->CreateTracer())
1271 return mountpoint.Release();
1272
1273
1/2
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
376 mountpoint->ReEvaluateAuthz();
1274
1/2
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
376 mountpoint->CreateTables();
1275
2/4
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 376 times.
376 if (!mountpoint->SetupBehavior())
1276 return mountpoint.Release();
1277
1278 376 mountpoint->boot_status_ = loader::kFailOk;
1279 376 return mountpoint.Release();
1280 529 }
1281
1282
1283 529 void MountPoint::CreateAuthz() {
1284 529 string optarg;
1285 529 string authz_helper;
1286
3/6
✓ Branch 2 taken 529 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 529 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 529 times.
529 if (options_mgr_->GetValue("CVMFS_AUTHZ_HELPER", &optarg))
1287 authz_helper = optarg;
1288
1/2
✓ Branch 2 taken 529 times.
✗ Branch 3 not taken.
529 string authz_search_path(kDefaultAuthzSearchPath);
1289
3/6
✓ Branch 2 taken 529 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 529 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 529 times.
529 if (options_mgr_->GetValue("CVMFS_AUTHZ_SEARCH_PATH", &optarg))
1290 authz_search_path = optarg;
1291
1292 1058 authz_fetcher_ = new AuthzExternalFetcher(fqrn_, authz_helper,
1293
2/4
✓ Branch 1 taken 529 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 529 times.
✗ Branch 5 not taken.
529 authz_search_path, options_mgr_);
1294
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 529 times.
529 assert(authz_fetcher_ != NULL);
1295
1296
1/2
✓ Branch 1 taken 529 times.
✗ Branch 2 not taken.
529 authz_session_mgr_ = AuthzSessionManager::Create(authz_fetcher_, statistics_);
1297
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 529 times.
529 assert(authz_session_mgr_ != NULL);
1298
1299
2/4
✓ Branch 1 taken 529 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 529 times.
✗ Branch 5 not taken.
529 authz_attachment_ = new AuthzAttachment(authz_session_mgr_);
1300
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 529 times.
529 assert(authz_attachment_ != NULL);
1301 529 }
1302
1303
1304 479 bool MountPoint::CreateCatalogManager() {
1305 479 string optarg;
1306
1307
2/4
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 479 times.
✗ Branch 5 not taken.
479 catalog_mgr_ = new catalog::ClientCatalogManager(this);
1308
1309
1/2
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
479 SetupInodeAnnotation();
1310
3/4
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 472 times.
479 if (!SetupOwnerMaps())
1311 7 return false;
1312
1/2
✓ Branch 1 taken 472 times.
✗ Branch 2 not taken.
472 shash::Any root_hash;
1313
3/4
✓ Branch 1 taken 472 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
✓ Branch 4 taken 458 times.
472 if (!DetermineRootHash(&root_hash))
1314 14 return false;
1315
1316 bool retval;
1317
2/2
✓ Branch 1 taken 231 times.
✓ Branch 2 taken 227 times.
458 if (root_hash.IsNull()) {
1318
1/2
✓ Branch 1 taken 231 times.
✗ Branch 2 not taken.
231 retval = catalog_mgr_->Init();
1319 } else {
1320 227 fixed_catalog_ = true;
1321
2/8
✓ Branch 1 taken 227 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
454 const bool alt_root_path = options_mgr_->GetValue("CVMFS_ALT_ROOT_PATH",
1322 &optarg)
1323
3/10
✓ Branch 2 taken 227 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 227 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 227 times.
✗ Branch 12 not taken.
454 && options_mgr_->IsOn(optarg);
1324
1/2
✓ Branch 1 taken 227 times.
✗ Branch 2 not taken.
227 retval = catalog_mgr_->InitFixed(root_hash, alt_root_path);
1325 }
1326
2/2
✓ Branch 0 taken 75 times.
✓ Branch 1 taken 383 times.
458 if (!retval) {
1327
1/2
✓ Branch 1 taken 75 times.
✗ Branch 2 not taken.
75 boot_error_ = "Failed to initialize root file catalog";
1328 75 boot_status_ = loader::kFailCatalog;
1329 75 return false;
1330 }
1331
1332
3/4
✓ Branch 1 taken 383 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 376 times.
383 if (catalog_mgr_->IsRevisionBlacklisted()) {
1333
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 boot_error_ = "repository revision blacklisted";
1334 7 boot_status_ = loader::kFailRevisionBlacklisted;
1335 7 return false;
1336 }
1337
1338
3/10
✓ Branch 1 taken 376 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 376 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 376 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
752 if (options_mgr_->GetValue("CVMFS_AUTO_UPDATE", &optarg)
1339
3/10
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 376 times.
✗ Branch 12 not taken.
752 && !options_mgr_->IsOn(optarg)) {
1340 fixed_catalog_ = true;
1341 }
1342
1343
3/6
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 376 times.
376 if (options_mgr_->GetValue("CVMFS_CATALOG_WATERMARK", &optarg)) {
1344 catalog_mgr_->SetCatalogWatermark(String2Uint64(optarg));
1345 } else {
1346 unsigned soft_limit;
1347 unsigned hard_limit;
1348
1/2
✓ Branch 1 taken 376 times.
✗ Branch 2 not taken.
376 GetLimitNoFile(&soft_limit, &hard_limit);
1349 376 catalog_mgr_->SetCatalogWatermark(soft_limit / 4);
1350 }
1351
1352
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 376 times.
376 if (catalog_mgr_->volatile_flag()) {
1353 LogCvmfs(kLogCvmfs, kLogDebug, "content of repository flagged as VOLATILE");
1354 }
1355
1356 376 return true;
1357 479 }
1358
1359
1360 522 bool MountPoint::CreateDownloadManagers() {
1361 522 string optarg;
1362
1/2
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
1044 download_mgr_ = new download::DownloadManager(
1363 kDefaultNumConnections,
1364
4/8
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 522 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 522 times.
✗ Branch 13 not taken.
1566 perf::StatisticsTemplate("download", statistics_));
1365
1/2
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
522 download_mgr_->SetCredentialsAttachment(authz_attachment_);
1366
1367 // must be set before proxy and host chains are being initialized
1368 // error output is handled in SetShardingPolicy
1369
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_PROXY_SHARDING_POLICY", &optarg)) {
1370 if (optarg.compare("EXTERNAL") == 0) {
1371 download_mgr_->SetShardingPolicy(download::kShardingPolicyExternal);
1372 download_mgr_->SetFqrn(fqrn());
1373 }
1374 }
1375
1376
3/10
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 522 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 522 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
1044 if (options_mgr_->GetValue("CVMFS_FAILOVER_INDEFINITELY", &optarg)
1377
3/10
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 522 times.
✗ Branch 12 not taken.
1044 && options_mgr_->IsOn(optarg)) {
1378 download_mgr_->SetFailoverIndefinitely();
1379 }
1380
1381
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_METALINK_URL", &optarg)) {
1382 download_mgr_->SetMetalinkChain(optarg);
1383 // host chain will be set later when the metalink server is contacted
1384 download_mgr_->SetHostChain("");
1385 // metalink requires redirects
1386 download_mgr_->EnableRedirects();
1387
4/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 486 times.
✓ Branch 10 taken 36 times.
522 } else if (options_mgr_->GetValue("CVMFS_SERVER_URL", &optarg)) {
1388
1/2
✓ Branch 1 taken 486 times.
✗ Branch 2 not taken.
486 download_mgr_->SetHostChain(optarg);
1389 }
1390
1391
3/10
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 522 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 522 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
1044 if (options_mgr_->GetValue("_CVMFS_DEVEL_IGNORE_SIGNATURE_FAILURES", &optarg)
1392
3/10
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 522 times.
✗ Branch 12 not taken.
1044 && options_mgr_->IsOn(optarg)) {
1393 download_mgr_->EnableIgnoreSignatureFailures();
1394 LogCvmfs(kLogCvmfs, kLogDebug | kLogSyslogWarn,
1395 "Development option: Activate ignore signature failures during "
1396 "download. "
1397 "DO NOT USE IN PRODUCTION");
1398 }
1399
1400
1/2
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
522 SetupDnsTuning(download_mgr_);
1401
1/2
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
522 SetupHttpTuning();
1402
1403 522 string forced_proxy_template;
1404
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_PROXY_TEMPLATE", &optarg))
1405 forced_proxy_template = optarg;
1406
2/4
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
522 download_mgr_->SetProxyTemplates(file_system_->uuid_cache()->uuid(),
1407 forced_proxy_template);
1408
1409 522 string proxies;
1410
4/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 479 times.
✓ Branch 10 taken 43 times.
522 if (options_mgr_->GetValue("CVMFS_HTTP_PROXY", &optarg))
1411
1/2
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
479 proxies = optarg;
1412
1/2
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
1044 proxies = download::ResolveProxyDescription(
1413 proxies,
1414
4/8
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 522 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 522 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 522 times.
✗ Branch 11 not taken.
1044 file_system_->workspace() + "/proxies" + GetUniqFileSuffix(),
1415 522 download_mgr_);
1416
2/2
✓ Branch 1 taken 43 times.
✓ Branch 2 taken 479 times.
522 if (proxies == "") {
1417
1/2
✓ Branch 1 taken 43 times.
✗ Branch 2 not taken.
43 boot_error_ = "failed to discover HTTP proxy servers";
1418 43 boot_status_ = loader::kFailWpad;
1419 43 return false;
1420 }
1421 479 string fallback_proxies;
1422
3/6
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 479 times.
479 if (options_mgr_->GetValue("CVMFS_FALLBACK_PROXY", &optarg))
1423 fallback_proxies = optarg;
1424
1/2
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
479 download_mgr_->SetProxyChain(proxies, fallback_proxies,
1425 download::DownloadManager::kSetProxyBoth);
1426
1427
2/8
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 479 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
958 const bool do_geosort = options_mgr_->GetValue("CVMFS_USE_GEOAPI", &optarg)
1428
3/10
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 479 times.
✗ Branch 12 not taken.
958 && options_mgr_->IsOn(optarg);
1429
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 479 times.
479 if (do_geosort) {
1430 download_mgr_->ProbeGeo();
1431 }
1432
4/6
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 28 times.
✓ Branch 10 taken 451 times.
479 if (options_mgr_->GetValue("CVMFS_MAX_SERVERS", &optarg)) {
1433
1/2
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
28 const unsigned max_servers = String2Uint64(optarg);
1434 28 std::vector<std::string> host_chain;
1435
1/2
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
28 download_mgr_->GetHostInfo(&host_chain, NULL, NULL);
1436
6/6
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 7 times.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 14 times.
✓ Branch 5 taken 7 times.
✓ Branch 6 taken 21 times.
28 if (max_servers > 0 && max_servers < host_chain.size()) {
1437
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 host_chain.resize(max_servers);
1438
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 download_mgr_->SetHostChain(host_chain);
1439 }
1440 28 }
1441
1442
3/10
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 479 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 479 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
958 if (options_mgr_->GetValue("CVMFS_USE_SSL_SYSTEM_CA", &optarg)
1443
3/10
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 479 times.
✗ Branch 12 not taken.
958 && options_mgr_->IsOn(optarg)) {
1444 download_mgr_->UseSystemCertificatePath();
1445 }
1446
1447
3/10
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 479 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 479 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
958 if (options_mgr_->GetValue("CVMFS_PROXY_SHARD", &optarg)
1448
3/10
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 479 times.
✗ Branch 12 not taken.
958 && options_mgr_->IsOn(optarg)) {
1449 download_mgr_->ShardProxies();
1450 }
1451
1452 // configure http tracing header
1453
3/10
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 479 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 479 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
958 if (options_mgr_->GetValue("CVMFS_HTTP_TRACING", &optarg)
1454
3/10
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 479 times.
✗ Branch 12 not taken.
958 && options_mgr_->IsOn(optarg)) {
1455 download_mgr_->EnableHTTPTracing();
1456 if (options_mgr_->GetValue("CVMFS_HTTP_TRACING_HEADERS", &optarg)) {
1457 if (optarg.size() > 1000) {
1458 LogCvmfs(kLogCvmfs, kLogSyslogErr | kLogDebug,
1459 "CVMFS_HTTP_TRACING_HEADERS too large ( max 1000 chars, given "
1460 "%ld )",
1461 optarg.size());
1462 } else {
1463 std::vector<std::string> tokens = SplitString(optarg, '|');
1464 const sanitizer::AlphaNumSanitizer sanitizer;
1465
1466 for (unsigned int i = 0; i < tokens.size(); i++) {
1467 const std::string token = Trim(tokens[i]);
1468
1469 std::vector<std::string> key_val = SplitString(token, ':');
1470
1471 if (key_val.size() != 2) {
1472 LogCvmfs(kLogCvmfs, kLogSyslogErr | kLogDebug,
1473 "Http tracing header: Skipping current token part of "
1474 "CVMFS_HTTP_TRACING_HEADERS! Invalid "
1475 "<key:value> pair. Token: %s",
1476 token.c_str());
1477 continue;
1478 }
1479
1480 const std::string prefix = "X-CVMFS-";
1481 const std::string key = Trim(key_val[0]);
1482
1483 if (!sanitizer.IsValid(key)) {
1484 LogCvmfs(kLogCvmfs, kLogSyslogErr | kLogDebug,
1485 "Http tracing header: Skipping current token part of "
1486 "CVMFS_HTTP_TRACING_HEADERS! Invalid key. Only "
1487 "alphanumeric keys "
1488 "are allowed (a-z, A-Z, 0-9). Token: %s",
1489 token.c_str());
1490 continue;
1491 }
1492
1493 const std::string final_token = prefix + key + ": "
1494 + Trim(key_val[1]);
1495
1496 download_mgr_->AddHTTPTracingHeader(final_token);
1497 }
1498 }
1499 }
1500 }
1501
1502
1/2
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
479 return SetupExternalDownloadMgr(do_geosort);
1503 522 }
1504
1505 479 bool MountPoint::CreateResolvConfWatcher() {
1506 479 std::string roaming_value;
1507
2/4
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
479 options_mgr_->GetValue("CVMFS_DNS_ROAMING", &roaming_value);
1508
3/10
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 479 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 479 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
958 if (options_mgr_->IsDefined("CVMFS_DNS_ROAMING")
1509
3/10
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 479 times.
✗ Branch 12 not taken.
958 && options_mgr_->IsOn(roaming_value)) {
1510 LogCvmfs(kLogCvmfs, kLogDebug,
1511 "DNS roaming is enabled for this repository.");
1512 // Create a file watcher to update the DNS settings of the download
1513 // managers when there are changes to /etc/resolv.conf
1514 resolv_conf_watcher_ = file_watcher::FileWatcher::Create();
1515
1516 if (resolv_conf_watcher_) {
1517 ResolvConfEventHandler *handler = new ResolvConfEventHandler(
1518 download_mgr_, external_download_mgr_);
1519 resolv_conf_watcher_->RegisterHandler("/etc/resolv.conf", handler);
1520 }
1521 } else {
1522
1/2
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
479 LogCvmfs(kLogCvmfs, kLogDebug,
1523 "DNS roaming is disabled for this repository.");
1524 }
1525 479 return true;
1526 479 }
1527
1528 479 void MountPoint::CreateFetchers() {
1529 479 fetcher_ = new cvmfs::Fetcher(file_system_->cache_mgr(),
1530 download_mgr_,
1531 backoff_throttle_,
1532
4/8
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 479 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 479 times.
✗ Branch 12 not taken.
479 perf::StatisticsTemplate("fetch", statistics_));
1533
1534 958 external_fetcher_ = new cvmfs::Fetcher(
1535 479 file_system_->cache_mgr(),
1536 external_download_mgr_,
1537 backoff_throttle_,
1538
4/8
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 479 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 479 times.
✗ Branch 12 not taken.
479 perf::StatisticsTemplate("fetch-external", statistics_));
1539 479 }
1540
1541
1542 529 bool MountPoint::CreateSignatureManager() {
1543 529 string optarg;
1544
2/4
✓ Branch 1 taken 529 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 529 times.
✗ Branch 5 not taken.
529 signature_mgr_ = new signature::SignatureManager();
1545
1/2
✓ Branch 1 taken 529 times.
✗ Branch 2 not taken.
529 signature_mgr_->Init();
1546
1547 529 string public_keys;
1548
4/6
✓ Branch 2 taken 529 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 529 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 439 times.
✓ Branch 10 taken 90 times.
529 if (options_mgr_->GetValue("CVMFS_PUBLIC_KEY", &optarg)) {
1549
1/2
✓ Branch 1 taken 439 times.
✗ Branch 2 not taken.
439 public_keys = optarg;
1550
3/6
✓ Branch 2 taken 90 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 90 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 90 times.
90 } else if (options_mgr_->GetValue("CVMFS_KEYS_DIR", &optarg)) {
1551 // Collect .pub files from CVMFS_KEYS_DIR
1552 public_keys = JoinStrings(FindFilesBySuffix(optarg, ".pub"), ":");
1553 } else {
1554
5/10
✓ Branch 2 taken 90 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 90 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 90 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 90 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 90 times.
✗ Branch 17 not taken.
180 public_keys = JoinStrings(FindFilesBySuffix("/etc/cvmfs/keys", ".pub"),
1555 90 ":");
1556 }
1557
1558
3/4
✓ Branch 1 taken 529 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 522 times.
529 if (!signature_mgr_->LoadPublicRsaKeys(public_keys)) {
1559
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 boot_error_ = "failed to load public key(s)";
1560 7 boot_status_ = loader::kFailSignature;
1561 7 return false;
1562 }
1563
1564
2/2
✓ Branch 1 taken 432 times.
✓ Branch 2 taken 90 times.
522 if (public_keys.size() > 0) {
1565
1/2
✓ Branch 2 taken 432 times.
✗ Branch 3 not taken.
432 LogCvmfs(kLogCvmfs, kLogDebug, "CernVM-FS: using public key(s) %s",
1566 public_keys.c_str());
1567 } else {
1568
1/2
✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
90 LogCvmfs(kLogCvmfs, kLogDebug | kLogSyslogWarn, "no public key loaded");
1569 }
1570
1571 522 return true;
1572 529 }
1573
1574
1575 529 void MountPoint::CreateStatistics() {
1576 529 statistics_ = file_system_->statistics()->Fork();
1577
2/2
✓ Branch 1 taken 219 times.
✓ Branch 2 taken 310 times.
529 if (file_system_->type() != FileSystem::kFsFuse)
1578 219 return;
1579
1580 // TODO(jblomer): this should be registered by the tracker
1581
3/6
✓ Branch 2 taken 310 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 310 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 310 times.
✗ Branch 10 not taken.
310 statistics_->Register("inode_tracker.n_insert",
1582 "overall number of accessed inodes");
1583
3/6
✓ Branch 2 taken 310 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 310 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 310 times.
✗ Branch 10 not taken.
310 statistics_->Register("inode_tracker.n_remove",
1584 "overall number of evicted inodes");
1585
3/6
✓ Branch 2 taken 310 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 310 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 310 times.
✗ Branch 10 not taken.
310 statistics_->Register("inode_tracker.no_reference",
1586 "currently active inodes");
1587
3/6
✓ Branch 2 taken 310 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 310 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 310 times.
✗ Branch 10 not taken.
310 statistics_->Register("inode_tracker.n_hit_inode",
1588 "overall number of inode lookups");
1589
3/6
✓ Branch 2 taken 310 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 310 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 310 times.
✗ Branch 10 not taken.
310 statistics_->Register("inode_tracker.n_hit_path",
1590 "overall number of successful path lookups");
1591
3/6
✓ Branch 2 taken 310 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 310 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 310 times.
✗ Branch 10 not taken.
310 statistics_->Register("inode_tracker.n_miss_path",
1592 "overall number of unsuccessful path lookups");
1593
1594
3/6
✓ Branch 2 taken 310 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 310 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 310 times.
✗ Branch 10 not taken.
310 statistics_->Register("dentry_tracker.n_insert",
1595 "overall number of added negative cache entries");
1596
3/6
✓ Branch 2 taken 310 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 310 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 310 times.
✗ Branch 10 not taken.
310 statistics_->Register("dentry_tracker.n_remove",
1597 "overall number of evicted negative cache entries");
1598
3/6
✓ Branch 2 taken 310 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 310 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 310 times.
✗ Branch 10 not taken.
310 statistics_->Register("dentry_tracker.n_prune",
1599 "overall number of prune calls");
1600
1601
3/6
✓ Branch 2 taken 310 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 310 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 310 times.
✗ Branch 10 not taken.
310 statistics_->Register("page_cache_tracker.n_insert",
1602 "overall number of added page cache entries");
1603
3/6
✓ Branch 2 taken 310 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 310 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 310 times.
✗ Branch 10 not taken.
310 statistics_->Register("page_cache_tracker.n_remove",
1604 "overall number of evicted page cache entries");
1605
3/6
✓ Branch 2 taken 310 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 310 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 310 times.
✗ Branch 10 not taken.
310 statistics_->Register("page_cache_tracker.n_open_direct",
1606 "overall number of direct I/O open calls");
1607
3/6
✓ Branch 2 taken 310 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 310 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 310 times.
✗ Branch 10 not taken.
310 statistics_->Register(
1608 "page_cache_tracker.n_open_flush",
1609 "overall number of open calls where the file's page cache gets flushed");
1610
3/6
✓ Branch 2 taken 310 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 310 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 310 times.
✗ Branch 10 not taken.
310 statistics_->Register(
1611 "page_cache_tracker.n_open_cached",
1612 "overall number of open calls where the file's page cache is reused");
1613 }
1614
1615
1616 376 void MountPoint::CreateTables() {
1617
2/2
✓ Branch 1 taken 165 times.
✓ Branch 2 taken 211 times.
376 if (file_system_->type() != FileSystem::kFsFuse) {
1618 // Libcvmfs simplified tables
1619
2/4
✓ Branch 1 taken 165 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 165 times.
✗ Branch 5 not taken.
165 md5path_cache_ = new lru::Md5PathCache(kLibPathCacheSize, statistics_);
1620
2/4
✓ Branch 1 taken 165 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 165 times.
✗ Branch 5 not taken.
165 simple_chunk_tables_ = new SimpleChunkTables();
1621 165 return;
1622 }
1623
1624
2/4
✓ Branch 1 taken 211 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 211 times.
✗ Branch 5 not taken.
211 chunk_tables_ = new ChunkTables();
1625
1626 211 string optarg;
1627 211 uint64_t mem_cache_size = kDefaultMemcacheSize;
1628
3/6
✓ Branch 2 taken 211 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 211 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 211 times.
211 if (options_mgr_->GetValue("CVMFS_MEMCACHE_SIZE", &optarg))
1629 mem_cache_size = String2Uint64(optarg) * 1024 * 1024;
1630
1631 const double memcache_unit_size = (static_cast<double>(kInodeCacheFactor)
1632
1/2
✓ Branch 1 taken 211 times.
✗ Branch 2 not taken.
211 * lru::Md5PathCache::GetEntrySize())
1633
1/2
✓ Branch 1 taken 211 times.
✗ Branch 2 not taken.
211 + lru::InodeCache::GetEntrySize()
1634
1/2
✓ Branch 1 taken 211 times.
✗ Branch 2 not taken.
211 + lru::PathCache::GetEntrySize();
1635 211 const unsigned memcache_num_units = mem_cache_size
1636 211 / static_cast<unsigned>(
1637 memcache_unit_size);
1638 // Number of cache entries must be a multiple of 64
1639 211 const unsigned mask_64 = ~((1 << 6) - 1);
1640
2/4
✓ Branch 1 taken 211 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 211 times.
✗ Branch 5 not taken.
211 inode_cache_ = new lru::InodeCache(memcache_num_units & mask_64, statistics_);
1641
2/4
✓ Branch 1 taken 211 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 211 times.
✗ Branch 5 not taken.
211 path_cache_ = new lru::PathCache(memcache_num_units & mask_64, statistics_);
1642 422 md5path_cache_ = new lru::Md5PathCache((memcache_num_units * 7) & mask_64,
1643
2/4
✓ Branch 1 taken 211 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 211 times.
✗ Branch 5 not taken.
211 statistics_);
1644
1645
2/4
✓ Branch 1 taken 211 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 211 times.
✗ Branch 5 not taken.
211 inode_tracker_ = new glue::InodeTracker();
1646
2/4
✓ Branch 1 taken 211 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 211 times.
✗ Branch 5 not taken.
211 dentry_tracker_ = new glue::DentryTracker();
1647
2/4
✓ Branch 1 taken 211 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 211 times.
✗ Branch 5 not taken.
211 page_cache_tracker_ = new glue::PageCacheTracker();
1648
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 211 times.
211 if (file_system_->IsNfsSource())
1649 page_cache_tracker_->Disable();
1650 211 }
1651
1652 /**
1653 * Will create a tracer for the current mount point
1654 * Tracefile path, Trace buffer size and trace buffer flush threshold
1655 * can be configured by the options: CVMFS_TRACEFILE,
1656 * CVMFS_TRACEBUFFER, CVMFS_TRACEBUFFER_THRESHOLD(respectively)
1657 * VMFS_TRACEBUFFER and CVMFS_TRACEBUFFER_THRESHOLD will silently fallback
1658 * to default values if configuration values don't exist or are invalid
1659 */
1660 376 bool MountPoint::CreateTracer() {
1661 376 string optarg;
1662
2/4
✓ Branch 1 taken 376 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 376 times.
✗ Branch 5 not taken.
376 tracer_ = new Tracer();
1663
3/6
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 376 times.
376 if (options_mgr_->GetValue("CVMFS_TRACEFILE", &optarg)) {
1664 if (file_system_->type() != FileSystem::kFsFuse) {
1665 boot_error_ = "tracer is only supported in the fuse module";
1666 boot_status_ = loader::kFailOptions;
1667 return false;
1668 }
1669 const string tracebuffer_file = optarg;
1670 uint64_t tracebuffer_size = kTracerBufferSize;
1671 uint64_t tracebuffer_threshold = kTracerFlushThreshold;
1672
1673 if (options_mgr_->GetValue("CVMFS_TRACEBUFFER", &optarg)) {
1674 tracebuffer_size = String2Uint64(optarg);
1675 }
1676 if (options_mgr_->GetValue("CVMFS_TRACEBUFFER_THRESHOLD", &optarg)) {
1677 tracebuffer_threshold = String2Uint64(optarg);
1678 }
1679 assert(tracebuffer_size <= INT_MAX && tracebuffer_threshold <= INT_MAX);
1680 LogCvmfs(kLogCvmfs, kLogDebug,
1681 "Initialising tracer with buffer size %" PRIu64
1682 " and threshold %" PRIu64,
1683 tracebuffer_size, tracebuffer_threshold);
1684 tracer_->Activate(tracebuffer_size, tracebuffer_threshold,
1685 tracebuffer_file);
1686 }
1687 376 return true;
1688 376 }
1689
1690
1691 472 bool MountPoint::DetermineRootHash(shash::Any *root_hash) {
1692 472 string optarg;
1693
4/6
✓ Branch 2 taken 472 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 472 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 213 times.
✓ Branch 10 taken 259 times.
472 if (options_mgr_->GetValue("CVMFS_ROOT_HASH", &optarg)) {
1694
1/2
✓ Branch 2 taken 213 times.
✗ Branch 3 not taken.
213 *root_hash = MkFromHexPtr(shash::HexPtr(optarg), shash::kSuffixCatalog);
1695 213 return true;
1696 }
1697
1698
4/10
✓ Branch 1 taken 259 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 259 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 231 times.
✓ Branch 8 taken 28 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
518 if (!options_mgr_->IsDefined("CVMFS_REPOSITORY_TAG")
1699
12/20
✓ Branch 2 taken 259 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 245 times.
✓ Branch 5 taken 14 times.
✓ Branch 8 taken 245 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 245 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 231 times.
✓ Branch 14 taken 14 times.
✓ Branch 15 taken 245 times.
✓ Branch 16 taken 14 times.
✓ Branch 18 taken 245 times.
✓ Branch 19 taken 14 times.
✓ Branch 21 taken 259 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
518 && !options_mgr_->IsDefined("CVMFS_REPOSITORY_DATE")) {
1700 231 root_hash->SetNull();
1701 231 return true;
1702 }
1703
1704 28 string history_path;
1705
2/4
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 28 times.
28 if (!FetchHistory(&history_path))
1706 return false;
1707
1/2
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
28 const UnlinkGuard history_file(history_path);
1708 const UniquePtr<history::History> tag_db(
1709
2/4
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 28 times.
✗ Branch 5 not taken.
28 history::SqliteHistory::Open(history_path));
1710
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 28 times.
28 if (!tag_db.IsValid()) {
1711 LogCvmfs(kLogCvmfs, kLogDebug | kLogSyslog,
1712 "failed to open history database (%s)", history_path.c_str());
1713 boot_error_ = "failed to open history database";
1714 boot_status_ = loader::kFailHistory;
1715 return false;
1716 }
1717
1718
1/2
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
28 history::History::Tag tag;
1719 bool retval;
1720
4/6
✓ Branch 2 taken 28 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 28 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 14 times.
✓ Branch 10 taken 14 times.
28 if (!options_mgr_->GetValue("CVMFS_REPOSITORY_TAG", &repository_tag_)) {
1721 14 string repository_date;
1722 // options_mgr_->IsDefined("CVMFS_REPOSITORY_DATE") must be true
1723
2/4
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 14 times.
✗ Branch 6 not taken.
14 options_mgr_->GetValue("CVMFS_REPOSITORY_DATE", &repository_date);
1724
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 const time_t repository_utctime = IsoTimestamp2UtcTime(repository_date);
1725
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 if (repository_utctime == 0) {
1726 boot_error_ = "invalid timestamp in CVMFS_REPOSITORY_DATE: "
1727 + repository_date + ". Use YYYY-MM-DDTHH:MM:SSZ";
1728 boot_status_ = loader::kFailHistory;
1729 return false;
1730 }
1731
1/2
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
14 retval = tag_db->GetByDate(repository_utctime, &tag);
1732
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 7 times.
14 if (!retval) {
1733 boot_error_ = "no repository state as early as utc timestamp "
1734
2/4
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
7 + StringifyTime(repository_utctime, true);
1735 7 boot_status_ = loader::kFailHistory;
1736 7 return false;
1737 }
1738
1/5
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
14 LogCvmfs(kLogCvmfs, kLogDebug | kLogSyslog,
1739 "time stamp %s UTC resolved to tag '%s'",
1740
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
14 StringifyTime(repository_utctime, true).c_str(), tag.name.c_str());
1741
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 repository_tag_ = tag.name;
1742
2/2
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 7 times.
14 } else {
1743
1/2
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
14 retval = tag_db->GetByName(repository_tag_, &tag);
1744
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 7 times.
14 if (!retval) {
1745
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 boot_error_ = "no such tag: " + repository_tag_;
1746 7 boot_status_ = loader::kFailHistory;
1747 7 return false;
1748 }
1749 }
1750
1/2
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
14 LogCvmfs(kLogCvmfs, kLogDebug, "mounting tag %s", tag.name.c_str());
1751
1752 14 *root_hash = tag.root_hash;
1753 14 return true;
1754 472 }
1755
1756
1757 28 bool MountPoint::FetchHistory(std::string *history_path) {
1758 manifest::Failures retval_mf;
1759 28 manifest::ManifestEnsemble ensemble;
1760
2/4
✓ Branch 2 taken 28 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 28 times.
✗ Branch 6 not taken.
28 retval_mf = manifest::Fetch("", fqrn_, 0, NULL, signature_mgr_, download_mgr_,
1761 &ensemble);
1762
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 28 times.
28 if (retval_mf != manifest::kFailOk) {
1763 boot_error_ = "Failed to fetch manifest";
1764 boot_status_ = loader::kFailHistory;
1765 return false;
1766 }
1767 28 const shash::Any history_hash = ensemble.manifest->history();
1768
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 28 times.
28 if (history_hash.IsNull()) {
1769 boot_error_ = "No history";
1770 boot_status_ = loader::kFailHistory;
1771 return false;
1772 }
1773
1774 28 CacheManager::Label label;
1775 28 label.flags = CacheManager::kLabelHistory;
1776
1/2
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
28 label.path = fqrn_;
1777
2/4
✓ Branch 2 taken 28 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 28 times.
✗ Branch 6 not taken.
84 const int fd = fetcher_->Fetch(
1778
1/2
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
56 CacheManager::LabeledObject(history_hash, label));
1779
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 28 times.
28 if (fd < 0) {
1780 boot_error_ = "failed to download history: " + StringifyInt(-fd);
1781 boot_status_ = loader::kFailHistory;
1782 return false;
1783 }
1784 // We have the custom sqlite vfs driver installed
1785
2/4
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 28 times.
✗ Branch 5 not taken.
28 *history_path = "@" + StringifyInt(fd);
1786 28 return true;
1787 28 }
1788
1789
1790 unsigned MountPoint::GetEffectiveTtlSec() {
1791 unsigned max_ttl;
1792 {
1793 const MutexLockGuard lock_guard(lock_max_ttl_);
1794 max_ttl = max_ttl_sec_;
1795 }
1796 const unsigned catalog_ttl_sec = catalog_mgr_->GetTTL();
1797
1798 return max_ttl ? std::min(max_ttl, catalog_ttl_sec) : catalog_ttl_sec;
1799 }
1800
1801
1802 unsigned MountPoint::GetMaxTtlMn() {
1803 const MutexLockGuard lock_guard(lock_max_ttl_);
1804 return max_ttl_sec_ / 60;
1805 }
1806
1807
1808 /**
1809 * Files in the workspace from different file systems / mountpoints need to
1810 * have different names. Used, for example, for caching proxy settings.
1811 */
1812 522 string MountPoint::GetUniqFileSuffix() {
1813
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 522 times.
✗ Branch 9 not taken.
1044 return "." + file_system_->name() + "-" + fqrn_;
1814 }
1815
1816
1817 529 MountPoint::MountPoint(const string &fqrn,
1818 FileSystem *file_system,
1819 529 OptionsManager *options_mgr)
1820
1/2
✓ Branch 1 taken 529 times.
✗ Branch 2 not taken.
529 : fqrn_(fqrn)
1821
2/4
✓ Branch 2 taken 529 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 529 times.
✗ Branch 6 not taken.
529 , uuid_(cvmfs::Uuid::Create(""))
1822 529 , file_system_(file_system)
1823 529 , options_mgr_(options_mgr)
1824 529 , statistics_(NULL)
1825 529 , telemetry_aggr_(NULL)
1826 529 , authz_fetcher_(NULL)
1827 529 , authz_session_mgr_(NULL)
1828 529 , authz_attachment_(NULL)
1829 529 , backoff_throttle_(NULL)
1830 529 , signature_mgr_(NULL)
1831 529 , download_mgr_(NULL)
1832 529 , external_download_mgr_(NULL)
1833 529 , fetcher_(NULL)
1834 529 , external_fetcher_(NULL)
1835 529 , inode_annotation_(NULL)
1836 529 , catalog_mgr_(NULL)
1837 529 , chunk_tables_(NULL)
1838 529 , simple_chunk_tables_(NULL)
1839 529 , inode_cache_(NULL)
1840 529 , path_cache_(NULL)
1841 529 , md5path_cache_(NULL)
1842 529 , tracer_(NULL)
1843 529 , inode_tracker_(NULL)
1844 529 , dentry_tracker_(NULL)
1845 529 , page_cache_tracker_(NULL)
1846 529 , statfs_cache_(NULL)
1847 529 , resolv_conf_watcher_(NULL)
1848 529 , max_ttl_sec_(kDefaultMaxTtlSec)
1849 529 , kcache_timeout_sec_(static_cast<double>(kDefaultKCacheTtlSec))
1850 529 , fixed_catalog_(false)
1851 529 , enforce_acls_(false)
1852 529 , cache_symlinks_(false)
1853 529 , fuse_expire_entry_(false)
1854 529 , has_membership_req_(false)
1855
2/4
✓ Branch 2 taken 529 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 529 times.
✗ Branch 6 not taken.
529 , talk_socket_path_(std::string("./cvmfs_io.") + fqrn)
1856 529 , talk_socket_uid_(0)
1857 1058 , talk_socket_gid_(0) {
1858 529 const int retval = pthread_mutex_init(&lock_max_ttl_, NULL);
1859
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 529 times.
529 assert(retval == 0);
1860 529 }
1861
1862
1863 529 MountPoint::~MountPoint() {
1864 529 pthread_mutex_destroy(&lock_max_ttl_);
1865
1866
2/2
✓ Branch 0 taken 211 times.
✓ Branch 1 taken 318 times.
529 delete page_cache_tracker_;
1867
2/2
✓ Branch 0 taken 211 times.
✓ Branch 1 taken 318 times.
529 delete dentry_tracker_;
1868
2/2
✓ Branch 0 taken 211 times.
✓ Branch 1 taken 318 times.
529 delete inode_tracker_;
1869
2/2
✓ Branch 0 taken 376 times.
✓ Branch 1 taken 153 times.
529 delete tracer_;
1870
2/2
✓ Branch 0 taken 376 times.
✓ Branch 1 taken 153 times.
529 delete md5path_cache_;
1871
2/2
✓ Branch 0 taken 211 times.
✓ Branch 1 taken 318 times.
529 delete path_cache_;
1872
2/2
✓ Branch 0 taken 211 times.
✓ Branch 1 taken 318 times.
529 delete inode_cache_;
1873
2/2
✓ Branch 0 taken 165 times.
✓ Branch 1 taken 364 times.
529 delete simple_chunk_tables_;
1874
2/2
✓ Branch 0 taken 211 times.
✓ Branch 1 taken 318 times.
529 delete chunk_tables_;
1875
1876
2/2
✓ Branch 0 taken 479 times.
✓ Branch 1 taken 50 times.
529 delete catalog_mgr_;
1877
2/2
✓ Branch 0 taken 479 times.
✓ Branch 1 taken 50 times.
529 delete inode_annotation_;
1878
2/2
✓ Branch 0 taken 479 times.
✓ Branch 1 taken 50 times.
529 delete external_fetcher_;
1879
2/2
✓ Branch 0 taken 479 times.
✓ Branch 1 taken 50 times.
529 delete fetcher_;
1880
1881
2/2
✓ Branch 0 taken 479 times.
✓ Branch 1 taken 50 times.
529 delete external_download_mgr_;
1882
2/2
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 7 times.
529 delete download_mgr_;
1883
1884
1/2
✓ Branch 0 taken 529 times.
✗ Branch 1 not taken.
529 if (signature_mgr_ != NULL) {
1885 529 signature_mgr_->Fini();
1886
1/2
✓ Branch 0 taken 529 times.
✗ Branch 1 not taken.
529 delete signature_mgr_;
1887 }
1888
1889
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 529 times.
529 if (resolv_conf_watcher_ != NULL) {
1890 resolv_conf_watcher_->Stop();
1891 delete resolv_conf_watcher_;
1892 }
1893
1894
1/2
✓ Branch 0 taken 529 times.
✗ Branch 1 not taken.
529 delete backoff_throttle_;
1895
1/2
✓ Branch 0 taken 529 times.
✗ Branch 1 not taken.
529 delete authz_attachment_;
1896
1/2
✓ Branch 0 taken 529 times.
✗ Branch 1 not taken.
529 delete authz_session_mgr_;
1897
1/2
✓ Branch 0 taken 529 times.
✗ Branch 1 not taken.
529 delete authz_fetcher_;
1898
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 529 times.
529 delete telemetry_aggr_;
1899
1/2
✓ Branch 0 taken 529 times.
✗ Branch 1 not taken.
529 delete statistics_;
1900
1/2
✓ Branch 0 taken 529 times.
✗ Branch 1 not taken.
529 delete uuid_;
1901
1902
2/2
✓ Branch 0 taken 376 times.
✓ Branch 1 taken 153 times.
529 delete statfs_cache_;
1903 529 }
1904
1905
1906 378 void MountPoint::ReEvaluateAuthz() {
1907
1/2
✓ Branch 1 taken 378 times.
✗ Branch 2 not taken.
378 const string old_membership_req = membership_req_;
1908
1/2
✓ Branch 1 taken 378 times.
✗ Branch 2 not taken.
378 has_membership_req_ = catalog_mgr_->GetVOMSAuthz(&membership_req_);
1909
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 378 times.
378 if (old_membership_req != membership_req_) {
1910 authz_session_mgr_->ClearSessionCache();
1911 authz_attachment_->set_membership(membership_req_);
1912 }
1913 378 }
1914
1915
1916 void MountPoint::SetMaxTtlMn(unsigned value_minutes) {
1917 const MutexLockGuard lock_guard(lock_max_ttl_);
1918 max_ttl_sec_ = value_minutes * 60;
1919 }
1920
1921 void MountPoint::SetMaxTtlSec(unsigned value_secs) {
1922 const MutexLockGuard lock_guard(lock_max_ttl_);
1923 max_ttl_sec_ = value_secs;
1924 }
1925
1926 376 bool MountPoint::SetupBehavior() {
1927 376 string optarg;
1928
1929
3/6
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 376 times.
376 if (options_mgr_->GetValue("CVMFS_MAX_TTL", &optarg))
1930 SetMaxTtlMn(String2Uint64(optarg));
1931
3/6
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 376 times.
376 if (options_mgr_->GetValue("CVMFS_MAX_TTL_SECS", &optarg))
1932 SetMaxTtlSec(String2Uint64(optarg));
1933
1934
3/6
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 376 times.
376 if (options_mgr_->GetValue("CVMFS_KCACHE_TIMEOUT", &optarg)) {
1935 // Can be negative and should then be interpreted as 0.0
1936 kcache_timeout_sec_ = std::max(0.0,
1937 static_cast<double>(String2Int64(optarg)));
1938 }
1939 376 LogCvmfs(kLogCvmfs, kLogDebug, "kernel caches expire after %d seconds",
1940
1/2
✓ Branch 1 taken 376 times.
✗ Branch 2 not taken.
376 static_cast<int>(kcache_timeout_sec_));
1941
1942 376 uint64_t statfs_time_cache_valid = 0;
1943
3/6
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 376 times.
376 if (options_mgr_->GetValue("CVMFS_STATFS_CACHE_TIMEOUT", &optarg)) {
1944 statfs_time_cache_valid = static_cast<uint64_t>(String2Uint64(optarg));
1945 }
1946
1/2
✓ Branch 1 taken 376 times.
✗ Branch 2 not taken.
376 LogCvmfs(kLogCvmfs, kLogDebug, "statfs cache expires after %d seconds",
1947 static_cast<int>(statfs_time_cache_valid));
1948
1/2
✓ Branch 1 taken 376 times.
✗ Branch 2 not taken.
376 statfs_cache_ = new StatfsCache(statfs_time_cache_valid);
1949
1950 MagicXattrManager::EVisibility
1951 376 xattr_visibility = MagicXattrManager::kVisibilityRootOnly;
1952
3/6
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 376 times.
376 if (options_mgr_->GetValue("CVMFS_HIDE_MAGIC_XATTRS", &optarg)) {
1953 if (options_mgr_->IsOn(optarg))
1954 xattr_visibility = MagicXattrManager::kVisibilityNever;
1955 else if (options_mgr_->IsOff(optarg))
1956 xattr_visibility = MagicXattrManager::kVisibilityAlways;
1957 }
1958
3/6
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 376 times.
376 if (options_mgr_->GetValue("CVMFS_MAGIC_XATTRS_VISIBILITY", &optarg)) {
1959 if (ToUpper(optarg) == "ROOTONLY") {
1960 xattr_visibility = MagicXattrManager::kVisibilityRootOnly;
1961 } else if (ToUpper(optarg) == "NEVER") {
1962 xattr_visibility = MagicXattrManager::kVisibilityNever;
1963 } else if (ToUpper(optarg) == "ALWAYS") {
1964 xattr_visibility = MagicXattrManager::kVisibilityAlways;
1965 } else {
1966 LogCvmfs(kLogCvmfs, kLogSyslogWarn | kLogDebug,
1967 "unsupported setting: CVMFS_MAGIC_XATTRS_VISIBILITY=%s",
1968 optarg.c_str());
1969 }
1970 }
1971
1972 376 std::set<gid_t> protected_xattr_gids;
1973
3/6
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 376 times.
376 if (options_mgr_->GetValue("CVMFS_XATTR_PRIVILEGED_GIDS", &optarg)) {
1974 std::vector<string> tmp = SplitString(optarg, ',');
1975
1976 for (size_t i = 0; i < tmp.size(); i++) {
1977 const std::string trimmed = Trim(tmp[i]);
1978 LogCvmfs(kLogCvmfs, kLogDebug, "Privileged gid for xattr added: %s",
1979 trimmed.c_str());
1980 protected_xattr_gids.insert(static_cast<gid_t>(String2Uint64(trimmed)));
1981 }
1982 }
1983 376 std::set<std::string> protected_xattrs;
1984
3/6
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 376 times.
376 if (options_mgr_->GetValue("CVMFS_XATTR_PROTECTED_XATTRS", &optarg)) {
1985 std::vector<string> tmp = SplitString(optarg, ',');
1986
1987 for (size_t i = 0; i < tmp.size(); i++) {
1988 const std::string trimmed = Trim(tmp[i]);
1989 LogCvmfs(kLogCvmfs, kLogDebug, "Protected xattr added: %s",
1990 trimmed.c_str());
1991 protected_xattrs.insert(trimmed);
1992 }
1993
1994 // root has always access to xattr
1995 if (protected_xattr_gids.count(0) < 1) {
1996 protected_xattr_gids.insert(0);
1997 LogCvmfs(kLogCvmfs, kLogDebug,
1998 "Automatically added root to have access to protected xattrs.");
1999 }
2000 }
2001 376 magic_xattr_mgr_ = new MagicXattrManager(
2002
2/4
✓ Branch 1 taken 376 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 376 times.
✗ Branch 5 not taken.
376 this, xattr_visibility, protected_xattrs, protected_xattr_gids);
2003
2004
2005
3/10
✓ Branch 1 taken 376 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 376 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 376 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
752 if (options_mgr_->GetValue("CVMFS_ENFORCE_ACLS", &optarg)
2006
3/10
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 376 times.
✗ Branch 12 not taken.
752 && options_mgr_->IsOn(optarg)) {
2007 enforce_acls_ = true;
2008 }
2009
2010
3/10
✓ Branch 1 taken 376 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 376 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 376 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
752 if (options_mgr_->GetValue("CVMFS_CACHE_SYMLINKS", &optarg)
2011
3/10
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 376 times.
✗ Branch 12 not taken.
752 && options_mgr_->IsOn(optarg)) {
2012 cache_symlinks_ = true;
2013 }
2014
2015
2016
3/6
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 376 times.
376 if (options_mgr_->GetValue("CVMFS_TALK_SOCKET", &optarg)) {
2017 talk_socket_path_ = optarg;
2018 }
2019
3/6
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 376 times.
376 if (options_mgr_->GetValue("CVMFS_TALK_OWNER", &optarg)) {
2020 const bool retval = GetUidOf(optarg, &talk_socket_uid_, &talk_socket_gid_);
2021 if (!retval) {
2022 boot_error_ = "unknown owner of cvmfs_talk socket: " + optarg;
2023 boot_status_ = loader::kFailOptions;
2024 return false;
2025 }
2026 }
2027
2028 // this can be later be changed to switch through different
2029 // telemetryAggregators
2030
3/10
✓ Branch 1 taken 376 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 376 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 376 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
752 if (options_mgr_->GetValue("CVMFS_TELEMETRY_SEND", &optarg)
2031
3/10
✓ Branch 2 taken 376 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 376 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 376 times.
✗ Branch 12 not taken.
752 && options_mgr_->IsOn(optarg)) {
2032 int telemetry_send_rate_sec = kDefaultTelemetrySendRateSec;
2033 if (options_mgr_->GetValue("CVMFS_TELEMETRY_RATE", &optarg)) {
2034 telemetry_send_rate_sec = static_cast<int>(String2Uint64(optarg));
2035
2036 // minimum send rate: 5sec
2037 if (telemetry_send_rate_sec < kMinimumTelemetrySendRateSec) {
2038 telemetry_send_rate_sec = kMinimumTelemetrySendRateSec;
2039 }
2040
2041 telemetry_aggr_ = perf::TelemetryAggregator::Create(
2042 statistics_,
2043 telemetry_send_rate_sec,
2044 options_mgr_,
2045 this,
2046 fqrn_,
2047 perf::kTelemetryInflux);
2048 LogCvmfs(kLogTelemetry, kLogSyslog | kLogDebug,
2049 "Enable telemetry to report every %d seconds",
2050 telemetry_send_rate_sec);
2051 }
2052 }
2053
2054 376 return true;
2055 376 }
2056
2057
2058 /**
2059 * Called twice once for the regular download manager and once for the external
2060 * download manager.
2061 */
2062 522 void MountPoint::SetupDnsTuning(download::DownloadManager *manager) {
2063 522 string optarg;
2064 522 unsigned dns_timeout_ms = download::DownloadManager::kDnsDefaultTimeoutMs;
2065 522 unsigned dns_retries = download::DownloadManager::kDnsDefaultRetries;
2066
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_DNS_TIMEOUT", &optarg))
2067 dns_timeout_ms = String2Uint64(optarg) * 1000;
2068
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_DNS_RETRIES", &optarg))
2069 dns_retries = String2Uint64(optarg);
2070
1/2
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
522 manager->SetDnsParameters(dns_retries, dns_timeout_ms);
2071
2072 // Rest has to be after SetDnsParameters because SetDnsParameters might
2073 // construct a new resolver object
2074
2075 522 unsigned dns_min_ttl = dns::Resolver::kDefaultMinTtl;
2076 522 unsigned dns_max_ttl = dns::Resolver::kDefaultMaxTtl;
2077
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_DNS_MIN_TTL", &optarg))
2078 dns_min_ttl = String2Uint64(optarg);
2079
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_DNS_MAX_TTL", &optarg))
2080 dns_max_ttl = String2Uint64(optarg);
2081
1/2
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
522 manager->SetDnsTtlLimits(dns_min_ttl, dns_max_ttl);
2082
2083
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_DNS_SERVER", &optarg)) {
2084 download_mgr_->SetDnsServer(optarg);
2085 }
2086
2087
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_IPFAMILY_PREFER", &optarg)) {
2088 switch (String2Int64(optarg)) {
2089 case 4:
2090 manager->SetIpPreference(dns::kIpPreferV4);
2091 break;
2092 case 6:
2093 manager->SetIpPreference(dns::kIpPreferV6);
2094 break;
2095 }
2096 }
2097
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_MAX_IPADDR_PER_PROXY", &optarg))
2098 manager->SetMaxIpaddrPerProxy(String2Uint64(optarg));
2099 522 }
2100
2101
2102 479 bool MountPoint::SetupExternalDownloadMgr(bool dogeosort) {
2103 479 string optarg;
2104
2/4
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
1437 external_download_mgr_ = download_mgr_->Clone(
2105
2/4
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
958 perf::StatisticsTemplate("download-external", statistics_), "external");
2106
2107 unsigned timeout;
2108 unsigned timeout_direct;
2109
1/2
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
479 download_mgr_->GetTimeout(&timeout, &timeout_direct);
2110
3/6
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 479 times.
479 if (options_mgr_->GetValue("CVMFS_EXTERNAL_TIMEOUT", &optarg)) {
2111 timeout = String2Uint64(optarg);
2112 }
2113
3/6
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 479 times.
479 if (options_mgr_->GetValue("CVMFS_EXTERNAL_TIMEOUT_DIRECT", &optarg)) {
2114 timeout_direct = String2Uint64(optarg);
2115 }
2116
1/2
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
479 external_download_mgr_->SetTimeout(timeout, timeout_direct);
2117
2118
3/6
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 479 times.
479 if (options_mgr_->GetValue("CVMFS_EXTERNAL_METALINK", &optarg)) {
2119 external_download_mgr_->SetMetalinkChain(optarg);
2120 // host chain will be set later when the metalink server is contacted
2121 external_download_mgr_->SetHostChain("");
2122 // metalink requires redirects
2123 external_download_mgr_->EnableRedirects();
2124
4/6
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 14 times.
✓ Branch 10 taken 465 times.
479 } else if (options_mgr_->GetValue("CVMFS_EXTERNAL_URL", &optarg)) {
2125
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 external_download_mgr_->SetHostChain(optarg);
2126
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 if (dogeosort) {
2127 std::vector<std::string> host_chain;
2128 external_download_mgr_->GetHostInfo(&host_chain, NULL, NULL);
2129 download_mgr_->GeoSortServers(&host_chain);
2130 external_download_mgr_->SetHostChain(host_chain);
2131 }
2132 } else {
2133
2/4
✓ Branch 2 taken 465 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 465 times.
✗ Branch 6 not taken.
465 external_download_mgr_->SetHostChain("");
2134 }
2135
2136
4/6
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 21 times.
✓ Branch 10 taken 458 times.
479 if (options_mgr_->GetValue("CVMFS_EXTERNAL_MAX_SERVERS", &optarg)) {
2137
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
21 const unsigned max_servers = String2Uint64(optarg);
2138 21 std::vector<std::string> host_chain;
2139
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
21 external_download_mgr_->GetHostInfo(&host_chain, NULL, NULL);
2140
6/6
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 7 times.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 7 times.
✓ Branch 5 taken 7 times.
✓ Branch 6 taken 14 times.
21 if (max_servers > 0 && max_servers < host_chain.size()) {
2141
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 host_chain.resize(max_servers);
2142
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 external_download_mgr_->SetHostChain(host_chain);
2143 }
2144 21 }
2145
2146
1/2
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
479 string proxies = "DIRECT";
2147
3/6
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 479 times.
479 if (options_mgr_->GetValue("CVMFS_EXTERNAL_HTTP_PROXY", &optarg)) {
2148 proxies = download::ResolveProxyDescription(
2149 optarg,
2150 file_system_->workspace() + "/proxies-external" + GetUniqFileSuffix(),
2151 external_download_mgr_);
2152 if (proxies == "") {
2153 boot_error_ = "failed to discover external HTTP proxy servers";
2154 boot_status_ = loader::kFailWpad;
2155 return false;
2156 }
2157 }
2158 479 string fallback_proxies;
2159
3/6
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 479 times.
479 if (options_mgr_->GetValue("CVMFS_EXTERNAL_FALLBACK_PROXY", &optarg))
2160 fallback_proxies = optarg;
2161
1/2
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
479 external_download_mgr_->SetProxyChain(
2162 proxies, fallback_proxies, download::DownloadManager::kSetProxyBoth);
2163
2164 479 return true;
2165 479 }
2166
2167
2168 522 void MountPoint::SetupHttpTuning() {
2169 522 string optarg;
2170
2171 // TODO(jblomer): avoid double default settings
2172
2173 522 unsigned timeout = kDefaultTimeoutSec;
2174 522 unsigned timeout_direct = kDefaultTimeoutSec;
2175
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_TIMEOUT", &optarg))
2176 timeout = String2Uint64(optarg);
2177
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_TIMEOUT_DIRECT", &optarg))
2178 timeout_direct = String2Uint64(optarg);
2179
1/2
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
522 download_mgr_->SetTimeout(timeout, timeout_direct);
2180
2181 522 unsigned max_retries = kDefaultRetries;
2182 522 unsigned backoff_init = kDefaultBackoffInitMs;
2183 522 unsigned backoff_max = kDefaultBackoffMaxMs;
2184
4/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 357 times.
✓ Branch 10 taken 165 times.
522 if (options_mgr_->GetValue("CVMFS_MAX_RETRIES", &optarg))
2185
1/2
✓ Branch 1 taken 357 times.
✗ Branch 2 not taken.
357 max_retries = String2Uint64(optarg);
2186
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_BACKOFF_INIT", &optarg))
2187 backoff_init = String2Uint64(optarg) * 1000;
2188
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_BACKOFF_MAX", &optarg))
2189 backoff_max = String2Uint64(optarg) * 1000;
2190
1/2
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
522 download_mgr_->SetRetryParameters(max_retries, backoff_init, backoff_max);
2191
2192
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_LOW_SPEED_LIMIT", &optarg))
2193 download_mgr_->SetLowSpeedLimit(String2Uint64(optarg));
2194
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_PROXY_RESET_AFTER", &optarg)) {
2195 download_mgr_->SetProxyGroupResetDelay(String2Uint64(optarg));
2196 // Use the proxy reset delay as the default for the metalink reset delay
2197 download_mgr_->SetMetalinkResetDelay(String2Uint64(optarg));
2198 }
2199
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_METALINK_RESET_AFTER", &optarg))
2200 download_mgr_->SetMetalinkResetDelay(String2Uint64(optarg));
2201
3/6
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 522 times.
522 if (options_mgr_->GetValue("CVMFS_HOST_RESET_AFTER", &optarg))
2202 download_mgr_->SetHostResetDelay(String2Uint64(optarg));
2203
2204
3/10
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 522 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 522 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
1044 if (options_mgr_->GetValue("CVMFS_FOLLOW_REDIRECTS", &optarg)
2205
3/10
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 522 times.
✗ Branch 12 not taken.
1044 && options_mgr_->IsOn(optarg)) {
2206 download_mgr_->EnableRedirects();
2207 }
2208
6/18
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 522 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 522 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 522 times.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 522 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
522 if (options_mgr_->GetValue("CVMFS_INFO_HEADER", &optarg) && (optarg != ""))
2209 {
2210 download_mgr_->EnableInfoHeader();
2211 download_mgr_->SetInfoHeaderTemplate(optarg);
2212
3/10
✓ Branch 1 taken 522 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 522 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 522 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
1044 } else if (options_mgr_->GetValue("CVMFS_SEND_INFO_HEADER", &optarg)
2213
3/10
✓ Branch 2 taken 522 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 522 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 522 times.
✗ Branch 12 not taken.
1044 && options_mgr_->IsOn(optarg))
2214 {
2215 download_mgr_->EnableInfoHeader();
2216 download_mgr_->SetInfoHeaderTemplate("%{path}");
2217 }
2218 522 }
2219
2220 /*
2221 * Check whether permission is needed to read from user process environment.
2222 */
2223 bool MountPoint::NeedsReadEnviron(OptionsManager *omgr) {
2224 // This is a class (static) method because it is used early, before
2225 // all the above initialization is done, so can't rely on mountpoint
2226 // object data.
2227 string info_header;
2228 omgr->GetValue("CVMFS_INFO_HEADER", &info_header);
2229 return (info_header.find("%{env:") != std::string::npos);
2230 }
2231
2232 479 void MountPoint::SetupInodeAnnotation() {
2233 479 string optarg;
2234
2235
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 479 times.
479 if (file_system_->IsNfsSource()) {
2236 inode_annotation_ = new catalog::InodeNfsGenerationAnnotation();
2237 } else {
2238
1/2
✓ Branch 1 taken 479 times.
✗ Branch 2 not taken.
479 inode_annotation_ = new catalog::InodeGenerationAnnotation();
2239 }
2240
3/6
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 479 times.
479 if (options_mgr_->GetValue("CVMFS_INITIAL_GENERATION", &optarg)) {
2241 inode_annotation_->IncGeneration(String2Uint64(optarg));
2242 }
2243
2244
2/2
✓ Branch 1 taken 260 times.
✓ Branch 2 taken 219 times.
479 if (file_system_->type() == FileSystem::kFsFuse) {
2245 260 catalog_mgr_->SetInodeAnnotation(inode_annotation_);
2246 }
2247 479 }
2248
2249
2250 479 bool MountPoint::SetupOwnerMaps() {
2251 479 string optarg;
2252 479 catalog::OwnerMap uid_map;
2253 479 catalog::OwnerMap gid_map;
2254
2255
4/6
✓ Branch 2 taken 479 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 479 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 7 times.
✓ Branch 10 taken 472 times.
479 if (options_mgr_->GetValue("CVMFS_UID_MAP", &optarg)) {
2256
2/4
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
7 if (!uid_map.Read(optarg)) {
2257
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 boot_error_ = "failed to parse uid map " + optarg;
2258 7 boot_status_ = loader::kFailOptions;
2259 7 return false;
2260 }
2261 }
2262
3/6
✓ Branch 2 taken 472 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 472 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 472 times.
472 if (options_mgr_->GetValue("CVMFS_GID_MAP", &optarg)) {
2263 if (!gid_map.Read(optarg)) {
2264 boot_error_ = "failed to parse gid map " + optarg;
2265 boot_status_ = loader::kFailOptions;
2266 return false;
2267 }
2268 }
2269
1/2
✓ Branch 1 taken 472 times.
✗ Branch 2 not taken.
472 catalog_mgr_->SetOwnerMaps(uid_map, gid_map);
2270
2271 // TODO(jblomer): make local to catalog manager
2272
3/10
✓ Branch 1 taken 472 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 472 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 472 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
944 if (options_mgr_->GetValue("CVMFS_CLAIM_OWNERSHIP", &optarg)
2273
3/10
✓ Branch 2 taken 472 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 472 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 472 times.
✗ Branch 12 not taken.
944 && options_mgr_->IsOn(optarg)) {
2274 g_claim_ownership = true;
2275 }
2276
3/10
✓ Branch 1 taken 472 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 472 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 472 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
944 if (options_mgr_->GetValue("CVMFS_WORLD_READABLE", &optarg)
2277
3/10
✓ Branch 2 taken 472 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 472 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 472 times.
✗ Branch 12 not taken.
944 && options_mgr_->IsOn(optarg)) {
2278 g_world_readable = true;
2279 }
2280
2281
2282 472 return true;
2283 479 }
2284
2285