]> Cypherpunks.ru repositories - nncp.git/commitdiff
Buffer SP packets marshaling
authorSergey Matveev <stargrave@stargrave.org>
Fri, 20 Dec 2019 10:59:19 +0000 (13:59 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sun, 22 Dec 2019 18:13:04 +0000 (21:13 +0300)
doc/news.ru.texi
doc/news.texi
src/sp.go

index 71c82d8a3896471d7a60a9ea4299a1e5bc508a6e..beb54fcd4fba48a0fbe197b4608b3cc0f98bfe8a 100644 (file)
 @item
 Завершать все порождаемые в SP протоколе горутины, меньше утечек памяти.
 
+@item
+SP протокол порождает меньше вызовов записей (соответственно, и TCP
+пакетов) в сокет.
+
 @end itemize
 
 @node Релиз 5.2.1
index 7c725402c656f1e159d8717ffe2232b2754432b1..3693d70fbc4eae045b345e9808f21bf2e180a1c1 100644 (file)
@@ -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
index 9389cacd38a6ff307db10f5e1feeb057c8bab847..d2123ee590d43663f978cf05d74ef5b6d4184114 100644 (file)
--- 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)
        }