compressed_secondary_cache.h 2.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// 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 {

19
class CompressedSecondaryCacheResultHandle : public SecondaryCacheResultHandle {
20
 public:
21
  CompressedSecondaryCacheResultHandle(void* value, size_t size)
22
      : value_(value), size_(size) {}
23
  virtual ~CompressedSecondaryCacheResultHandle() override = default;
24

25 26 27 28
  CompressedSecondaryCacheResultHandle(
      const CompressedSecondaryCacheResultHandle&) = delete;
  CompressedSecondaryCacheResultHandle& operator=(
      const CompressedSecondaryCacheResultHandle&) = delete;
29 30 31 32 33 34 35 36 37 38 39 40 41 42

  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_;
};

43
// The CompressedSecondaryCache is a concrete implementation of
44 45 46 47 48 49
// 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 =
50 51
//      NewCompressedSecondaryCache(opts);
// static_cast<CompressedSecondaryCache*>(cache.get())->Erase(key);
52

53
class CompressedSecondaryCache : public SecondaryCache {
54
 public:
55
  CompressedSecondaryCache(
56
      size_t capacity, int num_shard_bits, bool strict_capacity_limit,
57
      double high_pri_pool_ratio, double low_pri_pool_ratio,
58 59 60 61 62 63
      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);
64
  virtual ~CompressedSecondaryCache() override;
65

66
  const char* Name() const override { return "CompressedSecondaryCache"; }
67 68 69 70 71

  Status Insert(const Slice& key, void* value,
                const Cache::CacheItemHelper* helper) override;

  std::unique_ptr<SecondaryCacheResultHandle> Lookup(
72 73
      const Slice& key, const Cache::CreateCallback& create_cb, bool /*wait*/,
      bool& is_in_sec_cache) override;
74 75 76 77 78 79 80 81 82

  void Erase(const Slice& key) override;

  void WaitAll(std::vector<SecondaryCacheResultHandle*> /*handles*/) override {}

  std::string GetPrintableOptions() const override;

 private:
  std::shared_ptr<Cache> cache_;
83
  CompressedSecondaryCacheOptions cache_options_;
84 85 86
};

}  // namespace ROCKSDB_NAMESPACE