GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/upload_facility.cc
Date: 2026-10-25 02:40:14
Exec Total Coverage
Lines: 72 88 81.8%
Branches: 24 51 47.1%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #include "upload_facility.h"
6
7 #include <cassert>
8
9 #include "upload_gateway.h"
10 #include "upload_local.h"
11 #include "upload_s3.h"
12 #include "util/exception.h"
13
14 namespace upload {
15
16 std::atomic<int64_t> UploadStreamHandle::g_upload_stream_tag(0);
17
18 14346778 AbstractUploader::UploadJob::UploadJob(UploadStreamHandle *handle,
19 UploadBuffer buffer,
20 14346778 const CallbackTN *callback)
21 14346778 : type(Upload)
22 14346778 , stream_handle(handle)
23 14346778 , tag_(handle->tag)
24 14346778 , buffer(buffer)
25 14346778 , callback(callback) { }
26
27 8271651 AbstractUploader::UploadJob::UploadJob(UploadStreamHandle *handle,
28 8271651 const shash::Any &content_hash)
29 8271651 : type(Commit)
30 8271651 , stream_handle(handle)
31 8271651 , tag_(handle->tag)
32 8271651 , buffer()
33 8271387 , callback(NULL)
34 8271387 , content_hash(content_hash) { }
35
36 2350 void AbstractUploader::RegisterPlugins() {
37 2350 RegisterPlugin<LocalUploader>();
38 2350 RegisterPlugin<S3Uploader>();
39 2350 RegisterPlugin<GatewayUploader>();
40 2350 }
41
42 3776 AbstractUploader::AbstractUploader(const SpoolerDefinition &spooler_definition)
43 3776 : spooler_definition_(spooler_definition)
44 3776 , num_upload_tasks_(spooler_definition.num_upload_tasks)
45
2/4
✓ Branch 2 taken 3776 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3776 times.
✗ Branch 6 not taken.
3776 , jobs_in_flight_(spooler_definition.number_of_concurrent_uploads) { }
46
47
48 3776 bool AbstractUploader::Initialize() {
49
2/2
✓ Branch 1 taken 4309 times.
✓ Branch 2 taken 3776 times.
8085 for (unsigned i = 0; i < GetNumTasks(); ++i) {
50
1/2
✓ Branch 2 taken 4309 times.
✗ Branch 3 not taken.
4309 Tube<UploadJob> *t = new Tube<UploadJob>();
51 4309 tubes_upload_.TakeTube(t);
52
1/2
✓ Branch 2 taken 4309 times.
✗ Branch 3 not taken.
4309 tasks_upload_.TakeConsumer(new TaskUpload(this, t));
53 }
54 3776 tubes_upload_.Activate();
55 3776 tasks_upload_.Spawn();
56 3776 return true;
57 }
58
59 920 bool AbstractUploader::FinalizeSession(bool /*commit*/,
60 const std::string & /*old_root_hash*/,
61 const std::string & /*new_root_hash*/,
62 const RepositoryTag & /*tag*/) {
63 920 return true;
64 }
65
66
67 4489 int AbstractUploader::CreateAndOpenTemporaryChunkFile(std::string *path) const {
68 const std::string tmp_path = CreateTempPath(
69
3/6
✓ Branch 1 taken 4489 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4489 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4489 times.
✗ Branch 8 not taken.
8978 spooler_definition_.temporary_path + "/" + "chunk", 0644);
70
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 4489 times.
4489 if (tmp_path.empty()) {
71 ✗ LogCvmfs(kLogSpooler, kLogStderr,
72 "Failed to create temp file in %s for upload of file chunk"
73 " (errno: %d).",
74 ✗ spooler_definition_.temporary_path.c_str(), errno);
75 ✗ return -1;
76 }
77
78
1/2
✓ Branch 2 taken 4489 times.
✗ Branch 3 not taken.
4489 const int tmp_fd = open(tmp_path.c_str(), O_WRONLY);
79
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4489 times.
4489 if (tmp_fd < 0) {
80 ✗ LogCvmfs(kLogSpooler, kLogStderr,
81 "Failed to open temp file '%s' for upload of file chunk "
82 "(errno: %d)",
83 ✗ tmp_path.c_str(), errno);
84 ✗ unlink(tmp_path.c_str());
85 } else {
86
1/2
✓ Branch 1 taken 4489 times.
✗ Branch 2 not taken.
4489 *path = tmp_path;
87 }
88
89 4489 return tmp_fd;
90 4489 }
91
92 3775 void AbstractUploader::TearDown() { tasks_upload_.Terminate(); }
93
94 3671 void AbstractUploader::WaitForUpload() const { jobs_in_flight_.WaitForZero(); }
95
96 180 void AbstractUploader::InitCounters(perf::StatisticsTemplate *statistics) {
97
2/4
✓ Branch 2 taken 180 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 180 times.
✗ Branch 6 not taken.
180 counters_ = std::unique_ptr<UploadCounters>(new UploadCounters(*statistics));
98 180 }
99
100 4100 void AbstractUploader::CountUploadedChunks() const {
101
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 4100 times.
4100 if (counters_.get() != nullptr) {
102 ✗ perf::Inc(counters_->n_chunks_added);
103 }
104 4100 }
105
106 ✗ void AbstractUploader::DecUploadedChunks() const {
107 ✗ if (counters_.get() != nullptr) {
108 ✗ perf::Dec(counters_->n_chunks_added);
109 }
110 }
111
112 4100 void AbstractUploader::CountUploadedBytes(int64_t bytes_written) const {
113
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 4100 times.
4100 if (counters_.get() != nullptr) {
114 ✗ perf::Xadd(counters_->sz_uploaded_bytes, bytes_written);
115 }
116 4100 }
117
118 ✗ void AbstractUploader::CountDuplicates() const {
119 ✗ if (counters_.get() != nullptr) {
120 ✗ perf::Inc(counters_->n_chunks_duplicated);
121 }
122 }
123
124 1358 void AbstractUploader::CountUploadedCatalogs() const {
125
2/2
✓ Branch 1 taken 180 times.
✓ Branch 2 taken 1178 times.
1358 if (counters_.get() != nullptr) {
126 180 perf::Inc(counters_->n_catalogs_added);
127 }
128 1358 }
129
130 1358 void AbstractUploader::CountUploadedCatalogBytes(int64_t bytes_written) const {
131
2/2
✓ Branch 1 taken 180 times.
✓ Branch 2 taken 1178 times.
1358 if (counters_.get() != nullptr) {
132 180 perf::Xadd(counters_->sz_uploaded_catalog_bytes, bytes_written);
133 }
134 1358 }
135
136 //------------------------------------------------------------------------------
137
138
139 22618825 void TaskUpload::Process(AbstractUploader::UploadJob *upload_job) {
140
2/3
✓ Branch 0 taken 14347075 times.
✓ Branch 1 taken 8271750 times.
✗ Branch 2 not taken.
22618825 switch (upload_job->type) {
141 14347075 case AbstractUploader::UploadJob::Upload:
142 14347075 uploader_->StreamedUpload(upload_job->stream_handle, upload_job->buffer,
143 upload_job->callback);
144 14347075 break;
145
146 8271750 case AbstractUploader::UploadJob::Commit:
147 8271750 uploader_->FinalizeStreamedUpload(upload_job->stream_handle,
148 8271750 upload_job->content_hash);
149 8271750 break;
150
151 ✗ default:
152 ✗ PANIC(NULL);
153 }
154
155
1/2
✓ Branch 0 taken 22618825 times.
✗ Branch 1 not taken.
22618825 delete upload_job;
156 22618825 }
157
158 } // namespace upload
159
160