]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Rework peer connection writer to keep individual writes smaller
authorMatt Joiner <anacrolix@gmail.com>
Tue, 14 Jun 2022 04:07:45 +0000 (14:07 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Tue, 14 Jun 2022 06:01:47 +0000 (16:01 +1000)
This fixes an issue with WebRTC when the write buffers get too big.

peer-conn-msg-writer.go

index 3948eb64263f9bebcdbd6e36578e78d7e8ac9d91..87ed47505f952684340083b5726d577e4bfc1932 100644 (file)
@@ -86,19 +86,25 @@ func (cn *peerConnMsgWriter) run(keepAliveTimeout time.Duration) {
                // Flip the buffers.
                frontBuf, cn.writeBuffer = cn.writeBuffer, frontBuf
                cn.mu.Unlock()
-               n, err := cn.w.Write(frontBuf.Bytes())
-               if n != 0 {
-                       lastWrite = time.Now()
-                       keepAliveTimer.Reset(keepAliveTimeout)
+               if frontBuf.Len() == 0 {
+                       panic("expected non-empty front buffer")
+               }
+               var err error
+               for frontBuf.Len() != 0 {
+                       // Limit write size for WebRTC. See https://github.com/pion/datachannel/issues/59.
+                       next := frontBuf.Next(1<<16 - 1)
+                       var n int
+                       n, err = cn.w.Write(next)
+                       if err == nil && n != len(next) {
+                               panic("expected full write")
+                       }
                }
                if err != nil {
                        cn.logger.WithDefaultLevel(log.Debug).Printf("error writing: %v", err)
                        return
                }
-               if n != frontBuf.Len() {
-                       panic("short write")
-               }
-               frontBuf.Reset()
+               lastWrite = time.Now()
+               keepAliveTimer.Reset(keepAliveTimeout)
        }
 }