[ https://issues.apache.org/jira/browse/PROTON-2646?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Timothy A. Bish resolved PROTON-2646. ------------------------------------- Fix Version/s: protonj2-1.0.0-M11 Resolution: Fixed > [protonj2] Message not sent with multiple senders on the same session > --------------------------------------------------------------------- > > Key: PROTON-2646 > URL: https://issues.apache.org/jira/browse/PROTON-2646 > Project: Qpid Proton > Issue Type: Bug > Components: protonj2 > Reporter: Marco Geri > Assignee: Timothy A. Bish > Priority: Major > Fix For: protonj2-1.0.0-M11 > > > With the following scenario: > * create multiple senders on the same session > * create senders with delivery mode {{DeliveryMode.AT_MOST_ONCE}} > * set a small session outgoing window size so that it can complete under > pressure > * senders do not await settlement > * send many messages from many senders filling the size of the outgoing > window > When the outgoing window size is complete, the {{ClientSender.sendMessage}} > puts the message in a blocking queue and waits for the message to be sent, > but when the outgoing window size decreases the ClientSender does not send > the message in the blocking queue, and the sendMessage still waits for the > message to be sent over the connection. > With some debugging, it seems the problem is around in the ProtonSender. > When sending the message, the ClientSender checks > {{{}ProtonSender.isSendable{}}}: > {code:java} > public boolean isSendable() { > return sendable && sessionWindow.isSendable(); > } {code} > The {{ProtonSender.sendable}} is true, but the function returns false because > the size of the outgoing window is complete. > When the outgoing size decreases, it seems the following ProtonSender handler > is called: > {code:java} > ProtonSender handleSessionCreditStateUpdate(ProtonSessionOutgoingWindow > protonSessionOutgoingWindow) { > final boolean previousSendable = sendable; > sendable = getCredit() > 0 && sessionWindow.isSendable(); > if (previousSendable != sendable) { > signalLinkCreditStateUpdated(); > } > return this; > } > {code} > But the {{signalLinkCreditStateUpdated}} is not called because the > {{previousSendable}} and {{sendable}} are both true, leaving the message in > the blocking queue waiting to be sent. > -- This message was sent by Atlassian Jira (v8.20.10#820010) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org For additional commands, e-mail: dev-h...@qpid.apache.org