GCC Code Coverage Report


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