Summary: | ASTERISK-25067: Sorcery Caching: Implement a new caching module | ||
Reporter: | Matt Jordan (mjordan) | Labels: | |
Date Opened: | 2015-05-06 15:46:18 | Date Closed: | 2015-07-27 11:32:58 |
Priority: | Major | Regression? | |
Status: | Closed/Complete | Components: | Core/Sorcery |
Versions: | Frequency of Occurrence | ||
Related Issues: | |||
Environment: | Attachments: | ||
Description: | h2. Overview
See [Sorcery Caching|https://wiki.asterisk.org/wiki/display/~jcolp/Sorcery+Caching] for more background and information. This issue is to create a specific sorcery wizard for in-memory caching, {{res_sorcery_memory_cache}}. It should be specified in the same way as existing caching wizards, except that it will provide a smarter set of policies for how items in the cache are managed. Example configuration: {code} [res_pjsip] endpoint/cache=memory_cache endpoint=realtime,ps_endpoints {code} h2. Implementation # Create a new module, {{res_sorcery_memory_cache}}. Implement the standard suite of callbacks for a {{ast_sorcery_wizard}} struct. The initial implementation of this can start from {{res_sorcery_memory}}. # Add configuration options documented on the wiki page. Note that this step is purely to add the hooks necessary to parse the configuration passed in from the {{.open}} callback. # Implement expiration of objects. If an object is expired, it should be removed from the cache, and the cache should return NULL. The next wizard down that returns a valid object should re-add it to the cache exactly as if it were a new item being added to the cache. # Add a maximum limit to the size of the cache. Since the underlying container will be an ao2 container, this will require some finesse: ** Look at the container count when adding a new item. If it is under the count, add away. ** If not, perform a lookup on the container based on the oldest known item. This should almost certainly *not* be done using an ao2_callback, as that would require iterating over all the objects, which would be absolute garbage for performance. Instead, an alternate container that organizes the entries by age should be used. ** Get the oldest as mentioned above, remove it from both containers, then add the new one. # Add staleness. If an item is stale, return it, but queue up a check to see if the next wizard down has it. If that fails, remove the item from the cache (auto-expire it). *NOTE*: There are other options, but the ones listed above are a bit higher priority than the others on the page. If the others are necessary, they will be implemented as well. h2. Testing h3. Initial Caching Write tests that cover the following: # Write basic tests for the wizard. Confirm items can be created, retrieved, updated, and deleted using the standard callbacks. # Create a cache with an expiration time. ** Verify that a non-expired item is retrieved without hitting a backing layer. ** Verify that an expired item is removed from the cache and hits a backing layer. *** Verify that a backing layer not having the item results in an overall NULL value being returned. *** Verify that a backing layer having the item results in it being returned, and re-populated in the cache with the correct new expiration time. # Add a maximum size to the cache (10) ** Add 15 objects, verify that only 10 were created. ** Add 10 objects. Verify the 5 oldest. Add 5 more. Verify that 10 are in the cache, and the 5 oldest were removed. # Create a cache with staleness. ** Verify that stale objects are returned when retrieved. *** Verify that a stale object that is still in the backing storage is updated, and that its expiration time is updated. *** Verify that a stale object that is not in the backing storage is removed from the cache. | ||
Comments: | By: Asterisk Team (asteriskteam) 2015-07-26 11:53:24.558-0500 This issue has been reopened as a result of your commenting on it as the reporter. It will be triaged once again as applicable. |