]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Revert "stasis_cache: Stop caching stasis subscription change messages"
authorGeorge Joseph <gjoseph@digium.com>
Wed, 26 Dec 2018 16:24:57 +0000 (11:24 -0500)
committerGeorge Joseph <gjoseph@digium.com>
Wed, 26 Dec 2018 16:29:51 +0000 (10:29 -0600)
This commit caused issues with polling when combined with
the revert commit "Revert "app_voicemail: Remove need to subscribe to stasis"

This reverts commit 17d6d9e1e7d0db04ebd8d2e0cd9e087ec5462e2f.

ASTERISK-28222
Reported by: abelbeck

Change-Id: Ib6a16cbe2c0b74c76c64264f525ab647959c1483

main/stasis_cache.c

index 5aa04fb1a739b8cc14e509a464e77109ec161e46..73a469e6a07ea08b5840787fbbab12ffb087d5e0 100644 (file)
@@ -854,16 +854,29 @@ static void caching_topic_exec(void *data, struct stasis_subscription *sub,
 
        msg_type = stasis_message_type(message);
 
-       /*
-        * app_voicemail used to rely on the cache containing every topic subscribe and
-        * unsubscribe in order to determine if anyone was currently subscribed to a
-        * particular mailbox.  This caused the cache to grow unabated for the life of
-        * the asterisk instance.  Since it no longer needs the cache of these message
-        * types, and no other function needs them, we no longer cache them.
-        */
        if (stasis_subscription_change_type() == msg_type) {
-               ao2_cleanup(caching_topic_needs_unref);
-               return;
+               struct stasis_subscription_change *change = stasis_message_data(message);
+
+               /*
+                * If this change type is an unsubscribe, we need to find the original
+                * subscribe and remove it from the cache otherwise the cache will
+                * continue to grow unabated.
+                */
+               if (strcmp(change->description, "Unsubscribe") == 0) {
+                       struct stasis_cache_entry *sub;
+
+                       ao2_wrlock(caching_topic->cache->entries);
+                       sub = cache_find(caching_topic->cache->entries, stasis_subscription_change_type(), change->uniqueid);
+                       if (sub) {
+                               cache_remove(caching_topic->cache->entries, sub, stasis_message_eid(message));
+                               ao2_cleanup(sub);
+                       }
+                       ao2_unlock(caching_topic->cache->entries);
+                       ao2_cleanup(caching_topic_needs_unref);
+                       return;
+               }
+               msg_put = message;
+               msg = message;
        } else if (stasis_cache_clear_type() == msg_type) {
                /* Cache clear event. */
                msg_put = NULL;