simple_mixed_compressor.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. #pragma once
  9. #include <memory>
  10. #include <vector>
  11. #include "compression.h"
  12. #include "rocksdb/advanced_compression.h"
  13. namespace ROCKSDB_NAMESPACE {
  14. class MultiCompressorWrapper : public Compressor {
  15. public:
  16. explicit MultiCompressorWrapper(const CompressionOptions& opts,
  17. CompressionDict&& dict = {});
  18. size_t GetMaxSampleSizeIfWantDict(CacheEntryRole block_type) const override;
  19. Slice GetSerializedDict() const override;
  20. CompressionType GetPreferredCompressionType() const override;
  21. ManagedWorkingArea ObtainWorkingArea() override;
  22. std::unique_ptr<Compressor> MaybeCloneSpecialized(
  23. CacheEntryRole block_type, DictSampleArgs&& dict_samples) override;
  24. protected:
  25. std::vector<std::unique_ptr<Compressor>> compressors_;
  26. };
  27. struct RandomMixedCompressor : public MultiCompressorWrapper {
  28. using MultiCompressorWrapper::MultiCompressorWrapper;
  29. const char* Name() const override;
  30. Status CompressBlock(Slice uncompressed_data, char* compressed_output,
  31. size_t* compressed_output_size,
  32. CompressionType* out_compression_type,
  33. ManagedWorkingArea* wa) override;
  34. };
  35. class RandomMixedCompressionManager : public CompressionManagerWrapper {
  36. using CompressionManagerWrapper::CompressionManagerWrapper;
  37. const char* Name() const override;
  38. std::unique_ptr<Compressor> GetCompressorForSST(
  39. const FilterBuildingContext& context, const CompressionOptions& opts,
  40. CompressionType preferred) override;
  41. };
  42. struct RoundRobinCompressor : public MultiCompressorWrapper {
  43. using MultiCompressorWrapper::MultiCompressorWrapper;
  44. const char* Name() const override;
  45. Status CompressBlock(Slice uncompressed_data, char* compressed_output,
  46. size_t* compressed_output_size,
  47. CompressionType* out_compression_type,
  48. ManagedWorkingArea* wa) override;
  49. static RelaxedAtomic<uint64_t> block_counter;
  50. };
  51. class RoundRobinManager : public CompressionManagerWrapper {
  52. using CompressionManagerWrapper::CompressionManagerWrapper;
  53. const char* Name() const override;
  54. std::unique_ptr<Compressor> GetCompressorForSST(
  55. const FilterBuildingContext& context, const CompressionOptions& opts,
  56. CompressionType preferred) override;
  57. };
  58. } // namespace ROCKSDB_NAMESPACE