2017-12-12 00:16:37 +01:00
|
|
|
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
|
|
|
// 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).
|
|
|
|
//
|
|
|
|
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
#include "table/block.h"
|
|
|
|
#include "table/format.h"
|
|
|
|
|
2018-10-03 02:21:54 +02:00
|
|
|
#include "util/cache_allocator.h"
|
|
|
|
|
2017-12-12 00:16:37 +01:00
|
|
|
namespace rocksdb {
|
|
|
|
class BlockFetcher {
|
|
|
|
public:
|
|
|
|
// Read the block identified by "handle" from "file".
|
|
|
|
// 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
|
|
|
|
// dictionary.
|
|
|
|
BlockFetcher(RandomAccessFileReader* file,
|
|
|
|
FilePrefetchBuffer* prefetch_buffer, const Footer& footer,
|
|
|
|
const ReadOptions& read_options, const BlockHandle& handle,
|
2018-06-28 02:09:29 +02:00
|
|
|
BlockContents* contents, const ImmutableCFOptions& ioptions,
|
2017-12-12 00:16:37 +01:00
|
|
|
bool do_uncompress, const Slice& compression_dict,
|
2018-06-28 02:09:29 +02:00
|
|
|
const PersistentCacheOptions& cache_options,
|
2018-10-03 02:21:54 +02:00
|
|
|
CacheAllocator* allocator = nullptr,
|
2018-06-28 02:09:29 +02:00
|
|
|
const bool immortal_source = false)
|
2017-12-12 00:16:37 +01:00
|
|
|
: file_(file),
|
|
|
|
prefetch_buffer_(prefetch_buffer),
|
|
|
|
footer_(footer),
|
|
|
|
read_options_(read_options),
|
|
|
|
handle_(handle),
|
|
|
|
contents_(contents),
|
|
|
|
ioptions_(ioptions),
|
|
|
|
do_uncompress_(do_uncompress),
|
2018-06-28 02:09:29 +02:00
|
|
|
immortal_source_(immortal_source),
|
2017-12-12 00:16:37 +01:00
|
|
|
compression_dict_(compression_dict),
|
2018-10-03 02:21:54 +02:00
|
|
|
cache_options_(cache_options),
|
|
|
|
allocator_(allocator) {}
|
2017-12-12 00:16:37 +01:00
|
|
|
Status ReadBlockContents();
|
|
|
|
|
|
|
|
private:
|
|
|
|
static const uint32_t kDefaultStackBufferSize = 5000;
|
|
|
|
|
|
|
|
RandomAccessFileReader* file_;
|
|
|
|
FilePrefetchBuffer* prefetch_buffer_;
|
|
|
|
const Footer& footer_;
|
2017-12-12 21:08:52 +01:00
|
|
|
const ReadOptions read_options_;
|
2017-12-12 00:16:37 +01:00
|
|
|
const BlockHandle& handle_;
|
|
|
|
BlockContents* contents_;
|
|
|
|
const ImmutableCFOptions& ioptions_;
|
|
|
|
bool do_uncompress_;
|
2018-06-28 02:09:29 +02:00
|
|
|
const bool immortal_source_;
|
2017-12-12 00:16:37 +01:00
|
|
|
const Slice& compression_dict_;
|
|
|
|
const PersistentCacheOptions& cache_options_;
|
2018-10-03 02:21:54 +02:00
|
|
|
CacheAllocator* allocator_;
|
2017-12-12 00:16:37 +01:00
|
|
|
Status status_;
|
|
|
|
Slice slice_;
|
|
|
|
char* used_buf_ = nullptr;
|
|
|
|
size_t block_size_;
|
2018-10-03 02:21:54 +02:00
|
|
|
CacheAllocationPtr heap_buf_;
|
2017-12-12 00:16:37 +01:00
|
|
|
char stack_buf_[kDefaultStackBufferSize];
|
|
|
|
bool got_from_prefetch_buffer_ = false;
|
|
|
|
rocksdb::CompressionType compression_type;
|
|
|
|
|
|
|
|
// return true if found
|
|
|
|
bool TryGetUncompressBlockFromPersistentCache();
|
|
|
|
// return true if found
|
|
|
|
bool TryGetFromPrefetchBuffer();
|
|
|
|
bool TryGetCompressedBlockFromPersistentCache();
|
|
|
|
void PrepareBufferForBlockFromFile();
|
|
|
|
void GetBlockContents();
|
|
|
|
void InsertCompressedBlockToPersistentCacheIfNeeded();
|
|
|
|
void InsertUncompressedBlockToPersistentCacheIfNeeded();
|
|
|
|
void CheckBlockChecksum();
|
|
|
|
};
|
|
|
|
} // namespace rocksdb
|