aboutsummaryrefslogtreecommitdiff
path: root/go/util/net_timeout.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2014-03-20 11:07:15 -0700
committerChris Lu <chris.lu@gmail.com>2014-03-20 11:07:15 -0700
commit7c5c94785c5789a333987348c3a3e462c143e885 (patch)
tree5444c1e046b45d8a189032dc3a4d33067f34055a /go/util/net_timeout.go
parentc22e5c1c51643dbaed64ffa7e3d2916936dc7691 (diff)
downloadseaweedfs-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.go65
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
+}