#pragma once
#include "table/block.h"
#include "table/format.h"
+#include "util/memory_allocator.h"
namespace rocksdb {
class BlockFetcher {
// The only relevant option is options.verify_checksums for now.
// On failure return non-OK.
// On success fill *result and return OK - caller owns *result
- // @param compression_dict Data for presetting the compression library's
+ // @param uncompression_dict Data for presetting the compression library's
// dictionary.
BlockFetcher(RandomAccessFileReader* file,
FilePrefetchBuffer* prefetch_buffer, const Footer& footer,
const ReadOptions& read_options, const BlockHandle& handle,
BlockContents* contents, const ImmutableCFOptions& ioptions,
- bool do_uncompress, const Slice& compression_dict,
+ bool do_uncompress, bool maybe_compressed,
+ const UncompressionDict& uncompression_dict,
const PersistentCacheOptions& cache_options,
- const bool immortal_source = false)
+ MemoryAllocator* memory_allocator = nullptr,
+ MemoryAllocator* memory_allocator_compressed = nullptr)
: file_(file),
prefetch_buffer_(prefetch_buffer),
footer_(footer),
contents_(contents),
ioptions_(ioptions),
do_uncompress_(do_uncompress),
- immortal_source_(immortal_source),
- compression_dict_(compression_dict),
- cache_options_(cache_options) {}
+ maybe_compressed_(maybe_compressed),
+ uncompression_dict_(uncompression_dict),
+ cache_options_(cache_options),
+ memory_allocator_(memory_allocator),
+ memory_allocator_compressed_(memory_allocator_compressed) {}
Status ReadBlockContents();
+ CompressionType get_compression_type() const { return compression_type_; }
private:
static const uint32_t kDefaultStackBufferSize = 5000;
BlockContents* contents_;
const ImmutableCFOptions& ioptions_;
bool do_uncompress_;
- const bool immortal_source_;
- const Slice& compression_dict_;
+ bool maybe_compressed_;
+ const UncompressionDict& uncompression_dict_;
const PersistentCacheOptions& cache_options_;
+ MemoryAllocator* memory_allocator_;
+ MemoryAllocator* memory_allocator_compressed_;
Status status_;
Slice slice_;
char* used_buf_ = nullptr;
size_t block_size_;
- std::unique_ptr<char[]> heap_buf_;
+ CacheAllocationPtr heap_buf_;
+ CacheAllocationPtr compressed_buf_;
char stack_buf_[kDefaultStackBufferSize];
bool got_from_prefetch_buffer_ = false;
- rocksdb::CompressionType compression_type;
+ rocksdb::CompressionType compression_type_;
// return true if found
bool TryGetUncompressBlockFromPersistentCache();
bool TryGetFromPrefetchBuffer();
bool TryGetCompressedBlockFromPersistentCache();
void PrepareBufferForBlockFromFile();
+ // Copy content from used_buf_ to new heap buffer.
+ void CopyBufferToHeap();
void GetBlockContents();
void InsertCompressedBlockToPersistentCacheIfNeeded();
void InsertUncompressedBlockToPersistentCacheIfNeeded();