-
Notifications
You must be signed in to change notification settings - Fork 6.9k
Expand file tree
/
Copy pathsimple_mixed_compressor.cc
More file actions
119 lines (98 loc) · 4.27 KB
/
Copy pathsimple_mixed_compressor.cc
File metadata and controls
119 lines (98 loc) · 4.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// Copyright (c) Meta Platforms, Inc. and affiliates.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Creates mixed compressor wrapper which uses multiple compression algorithm
// within same SST file.
#include "simple_mixed_compressor.h"
#include <options/options_helper.h>
#include "random.h"
#include "rocksdb/advanced_compression.h"
namespace ROCKSDB_NAMESPACE {
// MultiCompressorWrapper implementation
MultiCompressorWrapper::MultiCompressorWrapper(const CompressionOptions& opts)
: opts_(opts) {
// TODO: make the compression manager a field
auto builtInManager = GetBuiltinV2CompressionManager();
const auto& compressions = GetSupportedCompressions();
for (auto type : compressions) {
if (type == kNoCompression) {
continue;
}
compressors_.push_back(builtInManager->GetCompressor(opts, type));
}
}
Compressor::DictConfig MultiCompressorWrapper::GetDictGuidance(
CacheEntryRole block_type) const {
return compressors_.back()->GetDictGuidance(block_type);
}
Slice MultiCompressorWrapper::GetSerializedDict() const {
return compressors_.back()->GetSerializedDict();
}
CompressionType MultiCompressorWrapper::GetPreferredCompressionType() const {
return compressors_.back()->GetPreferredCompressionType();
}
Compressor::ManagedWorkingArea MultiCompressorWrapper::ObtainWorkingArea() {
return compressors_.back()->ObtainWorkingArea();
}
std::unique_ptr<Compressor> MultiCompressorWrapper::MaybeCloneSpecialized(
CacheEntryRole block_type, DictConfigArgs&& dict_config) const {
// TODO: full dictionary compression support. Currently this just falls
// back on a non-multi compressor when asked to use a dictionary.
return compressors_.back()->MaybeCloneSpecialized(block_type,
std::move(dict_config));
}
// RandomMixedCompressor implementation
const char* RandomMixedCompressor::Name() const {
return "RandomMixedCompressor";
}
std::unique_ptr<Compressor> RandomMixedCompressor::Clone() const {
return std::make_unique<RandomMixedCompressor>(opts_);
}
Status RandomMixedCompressor::CompressBlock(
Slice uncompressed_data, char* compressed_output,
size_t* compressed_output_size, CompressionType* out_compression_type,
ManagedWorkingArea* wa) {
auto selected =
Random::GetTLSInstance()->Uniform(static_cast<int>(compressors_.size()));
auto& compressor = compressors_[selected];
return compressor->CompressBlock(uncompressed_data, compressed_output,
compressed_output_size, out_compression_type,
wa);
}
const char* RandomMixedCompressionManager::Name() const {
return "RandomMixedCompressionManager";
}
std::unique_ptr<Compressor> RandomMixedCompressionManager::GetCompressorForSST(
const FilterBuildingContext& /*context*/, const CompressionOptions& opts,
CompressionType /*preferred*/) {
return std::make_unique<RandomMixedCompressor>(opts);
}
// RoundRobinCompressor implementation
const char* RoundRobinCompressor::Name() const {
return "RoundRobinCompressor";
}
std::unique_ptr<Compressor> RoundRobinCompressor::Clone() const {
return std::make_unique<RoundRobinCompressor>(opts_);
}
Status RoundRobinCompressor::CompressBlock(
Slice uncompressed_data, char* compressed_output,
size_t* compressed_output_size, CompressionType* out_compression_type,
ManagedWorkingArea* wa) {
auto counter = block_counter.FetchAddRelaxed(1);
auto sel_idx = counter % (compressors_.size());
auto& compressor = compressors_[sel_idx];
return compressor->CompressBlock(uncompressed_data, compressed_output,
compressed_output_size, out_compression_type,
wa);
}
RelaxedAtomic<uint64_t> RoundRobinCompressor::block_counter{0};
// RoundRobinManager implementation
const char* RoundRobinManager::Name() const { return "RoundRobinManager"; }
std::unique_ptr<Compressor> RoundRobinManager::GetCompressorForSST(
const FilterBuildingContext& /*context*/, const CompressionOptions& opts,
CompressionType /*preferred*/) {
return std::make_unique<RoundRobinCompressor>(opts);
}
} // namespace ROCKSDB_NAMESPACE