[OpenSIPS-Devel] presentity expiration and etag handling
Anca Vamanu
anca at opensips.org
Fri Sep 3 17:26:00 CEST 2010
Hi Kennard,
Yes, you are right, I should not delete the htable entry before calling
the publ_notify function. I will fix this. Thanks for pointing out.
Regards,
--
Anca Vamanu
www.voice-system.ro
On 09/03/2010 02:37 AM, Kennard_White at logitech.com wrote:
>
> Hi,
>
> While looking at another feature (see patch upload 3058434) I came
> across a strange behavior and traced it down to a section of presence
> code.
>
> Given an subscription (via SUBSCRIBE) and an existing presentity (via
> PUBLISH) for event "presence", opensips send different NOTIFY PIDFs
> documents depending upon if the presentity is expired via timeout vs
> an explicit PUBLISH with Expires=0 header. In the first case
> (timeout), the NOTIFY PIDF is completely missing the original
> presentity (and the body may be empty if no other tuples). In the
> second case (unpublish), the NOTIFY PIDF has an edited copy of the
> original presentity (with basic status set closed). This occurs when
> the presentity hash tables are enabled and fallback2db is disabled.
>
> I doubt this is a really a bug (the behavior when presentities go away
> is not defined by the RFCs as far as I can tell). But I suspect this
> is a change in behavior introduced by the hash table code. Since some
> clients react very differently to no-body NOTIFY messages compared to
> ones containing 'closed' status, this can (and did) lead to strange
> system behavior.
>
> The root cause of the different behavior is that during message
> cleaning, the presentity is deleted from the hash tables before the
> notification is generated. In more detail, the call sequence is:
>
> publish.c msg_presentity_clean() calls
> notify.c: publ_notify() calls
> notify.c: get_p_notify_body() calls
> notify_body.c: pres_agg_nbody()
>
> The etag of the expiring presentity (or its body index) is passed down
> the above call chain. The last function attempts to "edit" the
> expiring presentity, setting the basic status to 'closed' prior to
> sending out the NOTIFY.
>
> But the stale presentity is deleted from the hash table before the
> above call sequence, thus it never shows up in the list of
> presentities queried by get_p_notify_body() and is not edited to
> indicate closed.
>
> Probably msg_presentity_clean() calling publ_notify() with the
> expiring etag doesn't serve any purpose, at least with fallback2db
> disabled, and is potentially misleading since it doesn't do what one
> would expect.
>
> Regards,
> Kennard
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.opensips.org/pipermail/devel/attachments/20100903/14160cf9/attachment.htm
More information about the Devel
mailing list