| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_PERSISTENT_CACHE_PERSISTENT_CACHE_H_ |
| #define COMPONENTS_PERSISTENT_CACHE_PERSISTENT_CACHE_H_ |
| |
| #include <memory> |
| #include <optional> |
| #include <string_view> |
| #include <utility> |
| |
| #include "base/component_export.h" |
| #include "base/containers/span.h" |
| #include "base/files/file.h" |
| #include "base/rand_util.h" |
| #include "base/timer/elapsed_timer.h" |
| #include "components/persistent_cache/backend_params.h" |
| #include "components/persistent_cache/entry_metadata.h" |
| |
| namespace persistent_cache { |
| |
| class Entry; |
| class Backend; |
| |
| // Use PersistentCache to store and retrieve key-value pairs across processes or |
| // threads. |
| // |
| // Example: |
| // // Create a persistent cache backend. |
| // BackendParams backend_params = AcquireParams(); |
| // auto PersistentCache persistent_cache = |
| // PersistentCache::Open(backend_params); |
| // if(!persistent_cache){ |
| // // Handle error. |
| // } |
| // |
| // // Add a key-value pair. |
| // persistent_cache->Insert("foo", base::byte_span_from_cstring("1")); |
| // |
| // // Retrieve a value. The presence of the key and its value are guaranteed |
| // // during the lifetime of `entry`. |
| // { |
| // auto entry = persistent_cache->Find("foo"); |
| // |
| // // Warning: The value may have changed since insertion (because the |
| // // cache is multi-thread/multi-process), been evicted by the backend, or |
| // // the initial insertion may have failed. |
| // if (entry) { |
| // UseEntry(entry); |
| // } |
| // } |
| // |
| // // Inserting again overwrites anything in there if present. |
| // persistent_cache->Insert("foo", base::byte_span_from_cstring("2")); |
| // |
| |
| // Use PersistentCache to store and retrieve key-value pairs across processes or |
| // threads. |
| class COMPONENT_EXPORT(PERSISTENT_CACHE) PersistentCache { |
| public: |
| explicit PersistentCache(std::unique_ptr<Backend> backend); |
| ~PersistentCache(); |
| |
| // Not copyable or moveable. |
| PersistentCache(const PersistentCache&) = delete; |
| PersistentCache(PersistentCache&&) = delete; |
| PersistentCache& operator=(const PersistentCache&) = delete; |
| PersistentCache& operator=(PersistentCache&&) = delete; |
| |
| // Used to open a cache with a backend of type `impl`. Returns nullptr in |
| // case of failure. |
| static std::unique_ptr<PersistentCache> Open(BackendParams backend_params); |
| |
| // Used to get a handle to entry associated with `key`. Returns `nullptr` if |
| // `key` is not found. Returned entry will remain valid and its contents will |
| // be accessible for its entire lifetime. Note: Persistent caches have to |
| // outlive entries they vend. |
| // |
| // Thread-safe. |
| std::unique_ptr<Entry> Find(std::string_view key); |
| |
| // Used to add an entry containing `content` and associated with `key`. |
| // |
| // Thread-safe. |
| void Insert(std::string_view key, |
| base::span<const uint8_t> content, |
| EntryMetadata metadata = EntryMetadata{}); |
| |
| Backend* GetBackendForTesting(); |
| |
| private: |
| std::optional<base::ElapsedTimer> MaybeGetTimerForHistogram(); |
| std::string GetFullHistogramName(std::string_view name) const; |
| |
| std::unique_ptr<Backend> backend_; |
| |
| static constexpr double kTimingLoggingProbability = 0.01; |
| base::MetricsSubSampler metrics_subsampler_; |
| }; |
| |
| } // namespace persistent_cache |
| |
| #endif // COMPONENTS_PERSISTENT_CACHE_PERSISTENT_CACHE_H_ |