GCC Code Coverage Report


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