aboutsummaryrefslogtreecommitdiff
path: root/weed/util/net_timeout.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/util/net_timeout.go')
-rw-r--r--weed/util/net_timeout.go51
1 files changed, 43 insertions, 8 deletions
diff --git a/weed/util/net_timeout.go b/weed/util/net_timeout.go
index e8075c297..536359eec 100644
--- a/weed/util/net_timeout.go
+++ b/weed/util/net_timeout.go
@@ -1,6 +1,7 @@
package util
import (
+ "github.com/chrislusf/seaweedfs/weed/glog"
"net"
"time"
@@ -36,11 +37,13 @@ type Conn struct {
ReadTimeout time.Duration
WriteTimeout time.Duration
isClosed bool
+ bytesRead int64
+ bytesWritten int64
}
func (c *Conn) Read(b []byte) (count int, e error) {
if c.ReadTimeout != 0 {
- err := c.Conn.SetReadDeadline(time.Now().Add(c.ReadTimeout))
+ err := c.Conn.SetReadDeadline(time.Now().Add(c.ReadTimeout * time.Duration(c.bytesRead/40000+1)))
if err != nil {
return 0, err
}
@@ -48,6 +51,7 @@ func (c *Conn) Read(b []byte) (count int, e error) {
count, e = c.Conn.Read(b)
if e == nil {
stats.BytesIn(int64(count))
+ c.bytesRead += int64(count)
}
return
}
@@ -55,7 +59,7 @@ func (c *Conn) Read(b []byte) (count int, e error) {
func (c *Conn) Write(b []byte) (count int, e error) {
if c.WriteTimeout != 0 {
// minimum 4KB/s
- err := c.Conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout * time.Duration(len(b)/40000+1)))
+ err := c.Conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout * time.Duration(c.bytesWritten/40000+1)))
if err != nil {
return 0, err
}
@@ -63,6 +67,7 @@ func (c *Conn) Write(b []byte) (count int, e error) {
count, e = c.Conn.Write(b)
if e == nil {
stats.BytesOut(int64(count))
+ c.bytesWritten += int64(count)
}
return
}
@@ -78,16 +83,46 @@ func (c *Conn) Close() error {
return err
}
-func NewListener(addr string, timeout time.Duration) (net.Listener, error) {
- l, err := net.Listen("tcp", addr)
+func NewListener(addr string, timeout time.Duration) (ipListner net.Listener, err error) {
+ listner, err := net.Listen("tcp", addr)
if err != nil {
- return nil, err
+ return
}
- tl := &Listener{
- Listener: l,
+ ipListner = &Listener{
+ Listener: listner,
ReadTimeout: timeout,
WriteTimeout: timeout,
}
- return tl, nil
+
+ return
+}
+
+func NewIpAndLocalListeners(host string, port int, timeout time.Duration) (ipListner net.Listener, localListener net.Listener, err error) {
+ listner, err := net.Listen("tcp", JoinHostPort(host, port))
+ if err != nil {
+ return
+ }
+
+ ipListner = &Listener{
+ Listener: listner,
+ ReadTimeout: timeout,
+ WriteTimeout: timeout,
+ }
+
+ if host != "localhost" && host != "" && host != "0.0.0.0" && host != "127.0.0.1" && host != "[::]" && host != "[::1]" {
+ listner, err = net.Listen("tcp", JoinHostPort("localhost", port))
+ if err != nil {
+ glog.V(0).Infof("skip starting on %s:%d: %v", host, port, err)
+ return ipListner, nil, nil
+ }
+
+ localListener = &Listener{
+ Listener: listner,
+ ReadTimeout: timeout,
+ WriteTimeout: timeout,
+ }
+ }
+
+ return
}