[
https://issues.jboss.org/browse/JGRP-1873?page=com.atlassian.jira.plugin....
]
Bela Ban updated JGRP-1873:
---------------------------
Description:
In {{UNICAST2}}, if we have a connection between sender A and receiver B, and B closes the
connection (but not A), then A can end up with missing messages in its send table.
Example:
* A sends messages to B
* A has an entry for B in its send-table: {{B: 10|20}} (lowest sent=10, highest sent=20)
* B has an entry for A in its recv-table: {{A: 10|20}} (lowest received=10, highest
received=20)
* B now gets a view that doesn't contain A and closes its connection to A
** This results in B's connection to A getting removed
* A now sends message {{A::21}}
* B doesn't find an entry in its recv-table for A and sends {{GET-FIRST-SEQNO}} to A
* A receives the request and sends message {{A::11 first}} - {{A:21}} to B. These messages
are sent unreliably, so they can get dropped. Let's assume (for this example) that
some of them are dropped.
* B does receive {{A::11 first}} and creates an entry for A in its recv-table: {{A:
11|21}} (next to be received is {{A:12}})
* Now a spurious {{STABLE(A::15)}} message by B is received by A
** This can happen when B sent the {{STABLE}} message *before* its connection to A was
removed, but the message was delayed, e.g. by garbage collection
** Note that the connection ID ({{conn-id}} is the same, so A will _not_ reject the
{{STABLE}} message by B
* A receives the {{STABLE}} message and purges elements up to 15, so its new entry for B
is: {{B:: 15|21}}
* When B asks A for retransmission of messages {{A::12}} - {{A:21}}, A can only retransmit
messages 16-21, but *not* {{A::12}} - {{A:15}} !
Depending on which messages from A (which it sent unreliably on reception of
{{GET-FIRST-SEQNO}}) were received by B, there would be never-ending retransmission
requests from B to A for all or some messages in {{A[12..15]}}
was:
In {{UNICAST2}}, if we have a connection between sender A and receiver B, and B closes the
connection (but not A), then A can end up with missing messages in its send table.
Example:
* A sends messages to B
* A has an entry for B in its send-table: {{B: 10|20}} (lowest sent=10, highest sent=20)
* B has an entry for A in its recv-table: {{A: 10|20}} (lowest received=10, highest
received=20)
* B now gets a view that doesn't contain A and closes its connection to A
** This results in B's connection to A getting removed
* A now sends message {{A::21}}
* B doesn't find an entry in its recv-table for A and sends {{GET-FIRST-SEQNO}} to A
* A receives the request and sends message {{A::11 first}} - {{A:21}} to B. These messages
are sent unreliably, so they can get dropped. Let's assume (for this example) that
some of them are dropped.
* B does receive {{A::11 first}} and creates an entry for A in its recv-table: {{A:
11|21}} (next to be received is {{A:12}})
* Now a spurious {{STABLE(A::15)}} message by B is received by A
** This can happen when B sent the {{STABLE}} message *before* its connection to A was
removed, but the message was delayed, e.g. by garbage collection
** Note that the connection ID ({{conn-id}} is the same, so A will _not_ reject the
{{STABLE}} message by B
* A receives the {{STABLE}} message and purges elements up to 15, so its new entry for B
is: {{B:: 15|21}}
* When B asks A for retransmission of messages {{A::12}} - {{A:21}}, A can only retransmit
messages 16-21, but *not* {{A::12}} - {{A:15}} !
UNICAST2: unilateral connection close of receiver can lead to missing
seqnos in sender
--------------------------------------------------------------------------------------
Key: JGRP-1873
URL:
https://issues.jboss.org/browse/JGRP-1873
Project: JGroups
Issue Type: Bug
Security Level: Public(Everyone can see)
Reporter: Bela Ban
Assignee: Bela Ban
Fix For: 3.5
In {{UNICAST2}}, if we have a connection between sender A and receiver B, and B closes
the connection (but not A), then A can end up with missing messages in its send table.
Example:
* A sends messages to B
* A has an entry for B in its send-table: {{B: 10|20}} (lowest sent=10, highest sent=20)
* B has an entry for A in its recv-table: {{A: 10|20}} (lowest received=10, highest
received=20)
* B now gets a view that doesn't contain A and closes its connection to A
** This results in B's connection to A getting removed
* A now sends message {{A::21}}
* B doesn't find an entry in its recv-table for A and sends {{GET-FIRST-SEQNO}} to A
* A receives the request and sends message {{A::11 first}} - {{A:21}} to B. These
messages are sent unreliably, so they can get dropped. Let's assume (for this example)
that some of them are dropped.
* B does receive {{A::11 first}} and creates an entry for A in its recv-table: {{A:
11|21}} (next to be received is {{A:12}})
* Now a spurious {{STABLE(A::15)}} message by B is received by A
** This can happen when B sent the {{STABLE}} message *before* its connection to A was
removed, but the message was delayed, e.g. by garbage collection
** Note that the connection ID ({{conn-id}} is the same, so A will _not_ reject the
{{STABLE}} message by B
* A receives the {{STABLE}} message and purges elements up to 15, so its new entry for B
is: {{B:: 15|21}}
* When B asks A for retransmission of messages {{A::12}} - {{A:21}}, A can only
retransmit messages 16-21, but *not* {{A::12}} - {{A:15}} !
Depending on which messages from A (which it sent unreliably on reception of
{{GET-FIRST-SEQNO}}) were received by B, there would be never-ending retransmission
requests from B to A for all or some messages in {{A[12..15]}}
--
This message was sent by Atlassian JIRA
(v6.3.1#6329)