diff --git a/res/res_sorcery_memory_cache.c b/res/res_sorcery_memory_cache.c index 7da72bca4ae274a76ddaa744d9c1d06b72313bc0..5f7ffb64ee87c03556f782d436663d5050d6173b 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);