Files
gps/tools/local/circt/include/llvm/CAS/OnDiskKeyValueDB.h
T
2026-07-12 11:01:51 +03:00

92 lines
3.4 KiB
C++

//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
/// \file
/// This declares OnDiskKeyValueDB, a key value storage database of fixed size
/// key and value.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CAS_ONDISKKEYVALUEDB_H
#define LLVM_CAS_ONDISKKEYVALUEDB_H
#include "llvm/CAS/OnDiskTrieRawHashMap.h"
namespace llvm::cas::ondisk {
class UnifiedOnDiskCache;
/// An on-disk key-value data store with the following properties:
/// * Keys are fixed length binary hashes with expected normal distribution.
/// * Values are buffers of the same size, specified at creation time.
/// * The value of a key cannot be changed once it is set.
/// * The value buffers returned from a key lookup have 8-byte alignment.
class OnDiskKeyValueDB {
public:
/// Associate a value with a key.
///
/// \param Key the hash bytes for the key
/// \param Value the value bytes, same size as \p ValueSize parameter of
/// \p open call.
///
/// \returns the value associated with the \p Key. It may be different than
/// \p Value if another value is already associated with this key.
LLVM_ABI_FOR_TEST Expected<ArrayRef<char>> put(ArrayRef<uint8_t> Key,
ArrayRef<char> Value);
/// \returns the value associated with the \p Key, or \p std::nullopt if the
/// key does not exist.
LLVM_ABI_FOR_TEST Expected<std::optional<ArrayRef<char>>>
get(ArrayRef<uint8_t> Key);
/// \returns Total size of stored data.
size_t getStorageSize() const { return Cache.size(); }
/// \returns The precentage of space utilization of hard space limits.
///
/// Return value is an integer between 0 and 100 for percentage.
unsigned getHardStorageLimitUtilization() const {
return Cache.size() * 100ULL / Cache.capacity();
}
/// Open the on-disk store from a directory.
///
/// \param Path directory for the on-disk store. The directory will be created
/// if it doesn't exist.
/// \param HashName Identifier name for the hashing algorithm that is going to
/// be used.
/// \param KeySize Size for the key hash bytes.
/// \param ValueName Identifier name for the values.
/// \param ValueSize Size for the value bytes.
/// \param UnifiedCache An optional UnifiedOnDiskCache that manages the size
/// and lifetime of the CAS instance and it must owns current initializing
/// KeyValueDB after initialized.
LLVM_ABI_FOR_TEST static Expected<std::unique_ptr<OnDiskKeyValueDB>>
open(StringRef Path, StringRef HashName, unsigned KeySize,
StringRef ValueName, size_t ValueSize,
UnifiedOnDiskCache *UnifiedCache = nullptr,
std::shared_ptr<OnDiskCASLogger> Logger = nullptr);
/// Validate the storage.
LLVM_ABI_FOR_TEST Error validate() const;
private:
OnDiskKeyValueDB(size_t ValueSize, OnDiskTrieRawHashMap Cache,
UnifiedOnDiskCache *UnifiedCache)
: ValueSize(ValueSize), Cache(std::move(Cache)),
UnifiedCache(UnifiedCache) {}
const size_t ValueSize;
OnDiskTrieRawHashMap Cache;
UnifiedOnDiskCache *UnifiedCache = nullptr;
};
} // namespace llvm::cas::ondisk
#endif // LLVM_CAS_ONDISKKEYVALUEDB_H