[ejabberd] Offline messages and priority
rduke496 at gmail.com
Sun Feb 8 06:22:18 MSK 2015
I have a situation where a given username has 2 different
sessions/connections (under different resource ids). Lets call them
sessions A and B (I won't go into the reasons for this but lets say
it is for "historical reasons")
I would like one of those sessions (B) to never receive any messages
and particularly not offline (mod offline) messages queued for the
The reason I particularly mention offline messages is because in
normal operation messages are sent explicitly to the resource id of
session A and so on they basis they can never get delivered to B.
However, it seems that offline messages are queued against the
username rather than the resource and so both A and B have a race
condition over which can collect the queued offline messages
(depending on which of them connects first). However,I don't want
that. I always want A to collect the offline messages (never B).
Am I correct in thinking that setting a negative priority on Bs
session will accomplish that goal?
That was my assumption (although correct me if I'm wrong) but I still
have the race condition (although seemingly less often). Assuming I
am correct then I was wondering if there was a further race condition
in setting the priority. i.e. could there be a race condition between
B connecting and B asking ejabberd to set a negative priority for the
current session which could mean that B could collect the offline
messages in the meantime? If so then I was wondering if there was
some way to set an implicit priority for a given user such that it is
enforced atomically when they login so the imagined race condition
wouldn't be possible?
More generally - is there some other way (other than setting negative
priority) to stop a given client session from receiving any messages
I am prepared to write a plugin if needs be. I was looking at the
hooks documentation and noticed that there is a hook called
resend_offline_messages_hook but I don't see how that would help me as
it seems to be user oriented. In my case the resource ids of A and B
are predictable/known so I was thinking if it would be possible to
"lie" about there being any offline messages for resource id of B then
I would avoid the problem altogether.
BTW - I may be missing something basic/simple in all this and if so
please feel free to suggest another road I can go down.
All help/suggestions appreciated.
More information about the ejabberd