summaryrefslogtreecommitdiff
path: root/res/res_sorcery_memory_cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'res/res_sorcery_memory_cache.c')
-rw-r--r--res/res_sorcery_memory_cache.c39
1 files changed, 32 insertions, 7 deletions
diff --git a/res/res_sorcery_memory_cache.c b/res/res_sorcery_memory_cache.c
index 7da72bca4..5f7ffb64e 100644
--- a/res/res_sorcery_memory_cache.c
+++ b/res/res_sorcery_memory_cache.c
@@ -83,6 +83,9 @@
<parameter name="Object" required="true">
<para>The name of the object to mark as stale.</para>
</parameter>
+ <parameter name="Reload" required="false">
+ <para>If true, then immediately reload the object from the backend cache instead of waiting for the next retrieval</para>
+ </parameter>
</syntax>
<description>
<para>Marks an object as stale within a sorcery memory cache.</para>
@@ -1394,10 +1397,8 @@ static void sorcery_memory_cache_load(void *data, const struct ast_sorcery *sorc
ast_debug(1, "Memory cache '%s' associated with sorcery instance '%p' of module '%s' with object type '%s'\n",
cache->name, sorcery, ast_sorcery_get_module(sorcery), type);
- if (cache->full_backend_cache) {
- cache->sorcery = sorcery;
- cache->object_type = ast_strdup(type);
- }
+ cache->sorcery = sorcery;
+ cache->object_type = ast_strdup(type);
}
/*!
@@ -1870,8 +1871,10 @@ static char *sorcery_memory_cache_stale(struct ast_cli_entry *e, int cmd, struct
case CLI_INIT:
e->command = "sorcery memory cache stale";
e->usage =
- "Usage: sorcery memory cache stale <cache name> [object name]\n"
- " Mark a specific object or ALL objects as stale in a sorcery memory cache.\n";
+ "Usage: sorcery memory cache stale <cache name> [object name [reload]]\n"
+ " Mark a specific object or ALL objects as stale in a sorcery memory cache.\n"
+ " If \"reload\" is specified, then the object is marked stale and immediately\n"
+ " retrieved from backend storage to repopulate the cache\n";
return NULL;
case CLI_GENERATE:
if (a->pos == 4) {
@@ -1883,7 +1886,7 @@ static char *sorcery_memory_cache_stale(struct ast_cli_entry *e, int cmd, struct
}
}
- if (a->argc < 5 || a->argc > 6) {
+ if (a->argc < 5 || a->argc > 7) {
return CLI_SHOWUSAGE;
}
@@ -1907,6 +1910,15 @@ static char *sorcery_memory_cache_stale(struct ast_cli_entry *e, int cmd, struct
if (!mark_object_as_stale_in_cache(cache, a->argv[5])) {
ast_cli(a->fd, "Successfully marked object '%s' in memory cache '%s' as stale\n",
a->argv[5], a->argv[4]);
+ if (a->argc == 7 && ast_true(a->argv[6])) {
+ struct sorcery_memory_cached_object *cached;
+
+ cached = ao2_find(cache->objects, a->argv[5], OBJ_SEARCH_KEY | OBJ_NOLOCK);
+ if (cached) {
+ memory_cache_stale_update_object(cache->sorcery, cache, cached);
+ ao2_ref(cached, -1);
+ }
+ }
} else {
ast_cli(a->fd, "Object '%s' in sorcery memory cache '%s' could not be marked as stale as it was not found\n",
a->argv[5], a->argv[4]);
@@ -2066,6 +2078,7 @@ static int sorcery_memory_cache_ami_stale_object(struct mansession *s, const str
{
const char *cache_name = astman_get_header(m, "Cache");
const char *object_name = astman_get_header(m, "Object");
+ const char *reload = astman_get_header(m, "Reload");
struct sorcery_memory_cache *cache;
int res;
@@ -2084,7 +2097,19 @@ static int sorcery_memory_cache_ami_stale_object(struct mansession *s, const str
}
ao2_rdlock(cache->objects);
+
res = mark_object_as_stale_in_cache(cache, object_name);
+
+ if (ast_true(reload)) {
+ struct sorcery_memory_cached_object *cached;
+
+ cached = ao2_find(cache->objects, object_name, OBJ_SEARCH_KEY | OBJ_NOLOCK);
+ if (cached) {
+ memory_cache_stale_update_object(cache->sorcery, cache, cached);
+ ao2_ref(cached, -1);
+ }
+ }
+
ao2_unlock(cache->objects);
ao2_ref(cache, -1);