From 4f2143a5f37ed2f8865034dd993ed4ff7917dc9e Mon Sep 17 00:00:00 2001 From: lazedo Date: Sat, 13 May 2017 16:53:40 +0100 Subject: [PATCH] allow immediate update on media crash --- kamailio/defs.cfg | 4 ++++ kamailio/kazoodb.sql | 1 + kamailio/presence-reset.cfg | 43 +++++++++++++++++++++++++++---------- kamailio/presence-role.cfg | 4 +--- 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/kamailio/defs.cfg b/kamailio/defs.cfg index e2aeb57..f483953 100644 --- a/kamailio/defs.cfg +++ b/kamailio/defs.cfg @@ -59,4 +59,8 @@ #!define DISPATCHER_ADD_SERVERS 1 #!endif +#!ifndef PRESENCE_RESET_BLF_DEFER_UPDATE +#!define PRESENCE_RESET_BLF_DEFER_UPDATE 0 +#!endif + # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab diff --git a/kamailio/kazoodb.sql b/kamailio/kazoodb.sql index 50ac76a..3fa6705 100644 --- a/kamailio/kazoodb.sql +++ b/kamailio/kazoodb.sql @@ -845,6 +845,7 @@ CREATE INDEX topos_t_rectime_idx ON topos_t (rectime); CREATE INDEX topos_t_a_callid_idx ON topos_t (a_callid); CREATE INDEX presentity_presentity_expires ON presentity (expires); CREATE INDEX presentity_account_idx ON presentity (username, domain, event); +CREATE INDEX presentity_sender ON presentity (sender, username, domain, event); CREATE INDEX active_watchers_active_watchers_expires ON active_watchers (expires); CREATE INDEX active_watchers_active_watchers_pres ON active_watchers (presentity_uri, event); CREATE INDEX active_watchers_updated_idx ON active_watchers (updated); diff --git a/kamailio/presence-reset.cfg b/kamailio/presence-reset.cfg index 36b23a1..3ecc20e 100644 --- a/kamailio/presence-reset.cfg +++ b/kamailio/presence-reset.cfg @@ -1,5 +1,19 @@ + +kazoo.presence_reset_blf_defer_update = PRESENCE_RESET_BLF_DEFER_UPDATE descr "defers blf reset" + + ##### PRESENCE RESET ROUTINES +route[PRESENCE_RESET_ROUTE] +{ + $var(runloop) = 1; + while(mq_fetch("blf_reset") == 1 && $var(runloop) < MAX_WHILE_LOOPS) { + $var(Key) = $mqk(blf_reset); + $sht(nodes=>$var(Key)) = 0; + $var(runloop) = $var(runloop) + 1; + } +} + route[PRESENCE_RESET_BINDINGS] { #!import_file "presence-reset-custom-bindings.cfg" @@ -13,8 +27,13 @@ route[PRESENCE_RESET_BINDINGS] route[RESET_PUBLISHER] { - xlog("L_INFO", "$var(Msg-ID)|reset|received presence reset for publisher $var(MediaUrl))\n"); - sql_query("exec", "delete from presentity where sender = \"$var(MediaUrl)\""); + xlog("L_INFO", "$var(Msg-ID)|reset|received presence reset for publisher $var(MediaUrl))\n"); + if(@cfg_get.kazoo.presence_reset_blf_defer_update == 0) { + $var(Query) = $_s(update active_watchers set expires = $TS where id in (select b.id from presentity a inner join active_watchers b on a.username = b.to_user and a.domain = b.to_domain and a.event = b.event where a.sender = "$var(MediaUrl)")); + sql_query("exec", "$var(Query)"); + } + $var(Query) = $_s(delete from presentity where sender = "$var(MediaUrl)"); + sql_query("exec", "$var(Query)"); $var(presentities) = $sqlrows(exec); xlog("L_INFO", "$var(Msg-ID)|reset|removed $var(presentities) presentities from publisher $var(MediaUrl)\n"); } @@ -88,26 +107,28 @@ event_route[kazoo:consumer-event-presence-reset] xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|received presence reset for $(kzE{kz.json,Username})@$(kzE{kz.json,Realm})\n"); $var(presentity) = "sip:" + $(kzE{kz.json,Username}) + "@" + $(kzE{kz.json,Realm}); + route(COUNT_SUBSCRIBERS); sql_query("exec", 'delete from presentity where domain="$(kzE{kz.json,Realm})" and username = "$(kzE{kz.json,Username})"'); - if(pres_has_subscribers("$var(presentity)", "message-summary")) { - xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|notifying message-summary subscribers of $var(presentity)\n"); + + if($xavp(watchers=>message-summary) > 0) { + xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|notifying $xavp(watchers=>message-summary) message-summary subscribers of $var(presentity)\n"); pres_refresh_watchers("$var(presentity)", "message-summary", 1); } else { - xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|skip message-summary subscriber notification for $var(presentity))\n"); + xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|skip message-summary subscriber notification for $var(presentity)\n"); } - if(pres_has_subscribers("$var(presentity)", "presence")) { - xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|notifying presence subscribers of $var(presentity)\n"); + if($xavp(watchers=>presence) > 0) { + xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|notifying $xavp(watchers=>presence) presence subscribers of $var(presentity)\n"); pres_refresh_watchers("$var(presentity)", "presence", 1); } else { - xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|skip presence subscriber notification for $var(presentity))\n"); + xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|skip presence subscriber notification for $var(presentity)\n"); } - if(pres_has_subscribers("$var(presentity)", "dialog")) { - xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|notifying dialog subscribers of $var(presentity)\n"); + if($xavp(watchers=>dialog) > 0) { + xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|notifying $xavp(watchers=>dialog) dialog subscribers of $var(presentity)\n"); pres_refresh_watchers("$var(presentity)", "dialog", 1); } else { - xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|skip dialog subscriber notification for $var(presentity))\n"); + xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|skip dialog subscriber notification for $var(presentity)\n"); } } diff --git a/kamailio/presence-role.cfg b/kamailio/presence-role.cfg index fd03e22..94483ce 100644 --- a/kamailio/presence-role.cfg +++ b/kamailio/presence-role.cfg @@ -64,9 +64,6 @@ modparam("nat_traversal", "keepalive_interval", 45) #!include_file "presence_notify_sync-role.cfg" #!endif -#!include_file "presence-reset.cfg" - - ####### Presence Logic ######## #!ifdef NAT_TRAVERSAL_ROLE @@ -274,6 +271,7 @@ event_route[kazoo:consumer-event-presence-update] } +#!include_file "presence-reset.cfg" route[PRESENCE_BINDINGS] {