GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/mountpoint.cc
Date: 2026-06-28 02:36:10
Exec Total Coverage
Lines: 966 1413 68.4%
Branches: 1234 3177 38.8%

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