@@ -21,11 +21,6 @@ import (
21
21
var dhtReadMessageTimeout = time .Minute
22
22
var ErrReadTimeout = fmt .Errorf ("timed out reading response" )
23
23
24
- type bufferedWriteCloser interface {
25
- ggio.WriteCloser
26
- Flush () error
27
- }
28
-
29
24
// The Protobuf writer performs multiple small writes when writing a message.
30
25
// We need to buffer those writes, to make sure that we're not sending a new
31
26
// packet for every single write.
@@ -34,12 +29,26 @@ type bufferedDelimitedWriter struct {
34
29
ggio.WriteCloser
35
30
}
36
31
37
- func newBufferedDelimitedWriter (str io.Writer ) bufferedWriteCloser {
38
- w := bufio .NewWriter (str )
39
- return & bufferedDelimitedWriter {
40
- Writer : w ,
41
- WriteCloser : ggio .NewDelimitedWriter (w ),
32
+ var writerPool = sync.Pool {
33
+ New : func () interface {} {
34
+ w := bufio .NewWriter (nil )
35
+ return & bufferedDelimitedWriter {
36
+ Writer : w ,
37
+ WriteCloser : ggio .NewDelimitedWriter (w ),
38
+ }
39
+ },
40
+ }
41
+
42
+ func writeMsg (w io.Writer , mes * pb.Message ) error {
43
+ bw := writerPool .Get ().(* bufferedDelimitedWriter )
44
+ bw .Reset (w )
45
+ err := bw .WriteMsg (mes )
46
+ if err == nil {
47
+ err = bw .Flush ()
42
48
}
49
+ bw .Reset (nil )
50
+ writerPool .Put (bw )
51
+ return err
43
52
}
44
53
45
54
func (w * bufferedDelimitedWriter ) Flush () error {
@@ -62,7 +71,6 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) bool {
62
71
cr := ctxio .NewReader (ctx , s ) // ok to use. we defer close stream in this func
63
72
cw := ctxio .NewWriter (ctx , s ) // ok to use. we defer close stream in this func
64
73
r := ggio .NewDelimitedReader (cr , inet .MessageSizeMax )
65
- w := newBufferedDelimitedWriter (cw )
66
74
mPeer := s .Conn ().RemotePeer ()
67
75
68
76
for {
@@ -118,10 +126,7 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) bool {
118
126
}
119
127
120
128
// send out response msg
121
- err = w .WriteMsg (resp )
122
- if err == nil {
123
- err = w .Flush ()
124
- }
129
+ err = writeMsg (cw , resp )
125
130
if err != nil {
126
131
stats .Record (ctx , metrics .ReceivedMessageErrors .M (1 ))
127
132
logger .Debugf ("error writing response: %v" , err )
@@ -237,7 +242,6 @@ func (dht *IpfsDHT) messageSenderForPeer(ctx context.Context, p peer.ID) (*messa
237
242
type messageSender struct {
238
243
s inet.Stream
239
244
r ggio.ReadCloser
240
- w bufferedWriteCloser
241
245
lk sync.Mutex
242
246
p peer.ID
243
247
dht * IpfsDHT
@@ -281,7 +285,6 @@ func (ms *messageSender) prep(ctx context.Context) error {
281
285
}
282
286
283
287
ms .r = ggio .NewDelimitedReader (nstr , inet .MessageSizeMax )
284
- ms .w = newBufferedDelimitedWriter (nstr )
285
288
ms .s = nstr
286
289
287
290
return nil
@@ -377,10 +380,7 @@ func (ms *messageSender) SendRequest(ctx context.Context, pmes *pb.Message) (*pb
377
380
}
378
381
379
382
func (ms * messageSender ) writeMsg (pmes * pb.Message ) error {
380
- if err := ms .w .WriteMsg (pmes ); err != nil {
381
- return err
382
- }
383
- return ms .w .Flush ()
383
+ return writeMsg (ms .s , pmes )
384
384
}
385
385
386
386
func (ms * messageSender ) ctxReadMsg (ctx context.Context , mes * pb.Message ) error {
0 commit comments