GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/mountpoint.cc
Date: 2025-11-09 02:35:23
Exec Total Coverage
Lines: 950 1346 70.6%
Branches: 1212 3002 40.4%

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