CernVM-FS  2.10.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
magic_xattr.cc
Go to the documentation of this file.
1 
5 #include "magic_xattr.h"
6 
7 #include <cassert>
8 #include <string>
9 #include <vector>
10 
11 #include "catalog_mgr_client.h"
12 #include "fetch.h"
13 #include "logging.h"
14 #include "mountpoint.h"
15 #include "quota.h"
16 #include "signature.h"
17 #include "util/string.h"
18 
20  EVisibility visibility)
21  : mount_point_(mountpoint),
22  visibility_(visibility)
23 {
24  Register("user.catalog_counters", new CatalogCountersMagicXattr());
25  Register("user.external_host", new ExternalHostMagicXattr());
26  Register("user.external_timeout", new ExternalTimeoutMagicXattr());
27  Register("user.fqrn", new FqrnMagicXattr());
28  Register("user.host", new HostMagicXattr());
29  Register("user.host_list", new HostListMagicXattr());
30  Register("user.ncleanup24", new NCleanup24MagicXattr());
31  Register("user.nclg", new NClgMagicXattr());
32  Register("user.ndiropen", new NDirOpenMagicXattr());
33  Register("user.ndownload", new NDownloadMagicXattr());
34  Register("user.nioerr", new NIOErrMagicXattr());
35  Register("user.nopen", new NOpenMagicXattr());
36  Register("user.hitrate", new HitrateMagicXattr());
37  Register("user.logbuffer", new LogBufferXattr());
38  Register("user.proxy", new ProxyMagicXattr());
39  Register("user.pubkeys", new PubkeysMagicXattr());
40  Register("user.repo_counters", new RepoCountersMagicXattr());
41  Register("user.repo_metainfo", new RepoMetainfoMagicXattr());
42  Register("user.revision", new RevisionMagicXattr());
43  Register("user.root_hash", new RootHashMagicXattr());
44  Register("user.rx", new RxMagicXattr());
45  Register("user.speed", new SpeedMagicXattr());
46  Register("user.tag", new TagMagicXattr());
47  Register("user.timeout", new TimeoutMagicXattr());
48  Register("user.timeout_direct", new TimeoutDirectMagicXattr());
49  Register("user.timestamp_last_ioerr", new TimestampLastIOErrMagicXattr());
50  Register("user.usedfd", new UsedFdMagicXattr());
51  Register("user.useddirp", new UsedDirPMagicXattr());
52  Register("user.version", new VersionMagicXattr());
53 
54  Register("user.hash", new HashMagicXattr());
55  Register("user.lhash", new LHashMagicXattr());
56 
57  Register("user.chunk_list", new ChunkListMagicXattr());
58  Register("user.chunks", new ChunksMagicXattr());
59  Register("user.compression", new CompressionMagicXattr());
60  Register("user.direct_io", new DirectIoMagicXattr());
61  Register("user.external_file", new ExternalFileMagicXattr());
62 
63  Register("user.rawlink", new RawlinkMagicXattr());
64  Register("xfsroot.rawlink", new RawlinkMagicXattr());
65 
66  Register("user.authz", new AuthzMagicXattr());
67 }
68 
70  if (visibility() == kVisibilityNever) {
71  return "";
72  }
73  // Only the root entry has an empty name
74  if (visibility() == kVisibilityRootOnly && !dirent->name().IsEmpty()) {
75  return "";
76  }
77 
78  std::string result;
79  std::map<std::string, BaseMagicXattr *>::iterator it = xattr_list_.begin();
80  for (; it != xattr_list_.end(); ++it) {
81  MagicXattrFlavor flavor = (*it).second->GetXattrFlavor();
82  // Skip those which should not be displayed
83  switch (flavor) {
84  case kXattrBase:
85  break;
86  case kXattrWithHash:
87  if (dirent->checksum().IsNull()) continue;
88  break;
89  case kXattrRegular:
90  if (!dirent->IsRegular()) continue;
91  break;
92  case kXattrSymlink:
93  if (!dirent->IsLink()) continue;
94  break;
95  case kXattrAuthz:
96  if (!mount_point_->has_membership_req()) continue;
97  break;
98  default:
99  PANIC("unknown magic xattr flavor");
100  }
101  result += (*it).first;
102  result.push_back('\0');
103  }
104 
105  return result;
106 }
107 
109  PathString path,
111 {
112  BaseMagicXattr *result;
113  if (xattr_list_.count(name) > 0) {
114  result = xattr_list_[name];
115  } else {
116  return NULL;
117  }
118 
119  result->Lock(path, d);
120 
121  return result;
122 }
123 
124 void MagicXattrManager::Register(const std::string &name,
125  BaseMagicXattr *magic_xattr)
126 {
127  if (xattr_list_.count(name) > 0) {
129  "Magic extended attribute with name %s already registered",
130  name.c_str());
131  }
132  magic_xattr->mount_point_ = mount_point_;
133  xattr_list_[name] = magic_xattr;
134 }
135 
138 }
139 
141  return mount_point_->membership_req();
142 }
143 
145  return kXattrAuthz;
146 }
147 
149  counters_ =
151  return true;
152 }
153 
155  std::string res;
156  res = "catalog_mountpoint: " + subcatalog_path_ + "\n";
157  res += counters_.GetCsvMap();
158  return res;
159 }
160 
162  chunk_list_ = "hash,offset,size\n";
163  if (!dirent_->IsRegular()) {
164  return false;
165  }
166  if (dirent_->IsChunkedFile()) {
167  FileChunkList chunks;
168  if (!mount_point_->catalog_mgr()
170  || chunks.IsEmpty())
171  {
172  LogCvmfs(kLogCvmfs, kLogDebug | kLogSyslogErr, "file %s is marked as "
173  "'chunked', but no chunks found.", path_.c_str());
174  return false;
175  } else {
176  for (size_t i = 0; i < chunks.size(); ++i) {
177  chunk_list_ += chunks.At(i).content_hash().ToString() + ",";
178  chunk_list_ += StringifyInt(chunks.At(i).offset()) + ",";
179  chunk_list_ += StringifyUint(chunks.At(i).size()) + "\n";
180  }
181  }
182  } else {
183  chunk_list_ += dirent_->checksum().ToString() + ",";
184  chunk_list_ += "0,";
185  chunk_list_ += StringifyUint(dirent_->size()) + "\n";
186  }
187  return true;
188 }
189 
191  return chunk_list_;
192 }
193 
195  if (!dirent_->IsRegular()) {
196  return false;
197  }
198  if (dirent_->IsChunkedFile()) {
199  FileChunkList chunks;
200  if (!mount_point_->catalog_mgr()
202  || chunks.IsEmpty())
203  {
204  LogCvmfs(kLogCvmfs, kLogDebug | kLogSyslogErr, "file %s is marked as "
205  "'chunked', but no chunks found.", path_.c_str());
206  return false;
207  } else {
208  n_chunks_ = chunks.size();
209  }
210  } else {
211  n_chunks_ = 1;
212  }
213 
214  return true;
215 }
216 
218  return StringifyUint(n_chunks_);
219 }
220 
222  return dirent_->IsRegular();
223 }
224 
227 }
228 
230  return dirent_->IsRegular();
231 }
232 
234  return dirent_->IsDirectIo() ? "1" : "0";
235 }
236 
238  return dirent_->IsRegular();
239 }
240 
242  return dirent_->IsExternalFile() ? "1" : "0";
243 }
244 
246  std::vector<string> host_chain;
247  std::vector<int> rtt;
248  unsigned current_host;
250  &host_chain, &rtt, &current_host);
251  if (host_chain.size()) {
252  return std::string(host_chain[current_host]);
253  } else {
254  return "internal error: no hosts defined";
255  }
256 }
257 
259  unsigned seconds, seconds_direct;
260  mount_point_->external_download_mgr()->GetTimeout(&seconds, &seconds_direct);
261  return StringifyUint(seconds_direct);
262 }
263 
265  return mount_point_->fqrn();
266 }
267 
269  return !dirent_->checksum().IsNull();
270 }
271 
273  return dirent_->checksum().ToString();
274 }
275 
277  std::vector<std::string> host_chain;
278  std::vector<int> rtt;
279  unsigned current_host;
280  mount_point_->download_mgr()->GetHostInfo(&host_chain, &rtt, &current_host);
281  if (host_chain.size()) {
282  return std::string(host_chain[current_host]);
283  } else {
284  return "internal error: no hosts defined";
285  }
286 }
287 
289  std::string result;
290  std::vector<std::string> host_chain;
291  std::vector<int> rtt;
292  unsigned current_host;
293  mount_point_->download_mgr()->GetHostInfo(&host_chain, &rtt, &current_host);
294  if (host_chain.size()) {
295  result = host_chain[current_host];
296  for (unsigned i = 1; i < host_chain.size(); ++i) {
297  result +=
298  ";" + host_chain[(i+current_host) % host_chain.size()];
299  }
300  } else {
301  result = "internal error: no hosts defined";
302  }
303  return result;
304 }
305 
307  return !dirent_->checksum().IsNull();
308 }
309 
311  string result;
312  CacheManager::ObjectInfo object_info;
313  object_info.description = path_.ToString();
315  object_info.type = CacheManager::kTypeVolatile;
316  int fd = mount_point_->file_system()->cache_mgr()->Open(
317  CacheManager::Bless(dirent_->checksum(), object_info));
318  if (fd < 0) {
319  result = "Not in cache";
320  } else {
322  int retval_i =
323  mount_point_->file_system()->cache_mgr()->ChecksumFd(fd, &hash);
324  if (retval_i != 0)
325  result = "I/O error (" + StringifyInt(retval_i) + ")";
326  else
327  result = hash.ToString();
329  }
330  return result;
331 }
332 
333 LogBufferXattr::LogBufferXattr() : BaseMagicXattr(), throttle_(1, 500, 2000) { }
334 
337  std::vector<LogBufferEntry> buffer = GetLogBuffer();
338  std::string result;
339  for (unsigned i = 0; i < buffer.size(); ++i) {
340  result += "[" + StringifyTime(buffer[i].timestamp, true /* UTC */) +
341  " UTC] " + buffer[i].message + "\n";
342  }
343  return result;
344 }
345 
347  QuotaManager *quota_mgr =
350  return StringifyInt(-1);
351  } else {
352  const uint64_t period_s = 24 * 60 * 60;
353  const uint64_t rate = quota_mgr->GetCleanupRate(period_s);
354  return StringifyInt(rate);
355  }
356 }
357 
360  return true;
361 }
362 
364  return StringifyInt(n_catalogs_);
365 }
366 
369 }
370 
372  return mount_point_->statistics()->Lookup("fetch.n_downloads")->Print();
373 }
374 
377 }
378 
380  return mount_point_->file_system()->n_fs_open()->ToString();
381 }
382 
384  int64_t n_invocations =
385  mount_point_->statistics()->Lookup("fetch.n_invocations")->Get();
386  if (n_invocations == 0)
387  return "n/a";
388 
389  int64_t n_downloads =
390  mount_point_->statistics()->Lookup("fetch.n_downloads")->Get();
391  float hitrate = 100. * (1. -
392  (static_cast<float>(n_downloads) / static_cast<float>(n_invocations)));
393  return StringifyDouble(hitrate);
394 }
395 
397  vector< vector<download::DownloadManager::ProxyInfo> > proxy_chain;
398  unsigned current_group;
400  &proxy_chain, &current_group, NULL);
401  if (proxy_chain.size()) {
402  return proxy_chain[current_group][0].url;
403  } else {
404  return "DIRECT";
405  }
406 }
407 
410  return true;
411 }
412 
414  return pubkeys_;
415 }
416 
418  return dirent_->IsLink();
419 }
420 
422  return dirent_->symlink().ToString();
423 }
424 
427  return true;
428 }
429 
431  return counters_.GetCsvMap();
432 }
433 
435 
437  if (!mount_point_->catalog_mgr()->manifest()) {
438  error_reason_ = "manifest not available";
439  return true;
440  }
441 
443  if (metainfo_hash_.IsNull()) {
444  error_reason_ = "metainfo not available";
445  return true;
446  }
447  return true;
448 }
449 
451  if (metainfo_hash_.IsNull()) {
452  return error_reason_;
453  }
454 
455  int fd = mount_point_->fetcher()->
457  "metainfo (" + metainfo_hash_.ToString() + ")",
459  if (fd < 0) {
460  return "Failed to open metadata file";
461  }
462  uint64_t actual_size = mount_point_->file_system()->cache_mgr()->GetSize(fd);
463  if (actual_size > kMaxMetainfoLength) {
465  return "Failed to open: metadata file is too big";
466  }
467  char buffer[kMaxMetainfoLength];
468  int bytes_read =
469  mount_point_->file_system()->cache_mgr()->Pread(fd, buffer, actual_size, 0);
471  if (bytes_read < 0) {
472  return "Failed to read metadata file";
473  }
474  return string(buffer, buffer + bytes_read);
475 }
476 
479  return true;
480 }
481 
483  return StringifyUint(revision_);
484 }
485 
488  return true;
489 }
490 
492  return root_hash_.ToString();
493 }
494 
495 std::string RxMagicXattr::GetValue() {
496  perf::Statistics *statistics = mount_point_->statistics();
497  int64_t rx = statistics->Lookup("download.sz_transferred_bytes")->Get();
498  return StringifyInt(rx/1024);
499 }
500 
502  perf::Statistics *statistics = mount_point_->statistics();
503  int64_t rx = statistics->Lookup("download.sz_transferred_bytes")->Get();
504  int64_t time = statistics->Lookup("download.sz_transfer_time")->Get();
505  if (time == 0)
506  return "n/a";
507  else
508  return StringifyInt((1000 * (rx/1024))/time);
509 }
510 
513  return true;
514 }
515 
516 std::string TagMagicXattr::GetValue() {
517  return tag_;
518 }
519 
521  unsigned seconds, seconds_direct;
522  mount_point_->download_mgr()->GetTimeout(&seconds, &seconds_direct);
523  return StringifyUint(seconds);
524 }
525 
527  unsigned seconds, seconds_direct;
528  mount_point_->download_mgr()->GetTimeout(&seconds, &seconds_direct);
529  return StringifyUint(seconds_direct);
530 }
531 
533  return StringifyInt(
535 }
536 
539 }
540 
543 }
544 
546  return std::string(VERSION) + "." + std::string(CVMFS_PATCH_LEVEL);
547 }
std::vector< LogBufferEntry > GetLogBuffer()
Definition: logging.cc:524
#define LogCvmfs(source, mask,...)
Definition: logging.h:20
std::string ToString()
Definition: statistics.cc:24
int ChecksumFd(int fd, shash::Any *id)
Definition: cache.cc:39
virtual std::string GetValue()
Definition: magic_xattr.cc:346
bool IsExternalFile() const
const Counters & GetCounters() const
Definition: catalog.h:175
bool IsNull() const
Definition: hash.h:382
virtual int64_t GetSize(int fd)=0
FileSystem * file_system()
Definition: mountpoint.h:443
MagicXattrFlavor
Definition: magic_xattr.h:20
Item At(const size_t index) const
Definition: bigvector.h:50
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:161
virtual std::string GetValue()
Definition: magic_xattr.cc:495
cvmfs::Fetcher * fetcher()
Definition: mountpoint.h:439
std::string subcatalog_path_
Definition: magic_xattr.h:169
virtual uint64_t GetCleanupRate(uint64_t period_s)=0
bool IsChunkedFile() const
perf::Statistics * statistics()
Definition: mountpoint.h:460
void Register(const std::string &name, BaseMagicXattr *magic_xattr)
Definition: magic_xattr.cc:124
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:486
std::string Print()
Definition: statistics.cc:25
#define PANIC(...)
Definition: exception.h:26
virtual std::string GetValue()
Definition: magic_xattr.cc:154
uint64_t size() const
std::string ToString(const bool with_suffix=false) const
Definition: hash.h:248
virtual std::string GetValue()
Definition: magic_xattr.cc:501
virtual std::string GetValue()
Definition: magic_xattr.cc:245
std::string fqrn() const
Definition: mountpoint.h:441
catalog::Counters counters_
Definition: magic_xattr.h:170
BaseMagicXattr * GetLocked(const std::string &name, PathString path, catalog::DirectoryEntry *d)
Definition: magic_xattr.cc:108
virtual std::string GetValue()
Definition: magic_xattr.cc:520
std::string error_reason_
Definition: magic_xattr.h:306
virtual std::string GetValue()
Definition: magic_xattr.cc:430
const shash::Any & content_hash() const
Definition: file_chunk.h:41
shash::Any root_hash_
Definition: magic_xattr.h:320
virtual std::string GetValue()
Definition: magic_xattr.cc:258
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:511
std::string AlgorithmName(const zlib::Algorithms alg)
Definition: compression.cc:158
MountPoint * mount_point_
Definition: cvmfs.cc:122
virtual std::string GetValue()
Definition: magic_xattr.cc:541
bool IsDirectIo() const
catalog::DirectoryEntry * dirent_
Definition: magic_xattr.h:79
Algorithms algorithm
Definition: hash.h:124
virtual std::string GetValue()
Definition: magic_xattr.cc:217
virtual int Open(const BlessedObject &object)=0
string StringifyTime(const time_t seconds, const bool utc)
Definition: string.cc:105
string StringifyDouble(const double value)
Definition: string.cc:96
virtual std::string GetValue()
Definition: magic_xattr.cc:288
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:221
std::string StringifyUint(const uint64_t value)
Definition: string.cc:84
virtual std::string GetValue()
Definition: magic_xattr.cc:310
shash::Any checksum() const
MountPoint * mount_point_
Definition: magic_xattr.h:77
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:148
bool has_membership_req()
Definition: mountpoint.h:445
std::string description
Definition: cache.h:97
std::string chunk_list_
Definition: magic_xattr.h:177
virtual std::string GetValue()
Definition: magic_xattr.cc:140
static uint64_t kMaxMetainfoLength
Definition: magic_xattr.h:303
MagicXattrManager(MountPoint *mountpoint, EVisibility visibility)
Definition: magic_xattr.cc:19
MountPoint * mount_point_
Definition: magic_xattr.h:158
virtual std::string GetValue()
Definition: magic_xattr.cc:383
perf::Counter * n_fs_open()
Definition: mountpoint.h:215
virtual std::string GetValue()
Definition: magic_xattr.cc:335
std::string membership_req()
Definition: mountpoint.h:454
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:358
void Throttle()
Definition: backoff.cc:50
std::string GetListString(catalog::DirectoryEntry *dirent)
Definition: magic_xattr.cc:69
virtual std::string GetValue()
Definition: magic_xattr.cc:241
std::string GetActivePubkeys() const
Definition: signature.cc:357
Counter * Lookup(const std::string &name) const
Definition: statistics.cc:62
NameString name() const
virtual std::string GetValue()
Definition: magic_xattr.cc:482
bool IsLink() const
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:477
void GetProxyInfo(std::vector< std::vector< ProxyInfo > > *proxy_chain, unsigned *current_group, unsigned *fallback_group)
Definition: download.cc:2557
std::string repository_tag()
Definition: mountpoint.h:458
catalog::ClientCatalogManager * catalog_mgr()
Definition: mountpoint.h:430
bool IsRegular() const
virtual std::string GetValue()
Definition: magic_xattr.cc:516
virtual std::string GetValue()
Definition: magic_xattr.cc:264
ObjectType type
Definition: cache.h:93
virtual std::string GetValue()
Definition: magic_xattr.cc:379
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:425
EVisibility visibility()
Definition: magic_xattr.h:154
perf::Counter * no_open_dirs()
Definition: mountpoint.h:222
virtual std::string GetValue()
Definition: magic_xattr.cc:537
Failures Fetch(const std::string &base_url, const std::string &repository_name, const uint64_t minimum_timestamp, const shash::Any *base_catalog, signature::SignatureManager *signature_manager, download::DownloadManager *download_manager, ManifestEnsemble *ensemble)
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:306
off_t offset() const
Definition: file_chunk.h:42
zlib::Algorithms compression_algorithm() const
CacheManager * cache_mgr()
Definition: mountpoint.h:195
perf::Counter * no_open_files()
Definition: mountpoint.h:223
virtual std::string GetValue()
Definition: magic_xattr.cc:272
LinkString symlink() const
IoErrorInfo * io_error_info()
Definition: mountpoint.h:219
download::DownloadManager * download_mgr()
Definition: mountpoint.h:432
virtual std::string GetValue()
Definition: magic_xattr.cc:545
virtual std::string GetValue()
Definition: magic_xattr.cc:491
string StringifyInt(const int64_t value)
Definition: string.cc:78
virtual std::string GetValue()
Definition: magic_xattr.cc:367
virtual int Close(int fd)=0
virtual std::string GetValue()
Definition: magic_xattr.cc:371
shash::Algorithms hash_algorithm() const
perf::Counter * n_fs_dir_open()
Definition: mountpoint.h:211
virtual std::string GetValue()
Definition: magic_xattr.cc:396
int64_t Get()
Definition: statistics.h:32
virtual std::string GetValue()
Definition: magic_xattr.cc:375
CatalogT * GetRootCatalog() const
Definition: catalog_mgr.h:192
std::string tag_
Definition: magic_xattr.h:335
bool IsEmpty() const
Definition: bigvector.h:67
static BlessedObject Bless(const shash::Any &id)
Definition: cache.h:125
shash::Any metainfo_hash_
Definition: magic_xattr.h:305
signature::SignatureManager * signature_mgr()
Definition: mountpoint.h:461
BackoffThrottle throttle_
Definition: magic_xattr.h:243
uint64_t n_chunks_
Definition: magic_xattr.h:184
virtual std::string GetValue()
Definition: magic_xattr.cc:190
std::string ToString() const
Definition: shortstring.h:114
virtual std::string GetValue()
Definition: magic_xattr.cc:450
QuotaManager * quota_mgr()
Definition: cache.h:198
virtual std::string GetValue()
Definition: magic_xattr.cc:363
bool IsEmpty() const
Definition: shortstring.h:110
virtual std::string GetValue()
Definition: magic_xattr.cc:276
PathString path_
Definition: magic_xattr.h:78
virtual std::string GetValue()
Definition: magic_xattr.cc:532
virtual std::string GetValue()
Definition: magic_xattr.cc:225
bool ListFileChunks(const PathString &path, const shash::Algorithms interpret_hashes_as, FileChunkList *chunks)
size_t size() const
Definition: file_chunk.h:43
std::map< std::string, BaseMagicXattr * > xattr_list_
Definition: magic_xattr.h:157
catalog::Counters LookupCounters(const PathString &path, std::string *subcatalog_path)
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:268
void GetTimeout(unsigned *seconds_proxy, unsigned *seconds_direct)
Definition: download.cc:1897
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:436
virtual std::string GetValue()
Definition: magic_xattr.cc:233
catalog::Counters counters_
Definition: magic_xattr.h:296
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:408
virtual MagicXattrFlavor GetXattrFlavor()
Definition: magic_xattr.cc:144
std::string pubkeys_
Definition: magic_xattr.h:284
manifest::Manifest * manifest() const
virtual std::string GetValue()
Definition: magic_xattr.cc:526
void Lock(PathString path, catalog::DirectoryEntry *dirent)
Definition: magic_xattr.h:63
std::string GetCsvMap() const
const char * c_str() const
Definition: shortstring.h:118
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:194
void GetHostInfo(std::vector< std::string > *host_chain, std::vector< int > *rtt, unsigned *current_host)
Definition: download.cc:1941
virtual std::string GetValue()
Definition: magic_xattr.cc:413
virtual int64_t Pread(int fd, void *buf, uint64_t size, uint64_t offset)=0
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:229
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:237
shash::Any meta_info() const
Definition: manifest.h:131
virtual bool HasCapability(Capabilities capability)=0
static const uint64_t kSizeUnknown
Definition: cache.h:72
size_t size() const
Definition: bigvector.h:100
download::DownloadManager * external_download_mgr()
Definition: mountpoint.h:433
virtual bool PrepareValueFenced()
Definition: magic_xattr.cc:136