GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/ingestion/task_compress.cc
Date: 2024-04-28 02:33:07
Exec Total Coverage
Lines: 40 41 97.6%
Branches: 42 72 58.3%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #include "cvmfs_config.h"
6 #include "task_compress.h"
7
8 #include <cstdlib>
9
10 #include "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 578298 void TaskCompress::Process(BlockItem *input_block) {
21
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 578188 times.
578298 assert(input_block->chunk_item() != NULL);
22
23
1/2
✓ Branch 2 taken 579505 times.
✗ Branch 3 not taken.
578188 zlib::Compressor *compressor = input_block->chunk_item()->GetCompressor();
24 579505 const int64_t tag = input_block->tag();
25 579149 const bool flush = input_block->type() == BlockItem::kBlockStop;
26 579412 unsigned char *input_data = input_block->data();
27 579354 size_t remaining_in_input = input_block->size();
28
29 579630 BlockItem *output_block = NULL;
30
3/4
✓ Branch 1 taken 580628 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 250101 times.
✓ Branch 4 taken 330527 times.
579630 if (!tag_map_.Lookup(tag, &output_block)) {
31 // So far unseen chunk, start new stream of compressed blocks
32
2/4
✓ Branch 1 taken 250122 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 249701 times.
✗ Branch 5 not taken.
250101 output_block = new BlockItem(tag, allocator_);
33
1/2
✓ Branch 2 taken 249612 times.
✗ Branch 3 not taken.
249701 output_block->SetFileItem(input_block->file_item());
34
1/2
✓ Branch 2 taken 249727 times.
✗ Branch 3 not taken.
249612 output_block->SetChunkItem(input_block->chunk_item());
35
1/2
✓ Branch 1 taken 250415 times.
✗ Branch 2 not taken.
249727 output_block->MakeData(kCompressedBlockSize);
36
1/2
✓ Branch 1 taken 250848 times.
✗ Branch 2 not taken.
250415 tag_map_.Insert(tag, output_block);
37 }
38
39 581375 bool done = false;
40 do {
41 649653 unsigned char *output_data = output_block->data() + output_block->size();
42
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 648847 times.
648941 assert(!output_block->IsFull());
43 size_t remaining_in_output =
44 648847 output_block->capacity() - output_block->size();
45
46
1/2
✓ Branch 1 taken 649763 times.
✗ Branch 2 not taken.
648801 done = compressor->Deflate(flush,
47 &input_data, &remaining_in_input, &output_data, &remaining_in_output);
48 // remaining_in_output is now number of consumed bytes
49 649763 output_block->set_size(output_block->size() + remaining_in_output);
50
51
2/2
✓ Branch 1 taken 135453 times.
✓ Branch 2 taken 513528 times.
649398 if (output_block->IsFull()) {
52
1/2
✓ Branch 1 taken 135488 times.
✗ Branch 2 not taken.
135453 tubes_out_->Dispatch(output_block);
53
2/4
✓ Branch 1 taken 135483 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 135373 times.
✗ Branch 5 not taken.
135488 output_block = new BlockItem(tag, allocator_);
54
1/2
✓ Branch 2 taken 135379 times.
✗ Branch 3 not taken.
135373 output_block->SetFileItem(input_block->file_item());
55
1/2
✓ Branch 2 taken 135368 times.
✗ Branch 3 not taken.
135379 output_block->SetChunkItem(input_block->chunk_item());
56
1/2
✓ Branch 1 taken 135618 times.
✗ Branch 2 not taken.
135368 output_block->MakeData(kCompressedBlockSize);
57
1/2
✓ Branch 1 taken 135582 times.
✗ Branch 2 not taken.
135618 tag_map_.Insert(tag, output_block);
58 }
59
6/6
✓ Branch 0 taken 67814 times.
✓ Branch 1 taken 581296 times.
✓ Branch 2 taken 250561 times.
✓ Branch 3 taken 330735 times.
✓ Branch 4 taken 464 times.
✓ Branch 5 taken 250097 times.
649110 } while ((remaining_in_input > 0) || (flush && !done));
60
61
2/2
✓ Branch 0 taken 250055 times.
✓ Branch 1 taken 330777 times.
580832 if (flush) {
62
1/2
✓ Branch 2 taken 249991 times.
✗ Branch 3 not taken.
250055 input_block->chunk_item()->ReleaseCompressor();
63
64
1/2
✓ Branch 1 taken 249975 times.
✗ Branch 2 not taken.
249991 if (output_block->size() > 0)
65
1/2
✓ Branch 1 taken 249754 times.
✗ Branch 2 not taken.
249975 tubes_out_->Dispatch(output_block);
66 else
67 delete output_block;
68
1/2
✓ Branch 1 taken 249592 times.
✗ Branch 2 not taken.
249753 tag_map_.Erase(tag);
69
70
2/4
✓ Branch 1 taken 250052 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 249385 times.
✗ Branch 5 not taken.
249592 BlockItem *stop_block = new BlockItem(tag, allocator_);
71
1/2
✓ Branch 1 taken 249634 times.
✗ Branch 2 not taken.
249385 stop_block->MakeStop();
72
1/2
✓ Branch 2 taken 249460 times.
✗ Branch 3 not taken.
249634 stop_block->SetFileItem(input_block->file_item());
73
1/2
✓ Branch 2 taken 249391 times.
✗ Branch 3 not taken.
249460 stop_block->SetChunkItem(input_block->chunk_item());
74
1/2
✓ Branch 1 taken 249426 times.
✗ Branch 2 not taken.
249391 tubes_out_->Dispatch(stop_block);
75 }
76
77
1/2
✓ Branch 0 taken 580223 times.
✗ Branch 1 not taken.
580203 delete input_block;
78 580720 }
79