2022-02-24 01:06:27 +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).
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
#include "cache/lru_cache.h"
|
|
|
|
#include "memory/memory_allocator.h"
|
|
|
|
#include "rocksdb/secondary_cache.h"
|
|
|
|
#include "rocksdb/slice.h"
|
|
|
|
#include "rocksdb/status.h"
|
|
|
|
#include "util/compression.h"
|
|
|
|
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
|
|
|
2022-04-11 22:28:33 +02:00
|
|
|
class CompressedSecondaryCacheResultHandle : public SecondaryCacheResultHandle {
|
2022-02-24 01:06:27 +01:00
|
|
|
public:
|
2022-04-11 22:28:33 +02:00
|
|
|
CompressedSecondaryCacheResultHandle(void* value, size_t size)
|
2022-02-24 01:06:27 +01:00
|
|
|
: value_(value), size_(size) {}
|
2022-04-11 22:28:33 +02:00
|
|
|
virtual ~CompressedSecondaryCacheResultHandle() override = default;
|
2022-02-24 01:06:27 +01:00
|
|
|
|
2022-04-11 22:28:33 +02:00
|
|
|
CompressedSecondaryCacheResultHandle(
|
|
|
|
const CompressedSecondaryCacheResultHandle&) = delete;
|
|
|
|
CompressedSecondaryCacheResultHandle& operator=(
|
|
|
|
const CompressedSecondaryCacheResultHandle&) = delete;
|
2022-02-24 01:06:27 +01:00
|
|
|
|
|
|
|
bool IsReady() override { return true; }
|
|
|
|
|
|
|
|
void Wait() override {}
|
|
|
|
|
|
|
|
void* Value() override { return value_; }
|
|
|
|
|
|
|
|
size_t Size() override { return size_; }
|
|
|
|
|
|
|
|
private:
|
|
|
|
void* value_;
|
|
|
|
size_t size_;
|
|
|
|
};
|
|
|
|
|
2022-04-11 22:28:33 +02:00
|
|
|
// The CompressedSecondaryCache is a concrete implementation of
|
2022-02-24 01:06:27 +01:00
|
|
|
// rocksdb::SecondaryCache.
|
|
|
|
//
|
|
|
|
// Users can also cast a pointer to it and call methods on
|
|
|
|
// it directly, especially custom methods that may be added
|
|
|
|
// in the future. For example -
|
|
|
|
// std::unique_ptr<rocksdb::SecondaryCache> cache =
|
2022-04-11 22:28:33 +02:00
|
|
|
// NewCompressedSecondaryCache(opts);
|
|
|
|
// static_cast<CompressedSecondaryCache*>(cache.get())->Erase(key);
|
2022-02-24 01:06:27 +01:00
|
|
|
|
2022-04-11 22:28:33 +02:00
|
|
|
class CompressedSecondaryCache : public SecondaryCache {
|
2022-02-24 01:06:27 +01:00
|
|
|
public:
|
2022-04-11 22:28:33 +02:00
|
|
|
CompressedSecondaryCache(
|
2022-02-24 01:06:27 +01:00
|
|
|
size_t capacity, int num_shard_bits, bool strict_capacity_limit,
|
|
|
|
double high_pri_pool_ratio,
|
|
|
|
std::shared_ptr<MemoryAllocator> memory_allocator = nullptr,
|
|
|
|
bool use_adaptive_mutex = kDefaultToAdaptiveMutex,
|
|
|
|
CacheMetadataChargePolicy metadata_charge_policy =
|
|
|
|
kDontChargeCacheMetadata,
|
|
|
|
CompressionType compression_type = CompressionType::kLZ4Compression,
|
|
|
|
uint32_t compress_format_version = 2);
|
2022-04-11 22:28:33 +02:00
|
|
|
virtual ~CompressedSecondaryCache() override;
|
2022-02-24 01:06:27 +01:00
|
|
|
|
2022-04-11 22:28:33 +02:00
|
|
|
const char* Name() const override { return "CompressedSecondaryCache"; }
|
2022-02-24 01:06:27 +01:00
|
|
|
|
|
|
|
Status Insert(const Slice& key, void* value,
|
|
|
|
const Cache::CacheItemHelper* helper) override;
|
|
|
|
|
|
|
|
std::unique_ptr<SecondaryCacheResultHandle> Lookup(
|
2022-04-11 22:28:33 +02:00
|
|
|
const Slice& key, const Cache::CreateCallback& create_cb, bool /*wait*/,
|
|
|
|
bool& is_in_sec_cache) override;
|
2022-02-24 01:06:27 +01:00
|
|
|
|
|
|
|
void Erase(const Slice& key) override;
|
|
|
|
|
|
|
|
void WaitAll(std::vector<SecondaryCacheResultHandle*> /*handles*/) override {}
|
|
|
|
|
|
|
|
std::string GetPrintableOptions() const override;
|
|
|
|
|
|
|
|
private:
|
|
|
|
std::shared_ptr<Cache> cache_;
|
2022-04-11 22:28:33 +02:00
|
|
|
CompressedSecondaryCacheOptions cache_options_;
|
2022-02-24 01:06:27 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace ROCKSDB_NAMESPACE
|