=== 4.5 Onwards ===

This file has been replaced by UPGRADING.md. See MDL-81125 for further information.

===
This files describes API changes in /cache/stores/* - cache store plugins.
Information provided here is intended especially for developers.

=== 4.3 ===
* A new cache_helper::result_found() helper has been added to assist with cache value validation
* Implementations of the following methods, deprecated since 3.10, have been removed and can no longer be used:
  - `\core\lock\lock::extend`
  - `\core\lock\lock_factory::extend_lock`
  - `\core\lock\lock_factory::supports_recursion`
* The automatic locking options 'requirelockingread' and 'requirelockingwrite' have been removed.
  These features are not used in core, were recommended against in the documentation, had significant
  bugs, and had no useful purpose. 'requirelockingbeforewrite' is still available to check that manual
  locking has been applied.
* The acquire_lock function within cache loaders now throws an exception if it fails to obtain the
  lock after a timeout, instead of returning false.
* The functions set_many, delete, and delete_many now all throw exceptions if you are using
  'requirelockingbeforewrite' and do not have a lock, same as the set function.

=== 4.2 ===
* The memcached cachestore has been removed.
* The mongodb cachestore has been removed.

=== 4.1 ===
* Added new `requirelockingbeforewrite` option for cache definitions. This will check that a lock for a given cache key already
  exists before it will perform a `set()` on that key. A `coding_exception` is thrown if the lock has not been acquired.
* Added native locking to cachestore_file. This will use an instance of file_lock_factory pointing at a subdirectory in the same
  location as the cache instance, meaning a local file cache will have its locks stored locally. If file locks are disabled
  globally, it will fall back to use the default lock factory, which may not be in the same location as the cache. cachestore_file
  includes an additional setting to control how long it will wait for a lock before giving up, default is 60 seconds.

=== 4.0 ===
* Cache stores may implement new optional function cache_store::get_last_io_bytes() to provide
  information about the size of data transferred (shown in footer if performance info enabled).
* The cache_store class now has functions cache_size_details(), store_total_size(), and
  estimate_stored_size(), related to size used by the cache. These can be overridden by a cache
  store to provide better information for the new cache usage admin page.
* New functions cache::set_versioned() and cache::get_versioned() can be used to ensure correct
  behaviour when using a multi-level cache with early cache levels stored locally. (Used when
  rebuilding modinfo.) There is also a new interface cache_data_source_versionable which can
  be implemented if you want to make a data source that supports versioning.

=== 3.10 ===
* The function supports_recursion() from the lock_factory interface has been deprecated including the related implementations.
* The function extend_lock() from the lock_factory interface has been deprecated without replacement including the related
  implementations.
* The function extend() from the lock class has been deprecated without replacement.
* The cache_factory class can now be overridden by an alternative cache config class, which can
  also now control the frontend display of the cache/admin.php page (see MDL-41492).

=== 3.9 ===
* The record_cache_hit/miss/set methods now take a cache_store instead of a cache_definition object

=== 3.8 ===
* The Redis cache store can now make use of the Zstandard compression algorithm (see MDL-66428).

=== 3.7 ===
* Upgraded MongoDB cache store to use the new lower level PHP-driver and MongoDB PHP Library.
* The mongodb extension has replaced the old mongo extension. The mongodb pecl extension >= 1.5 must be installed to use MongoDB
cache store.

=== 3.6 ===
* The `cache::now()` function now takes an optional boolean parameter to indicate that the cache should return a more
  accurate time, generated by the PHP `microtime` function.
* The memcache store was removed as it is not compatible with PHP 7.0.

=== 3.3 ===
* Identifiers and invalidation events have been explictly been marked as incompatible and will
  throw a coding exception. Unexpected results would have occurred if the previous behaviour was attempted.
* Identifiers are now part of loaded caches, so identifiers can only be set at cache::make()
  a coding_exception will be thrown if attempts are made at other times.
  Multiple calls to cache::make with different identifiers will produce 2 caches instead of changing the
  keyspace of a single cache.

=== 3.2 ===
* The following methods have been finally deprecated and should no longer be used.
  - cache_definition::should_be_persistent()
  - cache_definition::get_persistent_max_size()
  - cache::is_using_persist_cache()
  - cache::is_in_persist_cache()
  - cache::get_from_persist_cache()
  - cache::set_in_persist_cache()
  - cache::delete_from_persist_cache()
  - cache_store::cleanup()
* cachestore_dummy::cleanup() has been deprecated.
* cachestore_dummy::instance_deleted() implemented in lieu of cachestore_dummy::cleanup().
* Added cache_store::unit_test_configuration() to calculate unit testing configuration.
* Remove cache_store:initialise_unit_test_instance() as it is incompatible with cache_helper purge functions.

=== 3.1 ===
* Cache stores has a new feature DEREFERENCES_OBJECTS.
  This allows the cache loader to decide if it needs to handle dereferencing or whether the data
  coming directly to it has already had references resolved.
  - see supports_dereferencing_objects in store.php.

=== 2.9 ===
* Cache data source aggregation functionality has been removed. This functionality was found to be broken and unused.
  It was decided that rather than fixing it it should be removed.
  As well as the processing code being removed the following API changes have been made.
  The following changes have come about because of it:
   - cache_definition::$datasourceaggregate is deprecated an unused.
   - cache_definition::load Argument 3 (final arg) is now unused.
   - cache_factory::create_cache_from_definition Argument 4 (final arg) is now unused.
   - cache::make Argument 4 (final arg) is now unused.
* cache_config_phpunittest has been renamed to cache_config_testing
* New method cache_store::ready_to_be_used_for_testing() that returns true|false if the store is suitable and ready for use as the primary store during unit and acceptance tests.
* cache_helper::get_stats structure we changed to include the cache mode.

=== 2.7 ===
* cache_store::is_ready is no longer abstract, calling cache_store::are_requirements_met by default.

=== 2.6 ===
* All cache instances are recorded and subsequent requests are given a reference to the original instance.
* The persistent option for the cache definition has been deprecated. Please use the staticacceleration option instead.
* There is a new static acceleration option. If enabled data passing through the cache is held onto.
* The persistentmaxsize option has been renamed to staticaccelerationsize. It does the same thing.
* cache_definition::should_be_persistent has been deprecated. Please call cache_definition::use_static_acceleration instead.
* cache_definition::get_persistent_max_size has been deprecated. Please call cache_definition::get_static_acceleration_size instead.
* cache::is_using_persist_cache() has been deprecated. Please call  cache::use_static_acceleration()
* cache::is_in_persist_cache() has been deprecated. Please call  cache::static_acceleration_has()
* cache::get_from_persist_cache() has been deprecated. Please call  cache::static_acceleration_get()
* cache::set_in_persist_cache() has been deprecated. Please call  cache::static_acceleration_set()
* cache::delete_from_persist_cache() has been deprecated. Please call cache::static_acceleration_delete()
* If you have any custom cache loaders you will need to rename these methods if you have overriden them and adjust any calls you may have made to them.

=== 2.5 ===
* cleanup method renamed to instance_deleted.
  It is now called when the store is deleted as all comments suggested anyway.
* instance_created method added.
  It is called when the store is created for the very first time.
