]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip_pubsub: fix Batched Notifications stop working
authorAlexei Gradinari <alex2grad@gmail.com>
Mon, 7 Feb 2022 22:31:19 +0000 (17:31 -0500)
committerFriendly Automation <jenkins2@gerrit.asterisk.org>
Wed, 23 Feb 2022 21:30:27 +0000 (15:30 -0600)
If Subscription refresh occurred between when the batched notification
was scheduled and the serialized notification was to be sent,
then new schedule notification task would never be added.

There are 2 threads:

thread #1. ast_sip_subscription_notify is called,
if notification_batch_interval then call schedule_notification.
1.1. The schedule_notification checks notify_sched_id > -1
not true, then
send_scheduled_notify = 1
notify_sched_id =
  ast_sched_add(sched, sub_tree->notification_batch_interval, sched_cb....
1.2. The sched_cb pushes task serialized_send_notify to serializer
and returns 0 which means no reschedule.
1.3. The serialized_send_notify checks send_scheduled_notify if it's false
the just returns. BUT notify_sched_id is still set, so no more ast_sched_add.

thread #2. pubsub_on_rx_refresh is called
2.1 it pushes serialized_pubsub_on_refresh_timeout to serializer
2.2. The serialized_pubsub_on_refresh_timeout calls pubsub_on_refresh_timeout
which calls send_notify
2.3. The send_notify set send_scheduled_notify = 0;

The serialized_send_notify should always unset notify_sched_id.

ASTERISK-29904 #close

Change-Id: Ifc50c00b213c396509e10326a1ed89d8cf8c7875

res/res_pjsip_pubsub.c

index 60506db5c9ee1c34e5b4db1b8c1e0b226f2483b1..dae3fefab04026d446b422e39b96b997ce366519 100644 (file)
@@ -2492,6 +2492,8 @@ static int serialized_send_notify(void *userdata)
 
        pjsip_dlg_inc_lock(dlg);
 
+       sub_tree->notify_sched_id = -1;
+
        /* It's possible that between when the notification was scheduled
         * and now a new SUBSCRIBE arrived requiring full state to be
         * sent out in an immediate NOTIFY. It's also possible that we're
@@ -2517,7 +2519,6 @@ static int serialized_send_notify(void *userdata)
                        ? "SUBSCRIPTION_TERMINATED" : "SUBSCRIPTION_STATE_CHANGED",
                "Resource: %s", sub_tree->root->resource);
 
-       sub_tree->notify_sched_id = -1;
        pjsip_dlg_dec_lock(dlg);
        ao2_cleanup(sub_tree);
        return 0;