Skip to content

Commit 81a31da

Browse files
committed
[core] Fix RCV drop count when dropping on SND DROP REQ.
Extended RCVBUF trace logging.
1 parent 0c5bf7a commit 81a31da

File tree

3 files changed

+35
-9
lines changed

3 files changed

+35
-9
lines changed

srtcore/buffer_rcv.cpp

+19-7
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,9 @@ int CRcvBufferNew::insert(CUnit* unit)
110110
const int offset = CSeqNo::seqoff(m_iStartSeqNo, seqno);
111111

112112
IF_RCVBUF_DEBUG(ScopedLog scoped_log);
113-
IF_RCVBUF_DEBUG(scoped_log.ss << "CRcvBufferNew::insert: seqno " << seqno << " m_iStartSeqNo " << m_iStartSeqNo << " offset " << offset);
113+
IF_RCVBUF_DEBUG(scoped_log.ss << "CRcvBufferNew::insert: seqno " << seqno);
114+
IF_RCVBUF_DEBUG(scoped_log.ss << " msgno " << unit->m_Packet.getMsgSeq(m_bPeerRexmitFlag));
115+
IF_RCVBUF_DEBUG(scoped_log.ss << " m_iStartSeqNo " << m_iStartSeqNo << " offset " << offset);
114116

115117
if (offset < 0)
116118
{
@@ -198,15 +200,17 @@ int CRcvBufferNew::dropUpTo(int32_t seqno)
198200
return iDropCnt;
199201
}
200202

201-
void CRcvBufferNew::dropMessage(int32_t seqnolo, int32_t seqnohi, int32_t msgno)
203+
int CRcvBufferNew::dropMessage(int32_t seqnolo, int32_t seqnohi, int32_t msgno)
202204
{
203205
IF_RCVBUF_DEBUG(ScopedLog scoped_log);
204206
IF_RCVBUF_DEBUG(scoped_log.ss << "CRcvBufferNew::dropMessage: seqnolo " << seqnolo << " seqnohi " << seqnohi << " m_iStartSeqNo " << m_iStartSeqNo);
205207
// TODO: count bytes as removed?
206208
const int end_pos = incPos(m_iStartPos, m_iMaxPosInc);
207209
if (msgno != 0)
208210
{
211+
IF_RCVBUF_DEBUG(scoped_log.ss << " msgno " << msgno);
209212
int minDroppedOffset = -1;
213+
int iDropCnt = 0;
210214
for (int i = m_iStartPos; i != end_pos; i = incPos(i))
211215
{
212216
// TODO: Maybe check status?
@@ -216,12 +220,14 @@ void CRcvBufferNew::dropMessage(int32_t seqnolo, int32_t seqnohi, int32_t msgno)
216220
const int32_t msgseq = m_entries[i].pUnit->m_Packet.getMsgSeq(m_bPeerRexmitFlag);
217221
if (msgseq == msgno)
218222
{
223+
++iDropCnt;
219224
dropUnitInPos(i);
220225
m_entries[i].status = EntryState_Drop;
221226
if (minDroppedOffset == -1)
222227
minDroppedOffset = offPos(m_iStartPos, i);
223228
}
224229
}
230+
IF_RCVBUF_DEBUG(scoped_log.ss << " iDropCnt " << iDropCnt);
225231
// Check if units before m_iFirstNonreadPos are dropped.
226232
bool needUpdateNonreadPos = (minDroppedOffset != -1 && minDroppedOffset <= getRcvDataSize());
227233
releaseNextFillerEntries();
@@ -236,7 +242,7 @@ void CRcvBufferNew::dropMessage(int32_t seqnolo, int32_t seqnohi, int32_t msgno)
236242
m_iFirstReadableOutOfOrder = -1;
237243
updateFirstReadableOutOfOrder();
238244
}
239-
return;
245+
return iDropCnt;
240246
}
241247

242248
// Drop by packet seqno range.
@@ -246,15 +252,17 @@ void CRcvBufferNew::dropMessage(int32_t seqnolo, int32_t seqnohi, int32_t msgno)
246252
{
247253
LOGC(rbuflog.Debug, log << "CRcvBufferNew.dropMessage(): nothing to drop. Requested [" << seqnolo << "; "
248254
<< seqnohi << "]. Buffer start " << m_iStartSeqNo << ".");
249-
return;
255+
return 0;
250256
}
251257

252258
const int start_off = max(0, offset_a);
253259
const int last_pos = incPos(m_iStartPos, offset_b);
254260
int minDroppedOffset = -1;
261+
int iDropCnt = 0;
255262
for (int i = incPos(m_iStartPos, start_off); i != end_pos && i != last_pos; i = incPos(i))
256263
{
257264
dropUnitInPos(i);
265+
++iDropCnt;
258266
m_entries[i].status = EntryState_Drop;
259267
if (minDroppedOffset == -1)
260268
minDroppedOffset = offPos(m_iStartPos, i);
@@ -277,6 +285,8 @@ void CRcvBufferNew::dropMessage(int32_t seqnolo, int32_t seqnohi, int32_t msgno)
277285
m_iFirstReadableOutOfOrder = -1;
278286
updateFirstReadableOutOfOrder();
279287
}
288+
289+
return iDropCnt;
280290
}
281291

282292
int CRcvBufferNew::readMessage(char* data, size_t len, SRT_MSGCTRL* msgctrl)
@@ -288,11 +298,11 @@ int CRcvBufferNew::readMessage(char* data, size_t len, SRT_MSGCTRL* msgctrl)
288298
return 0;
289299
}
290300

291-
IF_RCVBUF_DEBUG(ScopedLog scoped_log);
292-
IF_RCVBUF_DEBUG(scoped_log.ss << "CRcvBufferNew::readMessage. m_iStartSeqNo " << m_iStartSeqNo);
293-
294301
const int readPos = canReadInOrder ? m_iStartPos : m_iFirstReadableOutOfOrder;
295302

303+
IF_RCVBUF_DEBUG(ScopedLog scoped_log);
304+
IF_RCVBUF_DEBUG(scoped_log.ss << "CRcvBufferNew::readMessage. m_iStartSeqNo " << m_iStartSeqNo << " m_iStartPos " << m_iStartPos << " readPos " << readPos);
305+
296306
size_t remain = len;
297307
char* dst = data;
298308
int pkts_read = 0;
@@ -381,6 +391,8 @@ int CRcvBufferNew::readMessage(char* data, size_t len, SRT_MSGCTRL* msgctrl)
381391
LOGC(rbuflog.Error, log << "readMessage: small dst buffer, copied only " << bytes_read << "/" << bytes_extracted << " bytes.");
382392
}
383393

394+
IF_RCVBUF_DEBUG(scoped_log.ss << " pldi64 " << *reinterpret_cast<uint64_t*>(data));
395+
384396
return bytes_read;
385397
}
386398

srtcore/buffer_rcv.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ class CRcvBufferNew
7979
/// @param seqnolo sequence number of the first packet in the dropping range.
8080
/// @param seqnohi sequence number of the last packet in the dropping range.
8181
/// @param msgno message number to drop (0 if unknown)
82-
void dropMessage(int32_t seqnolo, int32_t seqnohi, int32_t msgno);
82+
/// @return the number of packets actually dropped.
83+
int dropMessage(int32_t seqnolo, int32_t seqnohi, int32_t msgno);
8384

8485
/// Read the whole message from one or several packets.
8586
///

srtcore/core.cpp

+14-1
Original file line numberDiff line numberDiff line change
@@ -8814,7 +8814,20 @@ void srt::CUDT::processCtrlDropReq(const CPacket& ctrlpkt)
88148814
{
88158815
ScopedLock rblock(m_RcvBufferLock);
88168816
#if ENABLE_NEW_RCVBUFFER
8817-
m_pRcvBuffer->dropMessage(dropdata[0], dropdata[1], ctrlpkt.getMsgSeq(using_rexmit_flag));
8817+
const int iDropCnt = m_pRcvBuffer->dropMessage(dropdata[0], dropdata[1], ctrlpkt.getMsgSeq(using_rexmit_flag));
8818+
8819+
if (iDropCnt > 0)
8820+
{
8821+
LOGC(brlog.Warn, log << CONID() << "RCV-DROPPED " << iDropCnt << " packet(s), seqno range %"
8822+
<< dropdata[0] << "-%" << dropdata[1] << ", msgno " << ctrlpkt.getMsgSeq(using_rexmit_flag)
8823+
<< " (SND DROP REQUEST).");
8824+
8825+
enterCS(m_StatsLock);
8826+
// Estimate dropped bytes from average payload size.
8827+
const uint64_t avgpayloadsz = m_pRcvBuffer->getRcvAvgPayloadSize();
8828+
m_stats.rcvr.dropped.count(stats::BytesPackets(iDropCnt * avgpayloadsz, (size_t)iDropCnt));
8829+
leaveCS(m_StatsLock);
8830+
}
88188831
#else
88198832
m_pRcvBuffer->dropMsg(ctrlpkt.getMsgSeq(using_rexmit_flag), using_rexmit_flag);
88208833
#endif

0 commit comments

Comments
 (0)