GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/mountpoint.cc
Date: 2024-04-21 02:33:16
Exec Total Coverage
Lines: 944 1330 71.0%
Branches: 1204 2940 41.0%

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