diff --git a/doc/CHANGES-staging/sorcery_memory_cache_full_expire_object.txt b/doc/CHANGES-staging/sorcery_memory_cache_full_expire_object.txt new file mode 100644 index 0000000000000000000000000000000000000000..d568e38f16add58b96e84d60d13dfa1284e9ba4e --- /dev/null +++ b/doc/CHANGES-staging/sorcery_memory_cache_full_expire_object.txt @@ -0,0 +1,19 @@ +Subject: res_sorcery_memory_cache + +The SorceryMemoryCacheExpireObject AMI action and CLI +command allow expiring of a specific object within the +sorcery memory cache. This is done by removing the +object from the cache with the expectation that the +cache will then re-populate the object when it is next +needed. + +For full backend caching this does not occur. The cache +won't repopulate until an entire refresh is done resulting +in the possibility that objects are missing until that +time. + +The AMI action and CLI command will now not allow +expiring of an object if the cache is configured as a +full backend cache. Instead you must use either the +SorceryMemoryCacheExpire or SorceryMemoryCachePopulate +AMI actions or their associated CLI commands. diff --git a/res/res_sorcery_memory_cache.c b/res/res_sorcery_memory_cache.c index 5029131ca5d240c74872b2c6d6559f42e89b92d1..dad31462837c739f3da4a2b8ca1c1c11178817f2 100644 --- a/res/res_sorcery_memory_cache.c +++ b/res/res_sorcery_memory_cache.c @@ -54,7 +54,9 @@ </parameter> </syntax> <description> - <para>Expires (removes) an object from a sorcery memory cache.</para> + <para>Expires (removes) an object from a sorcery memory cache. If full backend caching is enabled + this action is not available and will fail. In this case the SorceryMemoryCachePopulate or + SorceryMemoryCacheExpire AMI actions must be used instead.</para> </description> </manager> <manager name="SorceryMemoryCacheExpire" language="en_US"> @@ -1892,7 +1894,9 @@ static char *sorcery_memory_cache_expire(struct ast_cli_entry *e, int cmd, struc remove_all_from_cache(cache); ast_cli(a->fd, "All objects have been removed from cache '%s'\n", a->argv[4]); } else { - if (!remove_from_cache(cache, a->argv[5], 1)) { + if (cache->full_backend_cache) { + ast_cli(a->fd, "Due to full backend caching per-object expiration is not available on cache '%s'\n", a->argv[4]); + } else if (!remove_from_cache(cache, a->argv[5], 1)) { ast_cli(a->fd, "Successfully expired object '%s' from cache '%s'\n", a->argv[5], a->argv[4]); } else { ast_cli(a->fd, "Object '%s' was not expired from cache '%s' as it was not found\n", a->argv[5], @@ -2084,12 +2088,18 @@ static int sorcery_memory_cache_ami_expire_object(struct mansession *s, const st } ao2_wrlock(cache->objects); - res = remove_from_cache(cache, object_name, 1); + if (cache->full_backend_cache) { + res = 1; + } else { + res = remove_from_cache(cache, object_name, 1); + } ao2_unlock(cache->objects); ao2_ref(cache, -1); - if (!res) { + if (res == 1) { + astman_send_error(s, m, "Due to full backend caching per-object expiration is not available, consider using SorceryMemoryCachePopulate or SorceryMemoryCacheExpire instead\n"); + } else if (!res) { astman_send_ack(s, m, "The provided object was expired from the cache\n"); } else { astman_send_error(s, m, "The provided object could not be expired from the cache\n");