Hello,
I’'m currently experiencing some troubles with Privacy List which seems to involve how stanza are processed when using the CM.
Use case:
-
UserA, UserB, and UserC are all online and subscribed to one another’'s presence
-
UserA goes invisible
2.1) UserA pushes unavailable presence
2.2) UserA pushes new privacy list (block all outgoing presence)
2.3) UserA pushes available presence
- UserB receives unavailable presence for UserA, UserC does not
I’'ve done some few tests connecting to Openfire directly or through a CM and here are my results.
When connected to OF:
-
each client has a dedicated thread server side for processing incoming stanzas
-
stanza are read and processed one after the other (tested with debugger)
=> everything works fine there
When connected to CM:
- CM has 5 connections (blocking io, mina is not used in that part) to OF and the
incoming traffic for each connection is handled by 5 threads
- This mean that a stanza coming from a particular client will be randomly handled by 1
of this 25 threads.
In my test environment I’'ve setted up a CM with 1 connection and 5 threads.
Playing with the debugger I’'ve seen that the unavailable presence and the privacy list where handled in different threads.
Playing with breakpoints I’‘ve easily been able to have the privacy list set processed before the unavailable presence (meaning that eventhough I’'m invisible everybody see me as online). I think that if I try hard enough I might be able to have the presence push only to a subset of the roster.
Although, from time to time I’'ve seen some ConcurentModificationException in the logs.
org.jivesoftware.wildfire.handler.PresenceUpdateHandler.process(PresenceUpdateHa ndler.java:141)
Internal server error. Triggered by packet:
java.util.ConcurrentModificationException
at
java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)
at java.util.AbstractList$Itr.next(AbstractList.java:420)
at
org.jivesoftware.wildfire.privacy.PrivacyList.shouldBlockPacket(PrivacyList.java :101)
at
org.jivesoftware.wildfire.roster.Roster.broadcastPresence(Roster.java:612)
at
org.jivesoftware.wildfire.handler.PresenceUpdateHandler.broadcastUpdate(Presence UpdateHandler.java:258)
at
org.jivesoftware.wildfire.handler.PresenceUpdateHandler.process(PresenceUpdateHa ndler.java:109)
at
org.jivesoftware.wildfire.handler.PresenceUpdateHandler.process(PresenceUpdateHa ndler.java:153)
at
org.jivesoftware.wildfire.PresenceRouter.handle(PresenceRouter.java:92)
at
org.jivesoftware.wildfire.PresenceRouter.route(PresenceRouter.java:61)
at
org.jivesoftware.wildfire.spi.PacketRouterImpl.route(PacketRouterImpl.java:75)
at
org.jivesoftware.wildfire.multiplex.MultiplexerPacketHandler.processPresence(Mul tiplexerPacketHandler.java:231)
at
org.jivesoftware.wildfire.multiplex.MultiplexerPacketHandler.route(MultiplexerPa cketHandler.java:177)
at
org.jivesoftware.wildfire.net.ConnectionMultiplexerSocketReader$4.run(Connection MultiplexerSocketReader.java:195)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:6 50)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
at java.lang.Thread.run(Thread.java:595)
I don’‘t see an easy way to fix this and I’'m hoping that some of you might have some ideas?