Don’t trigger presence events on MUC presence
Specifically, previously, each MUC would be added as a roster item, and then each join presence would be counted as a resource of that item, triggering 1 to 5 events and more backend logic in slixmpp. As a result, joining big rooms is tremendously slow, (JID() calls, event() calls, __getitem__ calls for nothing), and takes RAM (a quick tracemalloc tells me around 1 MiB for 3500 participants, i.e. 2 big IRC rooms). Those resources may not necessarily be cleaned properly, leading to memory leaks on long-term usage. This is a micro-optimization that adds an attribute to roster items so that MUC room events can be ignored safely while not affecting common roster usage.
This commit is contained in:
parent
e28318c271
commit
52cd8f4b22
@ -752,6 +752,9 @@ class BaseXMPP(XMLStream):
|
|||||||
|
|
||||||
Update the roster with presence information.
|
Update the roster with presence information.
|
||||||
"""
|
"""
|
||||||
|
if self.roster[presence['from']].ignore_updates:
|
||||||
|
return
|
||||||
|
|
||||||
if not self.is_component and not presence['to'].bare:
|
if not self.is_component and not presence['to'].bare:
|
||||||
presence['to'] = self.boundjid
|
presence['to'] = self.boundjid
|
||||||
|
|
||||||
|
@ -160,6 +160,7 @@ class XEP_0045(BasePlugin):
|
|||||||
got_online = False
|
got_online = False
|
||||||
if pr['muc']['room'] not in self.rooms.keys():
|
if pr['muc']['room'] not in self.rooms.keys():
|
||||||
return
|
return
|
||||||
|
self.xmpp.roster[pr['from']].ignore_updates = True
|
||||||
entry = pr['muc'].get_stanza_values()
|
entry = pr['muc'].get_stanza_values()
|
||||||
entry['show'] = pr['show']
|
entry['show'] = pr['show']
|
||||||
entry['status'] = pr['status']
|
entry['status'] = pr['status']
|
||||||
|
@ -56,6 +56,7 @@ class RosterNode(object):
|
|||||||
self.xmpp = xmpp
|
self.xmpp = xmpp
|
||||||
self.jid = jid
|
self.jid = jid
|
||||||
self.db = db
|
self.db = db
|
||||||
|
self.ignore_updates = False
|
||||||
self.auto_authorize = True
|
self.auto_authorize = True
|
||||||
self.auto_subscribe = True
|
self.auto_subscribe = True
|
||||||
self.last_status = None
|
self.last_status = None
|
||||||
|
Loading…
Reference in New Issue
Block a user