| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | //  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).#include "table/persistent_cache_helper.h"#include "table/block_based/block_based_table_reader.h"#include "table/format.h"namespace ROCKSDB_NAMESPACE {void PersistentCacheHelper::InsertRawPage(    const PersistentCacheOptions& cache_options, const BlockHandle& handle,    const char* data, const size_t size) {  assert(cache_options.persistent_cache);  assert(cache_options.persistent_cache->IsCompressed());  // construct the page key  char cache_key[BlockBasedTable::kMaxCacheKeyPrefixSize + kMaxVarint64Length];  auto key = BlockBasedTable::GetCacheKey(cache_options.key_prefix.c_str(),                                          cache_options.key_prefix.size(),                                          handle, cache_key);  // insert content to cache  cache_options.persistent_cache->Insert(key, data, size);}void PersistentCacheHelper::InsertUncompressedPage(    const PersistentCacheOptions& cache_options, const BlockHandle& handle,    const BlockContents& contents) {  assert(cache_options.persistent_cache);  assert(!cache_options.persistent_cache->IsCompressed());  // Precondition:  // (1) content is cacheable  // (2) content is not compressed  // construct the page key  char cache_key[BlockBasedTable::kMaxCacheKeyPrefixSize + kMaxVarint64Length];  auto key = BlockBasedTable::GetCacheKey(cache_options.key_prefix.c_str(),                                          cache_options.key_prefix.size(),                                          handle, cache_key);  // insert block contents to page cache  cache_options.persistent_cache->Insert(key, contents.data.data(),                                         contents.data.size());}Status PersistentCacheHelper::LookupRawPage(    const PersistentCacheOptions& cache_options, const BlockHandle& handle,    std::unique_ptr<char[]>* raw_data, const size_t raw_data_size) {#ifdef NDEBUG  (void)raw_data_size;#endif  assert(cache_options.persistent_cache);  assert(cache_options.persistent_cache->IsCompressed());  // construct the page key  char cache_key[BlockBasedTable::kMaxCacheKeyPrefixSize + kMaxVarint64Length];  auto key = BlockBasedTable::GetCacheKey(cache_options.key_prefix.c_str(),                                          cache_options.key_prefix.size(),                                          handle, cache_key);  // Lookup page  size_t size;  Status s = cache_options.persistent_cache->Lookup(key, raw_data, &size);  if (!s.ok()) {    // cache miss    RecordTick(cache_options.statistics, PERSISTENT_CACHE_MISS);    return s;  }  // cache hit  assert(raw_data_size == handle.size() + kBlockTrailerSize);  assert(size == raw_data_size);  RecordTick(cache_options.statistics, PERSISTENT_CACHE_HIT);  return Status::OK();}Status PersistentCacheHelper::LookupUncompressedPage(    const PersistentCacheOptions& cache_options, const BlockHandle& handle,    BlockContents* contents) {  assert(cache_options.persistent_cache);  assert(!cache_options.persistent_cache->IsCompressed());  if (!contents) {    // We shouldn't lookup in the cache. Either    // (1) Nowhere to store    return Status::NotFound();  }  // construct the page key  char cache_key[BlockBasedTable::kMaxCacheKeyPrefixSize + kMaxVarint64Length];  auto key = BlockBasedTable::GetCacheKey(cache_options.key_prefix.c_str(),                                          cache_options.key_prefix.size(),                                          handle, cache_key);  // Lookup page  std::unique_ptr<char[]> data;  size_t size;  Status s = cache_options.persistent_cache->Lookup(key, &data, &size);  if (!s.ok()) {    // cache miss    RecordTick(cache_options.statistics, PERSISTENT_CACHE_MISS);    return s;  }  // please note we are potentially comparing compressed data size with  // uncompressed data size  assert(handle.size() <= size);  // update stats  RecordTick(cache_options.statistics, PERSISTENT_CACHE_HIT);  // construct result and return  *contents = BlockContents(std::move(data), size);  return Status::OK();}}  // namespace ROCKSDB_NAMESPACE
 |