GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/upload.cc
Date: 2026-08-30 02:40:36
Exec Total Coverage
Lines: 42 76 55.3%
Branches: 12 42 28.6%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #include "upload.h"
6
7 #include <vector>
8
9 #include "util/concurrency.h"
10 #include "util/shared_ptr.h"
11
12 namespace upload {
13
14 1237 Spooler *Spooler::Construct(const SpoolerDefinition &spooler_definition,
15 perf::StatisticsTemplate *statistics) {
16
1/2
✓ Branch 2 taken 1237 times.
✗ Branch 3 not taken.
1237 Spooler *result = new Spooler(spooler_definition);
17
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1237 times.
1237 if (!result->Initialize(statistics)) {
18 delete result;
19 result = NULL;
20 }
21 1237 return result;
22 }
23
24 1237 Spooler::Spooler(const SpoolerDefinition &spooler_definition)
25
1/2
✓ Branch 2 taken 1237 times.
✗ Branch 3 not taken.
1237 : spooler_definition_(spooler_definition) { }
26
27 7416 Spooler::~Spooler() {
28 2472 FinalizeSession(false);
29
1/2
✓ Branch 1 taken 1236 times.
✗ Branch 2 not taken.
2472 if (uploader_.get() != nullptr) {
30 2472 uploader_->TearDown();
31 }
32 4944 }
33
34 std::string Spooler::backend_name() const { return uploader_->name(); }
35
36 1237 bool Spooler::Initialize(perf::StatisticsTemplate *statistics) {
37 // configure the uploader environment
38 1237 uploader_.reset(AbstractUploader::Construct(spooler_definition_));
39
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1237 times.
1237 if (uploader_.get() == nullptr) {
40 LogCvmfs(kLogSpooler, kLogWarning,
41 "Failed to initialize backend upload "
42 "facility in Spooler.");
43 return false;
44 }
45
46
2/2
✓ Branch 0 taken 245 times.
✓ Branch 1 taken 992 times.
1237 if (statistics != NULL) {
47 245 uploader_->InitCounters(statistics);
48 }
49
50 // configure the file processor context
51 1237 ingestion_pipeline_.reset(
52
1/2
✓ Branch 3 taken 1237 times.
✗ Branch 4 not taken.
1237 new IngestionPipeline(uploader_.get(), spooler_definition_));
53 1237 ingestion_pipeline_->RegisterListener(&Spooler::ProcessingCallback, this);
54 1237 ingestion_pipeline_->Spawn();
55
56 // all done...
57 1237 return true;
58 }
59
60 bool Spooler::Create() { return uploader_->Create(); }
61
62 void Spooler::Process(IngestionSource *source, const bool allow_chunking) {
63 ingestion_pipeline_->Process(source, allow_chunking);
64 }
65
66 2133 void Spooler::ProcessCatalog(const std::string &local_path) {
67
1/2
✓ Branch 3 taken 2133 times.
✗ Branch 4 not taken.
2133 ingestion_pipeline_->Process(new FileIngestionSource(local_path), false,
68 shash::kSuffixCatalog);
69 2133 }
70
71 void Spooler::ProcessHistory(const std::string &local_path) {
72 ingestion_pipeline_->Process(new FileIngestionSource(local_path), false,
73 shash::kSuffixHistory);
74 }
75
76 void Spooler::ProcessCertificate(const std::string &local_path) {
77 ingestion_pipeline_->Process(new FileIngestionSource(local_path), false,
78 shash::kSuffixCertificate);
79 }
80
81 void Spooler::ProcessCertificate(IngestionSource *source) {
82 ingestion_pipeline_->Process(source, false, shash::kSuffixCertificate);
83 }
84
85 void Spooler::ProcessMetainfo(const std::string &local_path) {
86 ingestion_pipeline_->Process(new FileIngestionSource(local_path), false,
87 shash::kSuffixMetainfo);
88 }
89
90 void Spooler::ProcessMetainfo(IngestionSource *source) {
91 ingestion_pipeline_->Process(source, false, shash::kSuffixMetainfo);
92 }
93
94 992 void Spooler::Upload(const std::string &local_path,
95 const std::string &remote_path) {
96 992 uploader_->UploadFile(
97 local_path, remote_path,
98 992 AbstractUploader::MakeCallback(&Spooler::UploadingCallback, this));
99 992 }
100
101 void Spooler::Upload(const std::string &remote_path, IngestionSource *source) {
102 uploader_->UploadIngestionSource(
103 remote_path, source,
104 AbstractUploader::MakeCallback(&Spooler::UploadingCallback, this));
105 delete source;
106 }
107
108
109 void Spooler::UploadManifest(const std::string &local_path) {
110 Upload(local_path, ".cvmfspublished");
111 }
112
113 void Spooler::UploadReflog(const std::string &local_path) {
114 Upload(local_path, ".cvmfsreflog");
115 }
116
117 void Spooler::RemoveAsync(const std::string &file_to_delete) {
118 uploader_->RemoveAsync(file_to_delete);
119 }
120
121 bool Spooler::Peek(const std::string &path) const {
122 return uploader_->Peek(path);
123 }
124
125 bool Spooler::Mkdir(const std::string &path) { return uploader_->Mkdir(path); }
126
127 bool Spooler::PlaceBootstrappingShortcut(const shash::Any &object) const {
128 assert(!object.IsNull());
129 return uploader_->PlaceBootstrappingShortcut(object);
130 }
131
132 2133 void Spooler::ProcessingCallback(const SpoolerResult &data) {
133 2133 NotifyListeners(data);
134 2133 }
135
136 992 void Spooler::UploadingCallback(const UploaderResults &data) {
137
3/6
✓ Branch 2 taken 992 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 992 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 992 times.
✗ Branch 9 not taken.
992 NotifyListeners(SpoolerResult(data.return_code, data.local_path));
138 992 }
139
140 2155 void Spooler::WaitForUpload() const {
141 2155 ingestion_pipeline_->WaitFor();
142 2155 uploader_->WaitForUpload();
143 2155 }
144
145 1236 bool Spooler::FinalizeSession(bool commit, const std::string &old_root_hash,
146 const std::string &new_root_hash,
147 const RepositoryTag &tag) const {
148 1236 return uploader_->FinalizeSession(commit, old_root_hash, new_root_hash, tag);
149 }
150
151 3147 unsigned int Spooler::GetNumberOfErrors() const {
152 3147 return uploader_->GetNumberOfErrors();
153 }
154
155 } // namespace upload
156