Conversation
774212f to
2b345fa
Compare
|
|
||
| if (was_empty) | ||
| { | ||
| gp->syncWithSocket(s->core(), HSD_RESPONDER); |
There was a problem hiding this comment.
To fix the issue, it should keep previous group-wise sequences even if the group is empty.
| bool CUDTGroup::applyGroupSequences(SRTSOCKET target, int32_t& w_snd_isn, int32_t& w_rcv_isn) | ||
| void CUDTGroup::applyGroupSequences(SRTSOCKET /* not sure if needed */, int32_t& w_snd_isn, int32_t& w_rcv_isn) | ||
| { | ||
| if (m_bConnected) // You are the first one, no need to change. |
There was a problem hiding this comment.
To fix the issue, it should inherit previous group-wise sequences even if the group is not connected (empty).
| , m_bSynSending(true) | ||
| , m_bTsbPd(true) | ||
| , m_bTLPktDrop(true) | ||
| , m_iTsbPdDelay_us(0) |
| // number will collide with any ISN provided by a socket. | ||
| // Also since now every socket will derive this ISN. | ||
| m_iLastSchedSeqNo = generateISN(); | ||
| resetInitialRxSequence(); |
There was a problem hiding this comment.
To fix the issue, it should keep previous group-wise sequences even if the group is empty.
Codecov Report
❗ Your organization is not using the GitHub App Integration. As a result you may experience degraded service beginning May 15th. Please install the Github App Integration for your organization. Read more. @@ Coverage Diff @@
## master #2735 +/- ##
==========================================
- Coverage 67.51% 66.78% -0.74%
==========================================
Files 99 99
Lines 20166 20148 -18
==========================================
- Hits 13616 13456 -160
- Misses 6550 6692 +142
... and 11 files with indirect coverage changes 📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more |
|
I'm sorry, but I completely don't understand the fix. The idea for If the problem was that the first member was broken and it caused inconsistency between connection sides, maybe it could be done differently: the ISN in case of group could be created already by a group when connecting the first socket (there is a possibility to enforce ISN when connecting) so that every socket will come in with exactly the same ISN, no matter which one succeeds as the first connection and therefore the first group member. |
|
Just BTW - I found #2444 that mentions a kind of this problem in the description (Problem 2). Might you be able to check if this solves the same problem or is anyhow related? |
|
Just FYI - I added a test #3020 to try to test the described situation. If this test doesn't represent the problem you have described in this PR, please try to improve it. If I understand the problem correctly, that is, it came from a problem that a new empty group could derive ISN from the first socket, which in case of failure is dismissed, then this behavior is changed: the ISN for the group is set initially to a generated value, which is declared in the constructor. I believe this comment here directly refers to this problem: |
This initialization was done in #1438 (SRT v1.4.2). I suppose the reported problem is on the receiver side 🤔 |
|
This PR cannot be merged at the moment. Changes are unclear as to what has been removed towards the base and why. Refreshing needed. |
|
@gou4shi1 Would you be able to refresh this PR? NOTE: this will be nontrivial, to say the least. Due to various circumstances, this fix was finally postponed to 1.6.0. Conditions and CM rules have slightly changed, however. Multiple PRs have been merged into the intermediate branch, which's view is represented by #3141. Some have also affected changes you provided here. The problem is mainly with the function It would be helpful if you can provide somehow these changes. Could be also helpful if you provide some procedure that allows to reproduce the problem. NOTE: Currently we use the |
|
@ethouris Thank you for still caring so much about my PR. I’m more than willing to help, but I haven’t been involved in this project for nearly two years and will need some free time. |
|
No hurry, we are still ongoing with finalizing 1.5.5 release, it will also take quite a long time. And only then we would be able to do tests on candidates for 1.6.0. |
The issue
The log of receiver:
The correct recv base seq was
%787865610, and then a new member@1071584722was comming while all other members were broken at the same time.@1071584722didn't inherit the correct recv base seq, but defined it's own%787865661However, at the sender side, when the peer of
@1071584722was coming, the peer of@1071584760was not yet broken coincidently, so@1071584722succeeded to inherit the correct send base seq%787865610fromCUDTGroup::m_iLastSchedSeqNo.As a result, the sender sent from
%787865610while the receiver received from%787865661, the first 51 packets triggeredDROPREQ, so only the following packets succeeded to transmit.The proposed solution 1 (this PR)
CUDTGroup::m_iLastSchedSeqNois a good design, because members status can't be consistent all the time in both side, we should store group-wise send-base-seq and recv-base-seq. It's defined by the first connected socket, and is updated by the ACK timer (not by every packet, to reduce overhead).The proposed solution 2
rm this check
so that RESPONDER can just use the
CUDTGROUP::m_iLastSchedSeqNoasm_iISN, instead ofw_hs.m_iISN, then the wholeapplyGroupSequences()function can be eliminated.