GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/mountpoint.cc
Date: 2025-05-11 02:35:43
Exec Total Coverage
Lines: 940 1348 69.7%
Branches: 1211 2996 40.4%

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