#include <userver/cache/cache_update_trait.hpp>
Base class for periodically updated caches.
Definition at line 30 of file cache_update_trait.hpp.
Inheritance diagram for cache::CacheUpdateTrait:Public Member Functions | |
| CacheUpdateTrait (CacheUpdateTrait &&)=delete | |
| CacheUpdateTrait & | operator= (CacheUpdateTrait &&)=delete |
| void | InvalidateAsync (UpdateType update_type) |
| Non-blocking forced cache update of specified type. | |
| void | UpdateSyncDebug (UpdateType update_type) |
| Forces a synchronous cache update of specified type. | |
| const std::string & | Name () const noexcept |
Protected Types | |
| enum class | Flag { kNone = 0 , kNoFirstUpdate = 1 << 0 } |
| Periodic update flags. More... | |
Protected Member Functions | |
| AllowedUpdateTypes | GetAllowedUpdateTypes () const |
| Update types configured for the cache. | |
| void | OnCacheModified () noexcept |
| virtual void | Update (UpdateType type, const std::chrono::system_clock::time_point &last_update, const std::chrono::system_clock::time_point &now, UpdateStatisticsScope &stats_scope)=0 |
| Should be overridden in a derived class to align the stored data with some data source. | |
| virtual utils::Flags< Flag > | GetStartFlags () const |
| Returns flags for cache start. | |
| void | EarlyStartPeriodicUpdates (utils::Flags< Flag > flags) |
| Call this to start periodic updates just now, not after the constructor. | |
|
strongprotected |
Periodic update flags.
| Enumerator | |
|---|---|
| kNoFirstUpdate | Disable initial update on start.
|
Definition at line 89 of file cache_update_trait.hpp.
| void cache::CacheUpdateTrait::InvalidateAsync | ( | UpdateType | update_type | ) |
Non-blocking forced cache update of specified type.
|
noexcept |
|
protectednoexcept |
Called in CachingComponentBase::Set during update to indicate that the cached data has been modified
|
protectedpure virtual |
Should be overridden in a derived class to align the stored data with some data source.
Update implementation should do one of the following:
A. If the update succeeded and has changes...
B. If the update succeeded and verified that there are no changes...
C. If the update failed...
| type | type of the update |
| last_update | time of the last update (value of now from previous invocation of Update or default constructed value if this is the first Update). |
| now | current time point |
| stats_scope | the scope that expects one of Finish, FinishNoChanges, FinishWithError or an exception. |
| std::exception | on update failure |
Update returns without throwing an exception and without calling one of the Finish* methods, the behavior is undefined.| void cache::CacheUpdateTrait::UpdateSyncDebug | ( | UpdateType | update_type | ) |
Forces a synchronous cache update of specified type.
InvalidateAsync instead. The reasons are:InvalidateAsync shifts the time of the next update as if a periodic update has just happened. UpdateSyncDebug does not do that: it locks the mutex and performs an additional update on the side, which puts extra load on the CPU and on the data source.InvalidateAsync is not subject to this. On top of that, UpdateSyncDebug will block the cache we subscribe to for the time we wait for the previous update of the dependent cache to finish (if one was in progress).InvalidateAsync robustly handles situations with repeated update requests, see the docs of PeriodicTask::ForceStepAsync, on top of which it is implemented. UpdateSyncDebug tries to lock the mutex over and over and performs as many updates as were requested, even if they were requested many times in a row.UpdateSyncDebug is called before the periodic updates of the current cache have started (they start after the constructor of the derived cache finishes), the behavior is undefined, because the state of the periodic updates is not set up yet, while an update was already requested. InvalidateAsync handles this case: in that situation nothing happens.| If | Update throws |