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 |