GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/ingestion/task_read.cc
Date: 2025-07-13 02:35:07
Exec Total Coverage
Lines: 36 40 90.0%
Branches: 37 66 56.1%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #include "ingestion/task_read.h"
6
7 #include <errno.h>
8 #include <fcntl.h>
9 #include <unistd.h>
10
11 #include <cstring>
12
13 #include "backoff.h"
14 #include "util/exception.h"
15 #include "util/logging.h"
16 #include "util/platform.h"
17 #include "util/posix.h"
18 #include "util/smalloc.h"
19
20
21 atomic_int64 TaskRead::tag_seq_ = 0;
22
23
24 1251491 void TaskRead::Process(FileItem *item) {
25
1/2
✓ Branch 1 taken 1251556 times.
✗ Branch 2 not taken.
1251491 BackoffThrottle throttle(kThrottleInitMs, kThrottleMaxMs, kThrottleResetMs);
26
6/6
✓ Branch 0 taken 1251540 times.
✓ Branch 1 taken 16 times.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 1251493 times.
✓ Branch 5 taken 7 times.
✓ Branch 6 taken 1251509 times.
1251556 if ((high_watermark_ > 0) && (BlockItem::managed_bytes() > high_watermark_)) {
27 7 atomic_inc64(&n_block_);
28 do {
29
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 throttle.Throttle();
30
2/2
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 7 times.
14 } while (BlockItem::managed_bytes() > low_watermark_);
31 }
32
33
2/4
✓ Branch 1 taken 1251201 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1251201 times.
1251516 if (item->Open() == false) {
34 PANIC(kLogStderr, "failed to open %s (%d)", item->path().c_str(), errno);
35 }
36 uint64_t size;
37
2/4
✓ Branch 1 taken 1251136 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1251136 times.
1251201 if (item->GetSize(&size) == false) {
38 PANIC(kLogStderr, "failed to fstat %s (%d)", item->path().c_str(), errno);
39 }
40 1251136 item->set_size(size);
41
42
2/2
✓ Branch 1 taken 1249209 times.
✓ Branch 2 taken 1837 times.
1251001 if (item->may_have_chunks()) {
43 2498228 item->set_may_have_chunks(
44
1/2
✓ Branch 3 taken 1249019 times.
✗ Branch 4 not taken.
1249209 item->chunk_detector()->MightFindChunks(item->size()));
45 }
46
47 unsigned char *buffer[kBlockSize];
48 1250871 const uint64_t tag = atomic_xadd64(&tag_seq_, 1);
49 1251731 ssize_t nbytes = -1;
50 1251731 unsigned cnt = 0;
51 do {
52
1/2
✓ Branch 1 taken 2767972 times.
✗ Branch 2 not taken.
2765642 nbytes = item->Read(buffer, kBlockSize);
53
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2767972 times.
2767972 if (nbytes < 0) {
54 PANIC(kLogStderr, "failed to read %s (%d)", item->path().c_str(), errno);
55 }
56
57
2/4
✓ Branch 1 taken 2766882 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2760767 times.
✗ Branch 5 not taken.
2767972 BlockItem *block_item = new BlockItem(tag, allocator_);
58
1/2
✓ Branch 1 taken 2760087 times.
✗ Branch 2 not taken.
2760767 block_item->SetFileItem(item);
59
2/2
✓ Branch 0 taken 1250031 times.
✓ Branch 1 taken 1510056 times.
2760087 if (nbytes == 0) {
60
1/2
✓ Branch 1 taken 1250031 times.
✗ Branch 2 not taken.
1250031 item->Close();
61
1/2
✓ Branch 1 taken 1249671 times.
✗ Branch 2 not taken.
1250031 block_item->MakeStop();
62 } else {
63
1/2
✓ Branch 1 taken 1521111 times.
✗ Branch 2 not taken.
1510056 block_item->MakeDataCopy(reinterpret_cast<unsigned char *>(buffer),
64 nbytes);
65 }
66
1/2
✓ Branch 1 taken 2763297 times.
✗ Branch 2 not taken.
2770782 tubes_out_->Dispatch(block_item);
67
68 2763297 cnt++;
69
2/2
✓ Branch 0 taken 8435 times.
✓ Branch 1 taken 2754862 times.
2763297 if ((cnt % 32) == 0) {
70 16875 if ((high_watermark_ > 0)
71
3/6
✓ Branch 0 taken 8435 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 8440 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 8440 times.
8435 && (BlockItem::managed_bytes() > high_watermark_)) {
72 throttle.Throttle();
73 }
74 }
75
2/2
✓ Branch 0 taken 1513911 times.
✓ Branch 1 taken 1249391 times.
2763302 } while (nbytes > 0);
76 1249391 }
77
78
79 46599 void TaskRead::SetWatermarks(uint64_t low, uint64_t high) {
80
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 46599 times.
46599 assert(high > low);
81
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 46599 times.
46599 assert(low > 0);
82 46599 low_watermark_ = low;
83 46599 high_watermark_ = high;
84 46599 }
85