Skip to content

Commit e9a28f7

Browse files
committed
rwconn: confirm to core.RetrierConn interface
1 parent 31936cb commit e9a28f7

1 file changed

Lines changed: 38 additions & 10 deletions

File tree

intra/rwconn.go

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package intra
88

99
import (
10+
"io"
1011
"net"
1112
"time"
1213

@@ -21,10 +22,7 @@ type rwext struct {
2122
minidle uint32 // min idle timeout in secs
2223
}
2324

24-
func (rw rwext) IsZeroDeadline() bool {
25-
r, w := rw.deadlines()
26-
return r == 0 && w == 0
27-
}
25+
var _ core.RetrierConn = (*rwext)(nil)
2826

2927
func (rw rwext) SetTimeoutSockOpt() (secs int, didSet bool) {
3028
r, w := rw.deadlines()
@@ -41,26 +39,56 @@ func (rw rwext) Unwrap() net.Conn {
4139
}
4240

4341
func (rw rwext) Read(b []byte) (n int, err error) {
44-
rw.extend()
42+
rw.extendr()
4543
return rw.Conn.Read(b)
4644
}
4745

4846
func (rw rwext) Write(b []byte) (n int, err error) {
49-
rw.extend()
47+
rw.extendw()
5048
return rw.Conn.Write(b)
5149
}
5250

51+
// ReadFrom implements core.RetrierConn.
52+
func (rw rwext) ReadFrom(r io.Reader) (n int64, err error) {
53+
switch c := rw.Unwrap().(type) {
54+
case io.ReaderFrom:
55+
// disable read and write deadlines for rw.Conn as
56+
// io.ReaderFrom does not support io.Reader+io.Writer
57+
// semantics which rwext relies on to extend deadlines.
58+
rw.extendForever()
59+
return c.ReadFrom(r)
60+
default:
61+
}
62+
bptr := core.Alloc()
63+
b := *bptr
64+
defer func() {
65+
*bptr = b
66+
core.Recycle(bptr)
67+
}()
68+
return io.CopyBuffer(rw, r, b)
69+
}
70+
5371
func (rw rwext) deadlines() (r, w uint32) {
5472
dopt := settings.GetDialerOpts()
5573
// -ve ints go higher than 2^31 w/ uint: go.dev/play/p/Rrqk_V8a7W0
5674
return max(rw.minidle, uint32(dopt.ReadTimeoutSec)),
5775
max(rw.minidle, uint32(dopt.WriteTimeoutSec))
5876
}
5977

60-
func (rw rwext) extend() {
61-
r, w := rw.deadlines()
62-
tr := time.Second * time.Duration(r)
78+
func (rw rwext) extendForever() {
79+
extendc(rw, 0, 0)
80+
}
81+
82+
func (rw rwext) extendw() {
83+
_, w := rw.deadlines()
6384
tw := time.Second * time.Duration(w)
6485

65-
extendc(rw.Conn, tr, tw)
86+
extendw(rw.Conn, tw)
87+
}
88+
89+
func (rw rwext) extendr() {
90+
r, _ := rw.deadlines()
91+
tr := time.Second * time.Duration(r)
92+
93+
extendr(rw.Conn, tr)
6694
}

0 commit comments

Comments
 (0)