| Directory: | cvmfs/ |
|---|---|
| File: | cvmfs/ingestion/task_read.cc |
| Date: | 2025-12-21 02:39:23 |
| 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 | 9750262 | void TaskRead::Process(FileItem *item) { | |
| 25 |
1/2✓ Branch 1 taken 9749833 times.
✗ Branch 2 not taken.
|
9750262 | BackoffThrottle throttle(kThrottleInitMs, kThrottleMaxMs, kThrottleResetMs); |
| 26 |
6/6✓ Branch 0 taken 9749746 times.
✓ Branch 1 taken 87 times.
✓ Branch 3 taken 42 times.
✓ Branch 4 taken 9750328 times.
✓ Branch 5 taken 42 times.
✓ Branch 6 taken 9750415 times.
|
9749833 | if ((high_watermark_ > 0) && (BlockItem::managed_bytes() > high_watermark_)) { |
| 27 | 42 | atomic_inc64(&n_block_); | |
| 28 | do { | ||
| 29 |
1/2✓ Branch 1 taken 84 times.
✗ Branch 2 not taken.
|
84 | throttle.Throttle(); |
| 30 |
2/2✓ Branch 1 taken 42 times.
✓ Branch 2 taken 42 times.
|
84 | } while (BlockItem::managed_bytes() > low_watermark_); |
| 31 | } | ||
| 32 | |||
| 33 |
2/4✓ Branch 1 taken 9748780 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 9748780 times.
|
9750457 | 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 9747532 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 9747532 times.
|
9748780 | if (item->GetSize(&size) == false) { |
| 38 | ✗ | PANIC(kLogStderr, "failed to fstat %s (%d)", item->path().c_str(), errno); | |
| 39 | } | ||
| 40 | 9747532 | item->set_size(size); | |
| 41 | |||
| 42 |
2/2✓ Branch 1 taken 9745497 times.
✓ Branch 2 taken 1606 times.
|
9746752 | if (item->may_have_chunks()) { |
| 43 | 19490604 | item->set_may_have_chunks( | |
| 44 |
1/2✓ Branch 3 taken 9745107 times.
✗ Branch 4 not taken.
|
9745497 | item->chunk_detector()->MightFindChunks(item->size())); |
| 45 | } | ||
| 46 | |||
| 47 | unsigned char *buffer[kBlockSize]; | ||
| 48 | 9746479 | const uint64_t tag = atomic_xadd64(&tag_seq_, 1); | |
| 49 | 9751549 | ssize_t nbytes = -1; | |
| 50 | 9751549 | unsigned cnt = 0; | |
| 51 | do { | ||
| 52 |
1/2✓ Branch 1 taken 21586847 times.
✗ Branch 2 not taken.
|
21569960 | nbytes = item->Read(buffer, kBlockSize); |
| 53 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 21586847 times.
|
21586847 | if (nbytes < 0) { |
| 54 | ✗ | PANIC(kLogStderr, "failed to read %s (%d)", item->path().c_str(), errno); | |
| 55 | } | ||
| 56 | |||
| 57 |
2/4✓ Branch 1 taken 21583883 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21547496 times.
✗ Branch 5 not taken.
|
21586847 | BlockItem *block_item = new BlockItem(tag, allocator_); |
| 58 |
1/2✓ Branch 1 taken 21544103 times.
✗ Branch 2 not taken.
|
21547496 | block_item->SetFileItem(item); |
| 59 |
2/2✓ Branch 0 taken 9742072 times.
✓ Branch 1 taken 11802031 times.
|
21544103 | if (nbytes == 0) { |
| 60 |
1/2✓ Branch 1 taken 9741487 times.
✗ Branch 2 not taken.
|
9742072 | item->Close(); |
| 61 |
1/2✓ Branch 1 taken 9740785 times.
✗ Branch 2 not taken.
|
9741487 | block_item->MakeStop(); |
| 62 | } else { | ||
| 63 |
1/2✓ Branch 1 taken 11850157 times.
✗ Branch 2 not taken.
|
11802031 | block_item->MakeDataCopy(reinterpret_cast<unsigned char *>(buffer), |
| 64 | nbytes); | ||
| 65 | } | ||
| 66 |
1/2✓ Branch 1 taken 21559391 times.
✗ Branch 2 not taken.
|
21590942 | tubes_out_->Dispatch(block_item); |
| 67 | |||
| 68 | 21559391 | cnt++; | |
| 69 |
2/2✓ Branch 0 taken 65832 times.
✓ Branch 1 taken 21493559 times.
|
21559391 | if ((cnt % 32) == 0) { |
| 70 | 131547 | if ((high_watermark_ > 0) | |
| 71 |
3/6✓ Branch 0 taken 65832 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 65715 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 65715 times.
|
65832 | && (BlockItem::managed_bytes() > high_watermark_)) { |
| 72 | ✗ | throttle.Throttle(); | |
| 73 | } | ||
| 74 | } | ||
| 75 |
2/2✓ Branch 0 taken 11818411 times.
✓ Branch 1 taken 9740863 times.
|
21559274 | } while (nbytes > 0); |
| 76 | 9740863 | } | |
| 77 | |||
| 78 | |||
| 79 | 96170 | void TaskRead::SetWatermarks(uint64_t low, uint64_t high) { | |
| 80 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 96170 times.
|
96170 | assert(high > low); |
| 81 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 96170 times.
|
96170 | assert(low > 0); |
| 82 | 96170 | low_watermark_ = low; | |
| 83 | 96170 | high_watermark_ = high; | |
| 84 | 96170 | } | |
| 85 |