simple_mixed_compressor.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // Copyright (c) Meta Platforms, Inc. and affiliates.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. //
  6. // Creates mixed compressor wrapper which uses multiple compression algorithm
  7. // within same SST file.
  8. #include "simple_mixed_compressor.h"
  9. #include <options/options_helper.h>
  10. #include "random.h"
  11. #include "rocksdb/advanced_compression.h"
  12. namespace ROCKSDB_NAMESPACE {
  13. // MultiCompressorWrapper implementation
  14. MultiCompressorWrapper::MultiCompressorWrapper(const CompressionOptions& opts,
  15. CompressionDict&& dict) {
  16. // TODO: make the compression manager a field
  17. auto builtInManager = GetBuiltinV2CompressionManager();
  18. const auto& compressions = GetSupportedCompressions();
  19. for (auto type : compressions) {
  20. if (type == kNoCompression) {
  21. continue;
  22. }
  23. compressors_.push_back(builtInManager->GetCompressor(opts, type));
  24. }
  25. (void)dict;
  26. }
  27. size_t MultiCompressorWrapper::GetMaxSampleSizeIfWantDict(
  28. CacheEntryRole block_type) const {
  29. return compressors_.back()->GetMaxSampleSizeIfWantDict(block_type);
  30. }
  31. Slice MultiCompressorWrapper::GetSerializedDict() const {
  32. return compressors_.back()->GetSerializedDict();
  33. }
  34. CompressionType MultiCompressorWrapper::GetPreferredCompressionType() const {
  35. return compressors_.back()->GetPreferredCompressionType();
  36. }
  37. Compressor::ManagedWorkingArea MultiCompressorWrapper::ObtainWorkingArea() {
  38. return compressors_.back()->ObtainWorkingArea();
  39. }
  40. std::unique_ptr<Compressor> MultiCompressorWrapper::MaybeCloneSpecialized(
  41. CacheEntryRole block_type, DictSampleArgs&& dict_samples) {
  42. // TODO: full dictionary compression support. Currently this just falls
  43. // back on a non-multi compressor when asked to use a dictionary.
  44. return compressors_.back()->MaybeCloneSpecialized(block_type,
  45. std::move(dict_samples));
  46. }
  47. // RandomMixedCompressor implementation
  48. const char* RandomMixedCompressor::Name() const {
  49. return "RandomMixedCompressor";
  50. }
  51. Status RandomMixedCompressor::CompressBlock(
  52. Slice uncompressed_data, char* compressed_output,
  53. size_t* compressed_output_size, CompressionType* out_compression_type,
  54. ManagedWorkingArea* wa) {
  55. auto selected =
  56. Random::GetTLSInstance()->Uniform(static_cast<int>(compressors_.size()));
  57. auto& compressor = compressors_[selected];
  58. return compressor->CompressBlock(uncompressed_data, compressed_output,
  59. compressed_output_size, out_compression_type,
  60. wa);
  61. }
  62. const char* RandomMixedCompressionManager::Name() const {
  63. return "RandomMixedCompressionManager";
  64. }
  65. std::unique_ptr<Compressor> RandomMixedCompressionManager::GetCompressorForSST(
  66. const FilterBuildingContext& /*context*/, const CompressionOptions& opts,
  67. CompressionType /*preferred*/) {
  68. return std::make_unique<RandomMixedCompressor>(opts);
  69. }
  70. // RoundRobinCompressor implementation
  71. const char* RoundRobinCompressor::Name() const {
  72. return "RoundRobinCompressor";
  73. }
  74. Status RoundRobinCompressor::CompressBlock(
  75. Slice uncompressed_data, char* compressed_output,
  76. size_t* compressed_output_size, CompressionType* out_compression_type,
  77. ManagedWorkingArea* wa) {
  78. auto counter = block_counter.FetchAddRelaxed(1);
  79. auto sel_idx = counter % (compressors_.size());
  80. auto& compressor = compressors_[sel_idx];
  81. return compressor->CompressBlock(uncompressed_data, compressed_output,
  82. compressed_output_size, out_compression_type,
  83. wa);
  84. }
  85. RelaxedAtomic<uint64_t> RoundRobinCompressor::block_counter{0};
  86. // RoundRobinManager implementation
  87. const char* RoundRobinManager::Name() const { return "RoundRobinManager"; }
  88. std::unique_ptr<Compressor> RoundRobinManager::GetCompressorForSST(
  89. const FilterBuildingContext& /*context*/, const CompressionOptions& opts,
  90. CompressionType /*preferred*/) {
  91. return std::make_unique<RoundRobinCompressor>(opts);
  92. }
  93. } // namespace ROCKSDB_NAMESPACE