Chris Lu
11 years ago
5 changed files with 103 additions and 33 deletions
-
65go/util/net_timeout.go
-
17go/weed/master.go
-
32go/weed/server.go
-
18go/weed/volume.go
-
4go/weed/weed_server/volume_server_handlers.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 |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue