-
Notifications
You must be signed in to change notification settings - Fork 851
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[core] Fix hang up on not enough space in the RCV buffer. #2745
Conversation
When there is space available in the receiving buffer after it has been fulled, send an ack to allow the transmitter to resume transmission
Naming convention is now respected and explicit check on true removed |
I pushed some modification that are not intended to be merged as is. They are just a "quickfix" to allow for further debug with Maxim |
I feel like diff --git a/srtcore/core.cpp b/srtcore/core.cpp
index 0e3cce0..dac1f03 100644
--- a/srtcore/core.cpp
+++ b/srtcore/core.cpp
@@ -7904,6 +7904,7 @@ int srt::CUDT::sendCtrlAck(CPacket& ctrlpkt, int size)
SRT_ASSERT(ctrlpkt.getMsgTimeStamp() != 0);
int nbsent = 0;
int local_prevack = 0;
+ bool sendAckAgain = false; //Send ack again after a buffer full was detected
#if ENABLE_HEAVY_LOGGING
struct SaveBack
@@ -7927,12 +7928,16 @@ int srt::CUDT::sendCtrlAck(CPacket& ctrlpkt, int size)
// The TSBPD thread may change the first lost sequence record (TLPKTDROP).
// To avoid it the m_RcvBufferLock has to be acquired.
UniqueLock bufflock(m_RcvBufferLock);
+ if (m_bBufferWasFull && getAvailRcvBufferSizeNoLock() > 0)
+ {
+ sendAckAgain = true;
+ }
int32_t ack; // First unacknowledged packet sequence number (acknowledge up to ack).
if (!getFirstNoncontSequence((ack), (reason)))
return nbsent;
- if (m_iRcvLastAckAck == ack)
+ if (m_iRcvLastAckAck == ack && !sendAckAgain)
{
HLOGC(xtlog.Debug,
log << CONID() << "sendCtrl(UMSG_ACK): last ACK %" << ack << "(" << reason << ") == last ACKACK");
@@ -7941,7 +7946,7 @@ int srt::CUDT::sendCtrlAck(CPacket& ctrlpkt, int size)
// send out a lite ACK
// to save time on buffer processing and bandwidth/AS measurement, a lite ACK only feeds back an ACK number
- if (size == SEND_LITE_ACK)
+ if (size == SEND_LITE_ACK && !sendAckAgain)
{
bufflock.unlock();
ctrlpkt.pack(UMSG_ACK, NULL, &ack, size);
@@ -8101,7 +8106,7 @@ int srt::CUDT::sendCtrlAck(CPacket& ctrlpkt, int size)
// [[using locked(m_RcvBufferLock)]];
// Send out the ACK only if has not been received by the sender before
- if (CSeqNo::seqcmp(m_iRcvLastAck, m_iRcvLastAckAck) > 0)
+ if (CSeqNo::seqcmp(m_iRcvLastAck, m_iRcvLastAckAck) > 0 || sendAckAgain)
{
// NOTE: The BSTATS feature turns on extra fields above size 6
// also known as ACKD_TOTAL_SIZE_VER100.
@@ -8117,9 +8122,7 @@ int srt::CUDT::sendCtrlAck(CPacket& ctrlpkt, int size)
data[ACKD_RTT] = m_iSRTT;
data[ACKD_RTTVAR] = m_iRTTVar;
data[ACKD_BUFFERLEFT] = (int) getAvailRcvBufferSizeNoLock();
- // a minimum flow window of 2 is used, even if buffer is full, to break potential deadlock
- if (data[ACKD_BUFFERLEFT] < 2)
- data[ACKD_BUFFERLEFT] = 2;
+ m_bBufferWasFull = (data[ACKD_BUFFERLEFT] == 0);
if (steady_clock::now() - m_tsLastAckTime > m_tdACKInterval)
{
diff --git a/srtcore/core.h b/srtcore/core.h
index e7ca57c..eb3e73f 100644
--- a/srtcore/core.h
+++ b/srtcore/core.h
@@ -934,7 +934,7 @@ private: // Receiving related data
int32_t m_iAckSeqNo; // Last ACK sequence number
sync::atomic<int32_t> m_iRcvCurrSeqNo; // (RCV) Largest received sequence number. RcvQTh, TSBPDTh.
int32_t m_iRcvCurrPhySeqNo; // Same as m_iRcvCurrSeqNo, but physical only (disregarding a filter)
-
+ bool m_bBufferWasFull; // Indicate that RX buffer was full last time a ack was sent
int32_t m_iPeerISN; // Initial Sequence Number of the peer side
uint32_t m_uPeerSrtVersion;
|
With the help of @maxsharabayko , this bug should be fixed by my last commit. Reschedule was done before m_iSndLastAck was updated, this could cause issues when the flightspan was close to the available size on the receiver |
* [core] Fix crypto mode auto for listener sender (Haivision#2711). Co-authored-by: oviano <[email protected]> * [build] Upgraded CI: ubuntu to version 20.04 (Haivision#2682). * [docs] Added the link for registration in slack to the getting started table (Haivision#2721). * [core] Fixed FEC Emergency resize crash (Haivision#2717). Fixed minimum history condition. * [core] Fixed various compiler warnings on various platforms (Haivision#2679). * [core] Minor fix of variable shadowing. * [tests] Minor fix of variable shadowing. * [build] Add -Wshadow=local to CMake build flags. Supported since GCC 7.0. * [core] Correct remaining endianness issues Fixes the last two remaining test failures on big-endian. These operations were all already no-ops on little-endian, and unnecessarily byteswapped the IP addresses on big-endian. Closes: Haivision#2697 * [docs] Minor updates to AEAD docs plus changed v1.6.0 to 1.5.2 in some files * [build] Fix downversioning of _WIN32_WINNT (Haivision#2754). * [core] Fixed unhandled error in haicrypt (Haivision#2685). * [core] Use overlapped WSASendTo to avoid loss in UDP sending (Haivision#2632). * [core] Add volatile keyword to asm block in rdtsc (Haivision#2759). * [core] Fixed srctime from closing socket was mistakenly cleared * [core] Fixed group read-ready epoll events. * [core] Removed unused CUDTGroup::m_Positions. * [core] Perf improvement of group reading. * [core] Fixed RCV buffer initialization in Rendezvous. * [docs] Updating the explicit information for binding to IPv6 wildcard (Haivision#2765). * [tests] Added custom main with transparent parameters for tests (Haivision#2681). * [core] Fix memory leak when can't buffer a HS packet (Haivision#2757). * [core] Refactor CRcvQueue::storePkt(..) for better resource management (Haivision#2775). * [core] Fix hang up on not enough space in the RCV buffer (Haivision#2745). When there is space available in the receiving buffer after it is full, send an ack to allow the sender to resume transmission. Reschedule sending if ACK decreases the flight span after sending is congested. Co-authored-by: Maxim Sharabayko <[email protected]> * [core] fix tsbpd() may deadlock with processCtrlShutdown() * [core] Slightly optimize the RCV drop by message number (Haivision#2686). Some minor improvements of logs and comments. * [core] Rejection not undertaken in rendezvous after KMX failure (Haivision#2692). * [core] Fix: In rendezvous when processing resulted in ACCEPT it was still sending rejection * [core] Minor code clean up in CRateEstimator. * [core] Initialize ISN and PeerISN in CUDT. * [core] Drop unencrypted packets in GCM mode. * [apps] Fix the build for target without IP_ADD_SOURCE_MEMBERSHIP (Haivision#2779). * [core] Added maximum BW limit for retransmissions (Haivision#2714). * [API] SRT version raised to 1.5.3. * [apps] Fixed conditional IP_ADD_SOURCE_MEMBERSHIP in testmedia (Haivision#2780). * [core] Fixed SRT_ATTR_REQUIRES use. * [build] Added missing public header files in Windows binary installer (Haivision#2784). The header file access_control.h was added to the source tree at some point but was not added to the Windows installer. --------- Co-authored-by: Maxim Sharabayko <[email protected]> Co-authored-by: oviano <[email protected]> Co-authored-by: Sektor van Skijlen <[email protected]> Co-authored-by: Maria Sharabayko <[email protected]> Co-authored-by: Maxim Sharabayko <[email protected]> Co-authored-by: matoro <[email protected]> Co-authored-by: Maria Sharabayko <[email protected]> Co-authored-by: Steve Lhomme <[email protected]> Co-authored-by: Aaron Jencks <[email protected]> Co-authored-by: Guangqing Chen <[email protected]> Co-authored-by: john <[email protected]> Co-authored-by: yomnes0 <[email protected]> Co-authored-by: Mikołaj Małecki <[email protected]> Co-authored-by: Jose Santiago <[email protected]> Co-authored-by: Thierry Lelegard <[email protected]>
When there is space available in the receiving buffer after it has been fulled, send an ack to allow the transmitter to resume transmission