GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/mountpoint.cc
Date: 2026-08-09 02:40:25
Exec Total Coverage
Lines: 978 1428 68.5%
Branches: 1254 3249 38.6%

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