GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/ingestion/task_compress.cc
Date: 2026-01-04 02:35:37
Exec Total Coverage
Lines: 42 42 100.0%
Branches: 44 72 61.1%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5
6 #include "task_compress.h"
7
8 #include <cstdlib>
9
10 #include "compression/compression.h"
11 #include "util/logging.h"
12 #include "util/smalloc.h"
13
14
15 /**
16 * The data payload of the blocks is replaced by their compressed counterparts.
17 * The block tags stay the same.
18 * TODO(jblomer): avoid memory copy with EchoCompressor
19 */
20 19675774 void TaskCompress::Process(BlockItem *input_block) {
21
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 19665744 times.
19675774 assert(input_block->chunk_item() != NULL);
22
23
1/2
✓ Branch 2 taken 19710488 times.
✗ Branch 3 not taken.
19665744 zlib::Compressor *compressor = input_block->chunk_item()->GetCompressor();
24 19710488 const int64_t tag = input_block->tag();
25 19688932 const bool flush = input_block->type() == BlockItem::kBlockStop;
26 19698316 unsigned char *input_data = input_block->data();
27 19701954 size_t remaining_in_input = input_block->size();
28
29 19708414 BlockItem *output_block = NULL;
30
3/4
✓ Branch 1 taken 19735138 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8491834 times.
✓ Branch 4 taken 11243304 times.
19708414 if (!tag_map_.Lookup(tag, &output_block)) {
31 // So far unseen chunk, start new stream of compressed blocks
32
2/4
✓ Branch 1 taken 8493636 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8486904 times.
✗ Branch 5 not taken.
8491834 output_block = new BlockItem(tag, allocator_);
33
1/2
✓ Branch 2 taken 8484150 times.
✗ Branch 3 not taken.
8486904 output_block->SetFileItem(input_block->file_item());
34
1/2
✓ Branch 2 taken 8484082 times.
✗ Branch 3 not taken.
8484150 output_block->SetChunkItem(input_block->chunk_item());
35
1/2
✓ Branch 1 taken 8513254 times.
✗ Branch 2 not taken.
8484082 output_block->MakeData(kCompressedBlockSize);
36
1/2
✓ Branch 1 taken 8533212 times.
✗ Branch 2 not taken.
8513254 tag_map_.Insert(tag, output_block);
37 }
38
39 19776516 bool done = false;
40 do {
41 22093100 unsigned char *output_data = output_block->data() + output_block->size();
42
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 22072190 times.
22074434 assert(!output_block->IsFull());
43 22072190 size_t remaining_in_output = output_block->capacity()
44 22070388 - output_block->size();
45
46
1/2
✓ Branch 1 taken 22097044 times.
✗ Branch 2 not taken.
22071612 done = compressor->Deflate(flush, &input_data, &remaining_in_input,
47 &output_data, &remaining_in_output);
48 // remaining_in_output is now number of consumed bytes
49 22097044 output_block->set_size(output_block->size() + remaining_in_output);
50
51
2/2
✓ Branch 1 taken 4607422 times.
✓ Branch 2 taken 17455860 times.
22072768 if (output_block->IsFull()) {
52
1/2
✓ Branch 1 taken 4608102 times.
✗ Branch 2 not taken.
4607422 tubes_out_->Dispatch(output_block);
53
2/4
✓ Branch 1 taken 4608204 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4604906 times.
✗ Branch 5 not taken.
4608102 output_block = new BlockItem(tag, allocator_);
54
1/2
✓ Branch 2 taken 4604056 times.
✗ Branch 3 not taken.
4604906 output_block->SetFileItem(input_block->file_item());
55
1/2
✓ Branch 2 taken 4604090 times.
✗ Branch 3 not taken.
4604056 output_block->SetChunkItem(input_block->chunk_item());
56
1/2
✓ Branch 1 taken 4611468 times.
✗ Branch 2 not taken.
4604090 output_block->MakeData(kCompressedBlockSize);
57
1/2
✓ Branch 1 taken 4610482 times.
✗ Branch 2 not taken.
4611468 tag_map_.Insert(tag, output_block);
58 }
59
6/6
✓ Branch 0 taken 2300780 times.
✓ Branch 1 taken 19765562 times.
✓ Branch 2 taken 8518416 times.
✓ Branch 3 taken 11247146 times.
✓ Branch 4 taken 15804 times.
✓ Branch 5 taken 8502612 times.
22066342 } while ((remaining_in_input > 0) || (flush && !done));
60
61
2/2
✓ Branch 0 taken 8502782 times.
✓ Branch 1 taken 11246976 times.
19749758 if (flush) {
62
1/2
✓ Branch 2 taken 8499246 times.
✗ Branch 3 not taken.
8502782 input_block->chunk_item()->ReleaseCompressor();
63
64
2/2
✓ Branch 1 taken 8497702 times.
✓ Branch 2 taken 48 times.
8499246 if (output_block->size() > 0)
65
1/2
✓ Branch 1 taken 8494030 times.
✗ Branch 2 not taken.
8497702 tubes_out_->Dispatch(output_block);
66 else
67
1/2
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
48 delete output_block;
68
1/2
✓ Branch 1 taken 8493976 times.
✗ Branch 2 not taken.
8494078 tag_map_.Erase(tag);
69
70
2/4
✓ Branch 1 taken 8495642 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8489046 times.
✗ Branch 5 not taken.
8493976 BlockItem *stop_block = new BlockItem(tag, allocator_);
71
1/2
✓ Branch 1 taken 8485986 times.
✗ Branch 2 not taken.
8489046 stop_block->MakeStop();
72
1/2
✓ Branch 2 taken 8483198 times.
✗ Branch 3 not taken.
8485986 stop_block->SetFileItem(input_block->file_item());
73
1/2
✓ Branch 2 taken 8483504 times.
✗ Branch 3 not taken.
8483198 stop_block->SetChunkItem(input_block->chunk_item());
74
1/2
✓ Branch 1 taken 8482926 times.
✗ Branch 2 not taken.
8483504 tubes_out_->Dispatch(stop_block);
75 }
76
77
2/2
✓ Branch 0 taken 19715384 times.
✓ Branch 1 taken 14518 times.
19729902 delete input_block;
78 19768220 }
79