From b0aff615e008d4dc2967a2423c6305a3a5fbc635 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Fri, 20 Dec 2019 13:59:19 +0300 Subject: [PATCH] Buffer SP packets marshaling --- doc/news.ru.texi | 4 ++++ doc/news.texi | 4 ++++ src/sp.go | 17 ++++++++++++----- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/doc/news.ru.texi b/doc/news.ru.texi index 71c82d8..beb54fc 100644 --- a/doc/news.ru.texi +++ b/doc/news.ru.texi @@ -14,6 +14,10 @@ @item Завершать все порождаемые в SP протоколе горутины, меньше утечек памяти. +@item +SP протокол порождает меньше вызовов записей (соответственно, и TCP +пакетов) в сокет. + @end itemize @node Релиз 5.2.1 diff --git a/doc/news.texi b/doc/news.texi index 7c72540..3693d70 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -16,6 +16,10 @@ Fixed not occurring handshake messages padding. @item Finish all SP protocol related goroutines, less memory leak. +@item +SP protocol generates less socket write calls, thus generating less TCP +packets. + @end itemize @node Release 5.2.1 diff --git a/src/sp.go b/src/sp.go index 9389cac..d2123ee 100644 --- a/src/sp.go +++ b/src/sp.go @@ -142,11 +142,10 @@ func init() { func MarshalSP(typ SPType, sp interface{}) []byte { var buf bytes.Buffer - var err error - if _, err = xdr.Marshal(&buf, SPHead{typ}); err != nil { + if _, err := xdr.Marshal(&buf, SPHead{typ}); err != nil { panic(err) } - if _, err = xdr.Marshal(&buf, sp); err != nil { + if _, err := xdr.Marshal(&buf, sp); err != nil { panic(err) } return buf.Bytes() @@ -198,6 +197,7 @@ type SPState struct { isDead chan struct{} listOnly bool onlyPkts map[[32]byte]bool + writeSPBuf bytes.Buffer sync.RWMutex } @@ -241,8 +241,15 @@ func (state *SPState) dirUnlock() { } func (state *SPState) WriteSP(dst io.Writer, payload []byte) error { - n, err := xdr.Marshal(dst, SPRaw{Magic: MagicNNCPLv1, Payload: payload}) - if err == nil { + state.writeSPBuf.Reset() + n, err := xdr.Marshal(&state.writeSPBuf, SPRaw{ + Magic: MagicNNCPLv1, + Payload: payload, + }) + if err != nil { + return err + } + if n, err = dst.Write(state.writeSPBuf.Bytes()); err == nil { state.TxLastSeen = time.Now() state.TxBytes += int64(n) } -- 2.44.0