]> git.proxmox.com Git - ceph.git/blame - ceph/src/rocksdb/table/persistent_cache_helper.cc
import 14.2.4 nautilus point release
[ceph.git] / ceph / src / rocksdb / table / persistent_cache_helper.cc
CommitLineData
7c673cae 1// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
11fdf7f2
TL
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).
7c673cae
FG
5
6#include "table/persistent_cache_helper.h"
7#include "table/block_based_table_reader.h"
8#include "table/format.h"
9
10namespace rocksdb {
11
12void PersistentCacheHelper::InsertRawPage(
13 const PersistentCacheOptions& cache_options, const BlockHandle& handle,
14 const char* data, const size_t size) {
15 assert(cache_options.persistent_cache);
16 assert(cache_options.persistent_cache->IsCompressed());
17
18 // construct the page key
19 char cache_key[BlockBasedTable::kMaxCacheKeyPrefixSize + kMaxVarint64Length];
20 auto key = BlockBasedTable::GetCacheKey(cache_options.key_prefix.c_str(),
21 cache_options.key_prefix.size(),
22 handle, cache_key);
23 // insert content to cache
24 cache_options.persistent_cache->Insert(key, data, size);
25}
26
27void PersistentCacheHelper::InsertUncompressedPage(
28 const PersistentCacheOptions& cache_options, const BlockHandle& handle,
29 const BlockContents& contents) {
30 assert(cache_options.persistent_cache);
31 assert(!cache_options.persistent_cache->IsCompressed());
494da23a
TL
32 // Precondition:
33 // (1) content is cacheable
34 // (2) content is not compressed
7c673cae
FG
35
36 // construct the page key
37 char cache_key[BlockBasedTable::kMaxCacheKeyPrefixSize + kMaxVarint64Length];
38 auto key = BlockBasedTable::GetCacheKey(cache_options.key_prefix.c_str(),
39 cache_options.key_prefix.size(),
40 handle, cache_key);
41 // insert block contents to page cache
42 cache_options.persistent_cache->Insert(key, contents.data.data(),
43 contents.data.size());
44}
45
46Status PersistentCacheHelper::LookupRawPage(
47 const PersistentCacheOptions& cache_options, const BlockHandle& handle,
48 std::unique_ptr<char[]>* raw_data, const size_t raw_data_size) {
11fdf7f2
TL
49#ifdef NDEBUG
50 (void)raw_data_size;
51#endif
7c673cae
FG
52 assert(cache_options.persistent_cache);
53 assert(cache_options.persistent_cache->IsCompressed());
54
55 // construct the page key
56 char cache_key[BlockBasedTable::kMaxCacheKeyPrefixSize + kMaxVarint64Length];
57 auto key = BlockBasedTable::GetCacheKey(cache_options.key_prefix.c_str(),
58 cache_options.key_prefix.size(),
59 handle, cache_key);
60 // Lookup page
61 size_t size;
62 Status s = cache_options.persistent_cache->Lookup(key, raw_data, &size);
63 if (!s.ok()) {
64 // cache miss
65 RecordTick(cache_options.statistics, PERSISTENT_CACHE_MISS);
66 return s;
67 }
68
69 // cache hit
70 assert(raw_data_size == handle.size() + kBlockTrailerSize);
71 assert(size == raw_data_size);
72 RecordTick(cache_options.statistics, PERSISTENT_CACHE_HIT);
73 return Status::OK();
74}
75
76Status PersistentCacheHelper::LookupUncompressedPage(
77 const PersistentCacheOptions& cache_options, const BlockHandle& handle,
78 BlockContents* contents) {
79 assert(cache_options.persistent_cache);
80 assert(!cache_options.persistent_cache->IsCompressed());
81 if (!contents) {
82 // We shouldn't lookup in the cache. Either
83 // (1) Nowhere to store
84 return Status::NotFound();
85 }
86
87 // construct the page key
88 char cache_key[BlockBasedTable::kMaxCacheKeyPrefixSize + kMaxVarint64Length];
89 auto key = BlockBasedTable::GetCacheKey(cache_options.key_prefix.c_str(),
90 cache_options.key_prefix.size(),
91 handle, cache_key);
92 // Lookup page
93 std::unique_ptr<char[]> data;
94 size_t size;
95 Status s = cache_options.persistent_cache->Lookup(key, &data, &size);
96 if (!s.ok()) {
97 // cache miss
98 RecordTick(cache_options.statistics, PERSISTENT_CACHE_MISS);
99 return s;
100 }
101
102 // please note we are potentially comparing compressed data size with
103 // uncompressed data size
104 assert(handle.size() <= size);
105
106 // update stats
107 RecordTick(cache_options.statistics, PERSISTENT_CACHE_HIT);
108 // construct result and return
494da23a 109 *contents = BlockContents(std::move(data), size);
7c673cae
FG
110 return Status::OK();
111}
112
113} // namespace rocksdb