forked from continuwuation/rocksdb
Summary: ... from https://github.com/facebook/rocksdb/issues/14140. The assertion in the default implementation of CompressorWrapper::MaybeCloneSpecialized() could fail because this wrapper wasn't overriding it when it should. (See the NOTE on that implementation.) Because this release already has a breaking modification to the Compressor API (adding Clone()), I took this opportunity to add 'const' to MaybeCloneSpecialized(). Also marked some compression classes as 'final' that could be marked as such. Pull Request resolved: https://github.com/facebook/rocksdb/pull/14150 Test Plan: unit test expanded to cover this case (verified failing before). Audited the rest of our CompressorWrappers. Reviewed By: archang19 Differential Revision: D87793987 Pulled By: pdillinger fbshipit-source-id: 61c4469b84e4a47451a9942df09277faeeccfe63
72 lines
2.8 KiB
C++
72 lines
2.8 KiB
C++
// 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.
|
|
|
|
#pragma once
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "compression.h"
|
|
#include "rocksdb/advanced_compression.h"
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
|
|
class MultiCompressorWrapper : public Compressor {
|
|
public:
|
|
explicit MultiCompressorWrapper(const CompressionOptions& opts,
|
|
CompressionDict&& dict = {});
|
|
|
|
size_t GetMaxSampleSizeIfWantDict(CacheEntryRole block_type) const override;
|
|
Slice GetSerializedDict() const override;
|
|
CompressionType GetPreferredCompressionType() const override;
|
|
ManagedWorkingArea ObtainWorkingArea() override;
|
|
std::unique_ptr<Compressor> MaybeCloneSpecialized(
|
|
CacheEntryRole block_type, DictSampleArgs&& dict_samples) const override;
|
|
|
|
protected:
|
|
const CompressionOptions opts_;
|
|
std::vector<std::unique_ptr<Compressor>> compressors_;
|
|
};
|
|
|
|
struct RandomMixedCompressor : public MultiCompressorWrapper {
|
|
using MultiCompressorWrapper::MultiCompressorWrapper;
|
|
const char* Name() const override;
|
|
std::unique_ptr<Compressor> Clone() const override;
|
|
Status CompressBlock(Slice uncompressed_data, char* compressed_output,
|
|
size_t* compressed_output_size,
|
|
CompressionType* out_compression_type,
|
|
ManagedWorkingArea* wa) override;
|
|
};
|
|
|
|
class RandomMixedCompressionManager : public CompressionManagerWrapper {
|
|
using CompressionManagerWrapper::CompressionManagerWrapper;
|
|
const char* Name() const override;
|
|
std::unique_ptr<Compressor> GetCompressorForSST(
|
|
const FilterBuildingContext& context, const CompressionOptions& opts,
|
|
CompressionType preferred) override;
|
|
};
|
|
|
|
struct RoundRobinCompressor : public MultiCompressorWrapper {
|
|
using MultiCompressorWrapper::MultiCompressorWrapper;
|
|
const char* Name() const override;
|
|
std::unique_ptr<Compressor> Clone() const override;
|
|
Status CompressBlock(Slice uncompressed_data, char* compressed_output,
|
|
size_t* compressed_output_size,
|
|
CompressionType* out_compression_type,
|
|
ManagedWorkingArea* wa) override;
|
|
static RelaxedAtomic<uint64_t> block_counter;
|
|
};
|
|
|
|
class RoundRobinManager : public CompressionManagerWrapper {
|
|
using CompressionManagerWrapper::CompressionManagerWrapper;
|
|
const char* Name() const override;
|
|
std::unique_ptr<Compressor> GetCompressorForSST(
|
|
const FilterBuildingContext& context, const CompressionOptions& opts,
|
|
CompressionType preferred) override;
|
|
};
|
|
|
|
} // namespace ROCKSDB_NAMESPACE
|