shashank created CAMEL-26681:
--------------------------------

             Summary: camel-xmpp - the consumer's connection monitor reconnects 
outside the account's lock, and a consumer and a group chat producer of one 
room both re-enter it after a reconnect
                 Key: CAMEL-26681
                 URL: https://issues.apache.org/jira/browse/CAMEL-26681
             Project: Camel
          Issue Type: Improvement
          Components: camel-xmpp
            Reporter: shashank
            Assignee: shashank


Follow-up of CAMEL-25961 (apache/camel#29293), which made the private chat and 
group chat producers log in again and the group chat producer enter its room 
again after a lost connection. Two items of CAMEL-25961 were left out of that 
PR, and one note from its review is for the docs.

h3. 1. The consumer's connection monitor reconnects outside the account's lock

The third bullet of CAMEL-25961. Since CAMEL-25841 the consumers and producers 
of one account share one connection, and the producers connect and log it in 
again through {{XmppEndpoint.reconnect(connection)}}, under the account's lock. 
The consumer's connection monitor ({{XmppConsumer.checkConnection}}) still 
calls {{connection.connect()}} and {{endpoint.login(connection)}} itself, 
without that lock.

This is safe today: Smack's {{connect}} and {{login}} are synchronized, and the 
monitor treats {{AlreadyConnectedException}} and {{AlreadyLoggedInException}} 
(from a producer or Smack's {{ReconnectionManager}} that got there first) as 
done. Moving the monitor onto {{XmppEndpoint.reconnect(connection)}} makes all 
users of an account reconnect the same way and in one place. It must keep the 
room re-entry of the consumer, the handling of a connection that needs no login 
({{login=false}} with a user), and what {{XmppConsumerConnectionRaceTest}} 
checks.

h3. 2. A consumer and a group chat producer of the same account and room share 
one MultiUserChat

Smack keeps one {{MultiUserChat}} per connection and room 
({{MultiUserChatManager.getMultiUserChat}}), so a consumer and a group chat 
producer of the same account and room use the same object, and each of them 
enters the room again after a reconnect. The second one to do so leaves and 
enters again ({{MultiUserChat.join}} leaves first when Smack thinks the room is 
joined). For a moment the consumer is not in the room and can miss room 
messages, and a send of the producer in that moment can be dropped by the room, 
once per reconnect.

{code:java}
from("xmpp://[email protected][email protected]&password=secret").to("log:room");
from("direct:say").to("xmpp://[email protected][email protected]&password=secret");
// after a reconnect both enter dev@conference again on the same MultiUserChat: 
the second leaves first
{code}

Avoiding it needs state shared by all users of the room on that connection, for 
example the session (login) on which the room was last entered, so that whoever 
comes second sees the room as entered already. Routes that use one account per 
consumer or producer of a room, or one room endpoint per account, are not 
affected.

h3. 3. Docs: first group chat message after a reconnect

Add a sentence to the reconnect notes of the component docs (the Connections 
section): after a reconnect, Smack still considers the old session joined to 
the room, so {{MultiUserChat.join}} first sends a leave and waits for its 
answer, up to the reply timeout (5 s by default). The first group chat message 
after a reconnect can therefore wait up to that long, under the producer's 
lock, and other senders of the same producer wait with it. The consumer behaves 
the same when it enters its room again.

_Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to