diff options
| author | Chris Lu <chris.lu@gmail.com> | 2014-03-20 11:07:15 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2014-03-20 11:07:15 -0700 |
| commit | 7c5c94785c5789a333987348c3a3e462c143e885 (patch) | |
| tree | 5444c1e046b45d8a189032dc3a4d33067f34055a /go/util/net_timeout.go | |
| parent | c22e5c1c51643dbaed64ffa7e3d2916936dc7691 (diff) | |
| download | seaweedfs-7c5c94785c5789a333987348c3a3e462c143e885.tar.xz seaweedfs-7c5c94785c5789a333987348c3a3e462c143e885.zip | |
switch to idle timeout instead of read timeout
Diffstat (limited to 'go/util/net_timeout.go')
| -rw-r--r-- | go/util/net_timeout.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/go/util/net_timeout.go b/go/util/net_timeout.go new file mode 100644 index 000000000..410152a79 --- /dev/null +++ b/go/util/net_timeout.go @@ -0,0 +1,65 @@ +package util + +import ( + "net" + "time" +) + +// Listener wraps a net.Listener, and gives a place to store the timeout +// parameters. On Accept, it will wrap the net.Conn with our own Conn for us. +type Listener struct { + net.Listener + ReadTimeout time.Duration + WriteTimeout time.Duration +} + +func (l *Listener) Accept() (net.Conn, error) { + c, err := l.Listener.Accept() + if err != nil { + return nil, err + } + tc := &Conn{ + Conn: c, + ReadTimeout: l.ReadTimeout, + WriteTimeout: l.WriteTimeout, + } + return tc, nil +} + +// Conn wraps a net.Conn, and sets a deadline for every read +// and write operation. +type Conn struct { + net.Conn + ReadTimeout time.Duration + WriteTimeout time.Duration +} + +func (c *Conn) Read(b []byte) (int, error) { + err := c.Conn.SetReadDeadline(time.Now().Add(c.ReadTimeout)) + if err != nil { + return 0, err + } + return c.Conn.Read(b) +} + +func (c *Conn) Write(b []byte) (int, error) { + err := c.Conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout)) + if err != nil { + return 0, err + } + return c.Conn.Write(b) +} + +func NewListener(addr string, timeout time.Duration) (net.Listener, error) { + l, err := net.Listen("tcp", addr) + if err != nil { + return nil, err + } + + tl := &Listener{ + Listener: l, + ReadTimeout: timeout, + WriteTimeout: timeout, + } + return tl, nil +} |
