Packages
rocksdb
2.0.0
3.1.1
3.1.0
3.0.0
2.6.2
2.6.1
retired
2.6.0
retired
2.5.0
2.4.1
2.4.0
2.3.0
2.2.0
2.1.0
2.0.0
1.9.0
1.8.0
1.7.0
1.6.0
1.5.1
1.5.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.1
1.1.0
1.0.0
0.26.2
0.26.1
0.26.0
0.25.0
0.24.0
0.23.3
0.23.2
0.23.1
0.23.0
0.22.0
0.21.0
0.20.1
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.1
0.7.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
RocksDB for Erlang
Current section
Files
Jump to
Current section
Files
deps/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h
// Copyright (c) 2013, 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 <functional>
#include <string>
#include <unordered_map>
#include "rocksdb/slice.h"
#include "utilities/persistent_cache/block_cache_tier_file.h"
#include "utilities/persistent_cache/hash_table.h"
#include "utilities/persistent_cache/hash_table_evictable.h"
#include "utilities/persistent_cache/lrulist.h"
namespace ROCKSDB_NAMESPACE {
//
// Block Cache Tier Metadata
//
// The BlockCacheTierMetadata holds all the metadata associated with block
// cache. It
// fundamentally contains 2 indexes and an LRU.
//
// Block Cache Index
//
// This is a forward index that maps a given key to a LBA (Logical Block
// Address). LBA is a disk pointer that points to a record on the cache.
//
// LBA = { cache-id, offset, size }
//
// Cache File Index
//
// This is a forward index that maps a given cache-id to a cache file object.
// Typically you would lookup using LBA and use the object to read or write
struct BlockInfo {
explicit BlockInfo(const Slice& key, const LBA& lba = LBA())
: key_(key.ToString()), lba_(lba) {}
std::string key_;
LBA lba_;
};
class BlockCacheTierMetadata {
public:
explicit BlockCacheTierMetadata(const uint32_t blocks_capacity = 1024 * 1024,
const uint32_t cachefile_capacity = 10 * 1024)
: cache_file_index_(cachefile_capacity), block_index_(blocks_capacity) {}
virtual ~BlockCacheTierMetadata() {}
// Insert a given cache file
bool Insert(BlockCacheFile* file);
// Lookup cache file based on cache_id
BlockCacheFile* Lookup(const uint32_t cache_id);
// Insert block information to block index
BlockInfo* Insert(const Slice& key, const LBA& lba);
// bool Insert(BlockInfo* binfo);
// Lookup block information from block index
bool Lookup(const Slice& key, LBA* lba);
// Remove a given from the block index
BlockInfo* Remove(const Slice& key);
// Find and evict a cache file using LRU policy
BlockCacheFile* Evict();
// Clear the metadata contents
virtual void Clear();
protected:
// Remove all block information from a given file
virtual void RemoveAllKeys(BlockCacheFile* file);
private:
// Cache file index definition
//
// cache-id => BlockCacheFile
struct BlockCacheFileHash {
uint64_t operator()(const BlockCacheFile* rec) {
return std::hash<uint32_t>()(rec->cacheid());
}
};
struct BlockCacheFileEqual {
uint64_t operator()(const BlockCacheFile* lhs, const BlockCacheFile* rhs) {
return lhs->cacheid() == rhs->cacheid();
}
};
using CacheFileIndexType =
EvictableHashTable<BlockCacheFile, BlockCacheFileHash,
BlockCacheFileEqual>;
// Block Lookup Index
//
// key => LBA
struct Hash {
size_t operator()(BlockInfo* node) const {
return std::hash<std::string>()(node->key_);
}
};
struct Equal {
size_t operator()(BlockInfo* lhs, BlockInfo* rhs) const {
return lhs->key_ == rhs->key_;
}
};
using BlockIndexType = HashTable<BlockInfo*, Hash, Equal>;
CacheFileIndexType cache_file_index_;
BlockIndexType block_index_;
};
} // namespace ROCKSDB_NAMESPACE