Browse Source

Merge pull request #73 from aliyun/idle-connect-timeout

Idle connect timeout
Yubin Bai 8 years ago
parent
commit
4710427807
8 changed files with 61 additions and 17 deletions
  1. 1 0
      oss/bucket_test.go
  2. 2 0
      oss/client.go
  3. 5 4
      oss/client_test.go
  4. 2 0
      oss/conf.go
  5. 1 12
      oss/conn.go
  6. 1 1
      oss/const.go
  7. 24 0
      oss/transport_1_6.go
  8. 25 0
      oss/transport_1_7.go

+ 1 - 0
oss/bucket_test.go

@@ -1765,6 +1765,7 @@ func (s *OssBucketSuite) TestGetConfig(c *C) {
 	c.Assert(bucket.getConfig().HTTPTimeout.ConnectTimeout, Equals, time.Second*11)
 	c.Assert(bucket.getConfig().HTTPTimeout.ReadWriteTimeout, Equals, time.Second*12)
 	c.Assert(bucket.getConfig().HTTPTimeout.HeaderTimeout, Equals, time.Second*12)
+	c.Assert(bucket.getConfig().HTTPTimeout.IdleConnTimeout, Equals, time.Second*12)
 	c.Assert(bucket.getConfig().HTTPTimeout.LongTimeout, Equals, time.Second*12*10)
 
 	c.Assert(bucket.getConfig().SecurityToken, Equals, "token")

+ 2 - 0
oss/client.go

@@ -701,6 +701,8 @@ func Timeout(connectTimeoutSec, readWriteTimeout int64) ClientOption {
 			time.Second * time.Duration(readWriteTimeout)
 		client.Config.HTTPTimeout.HeaderTimeout =
 			time.Second * time.Duration(readWriteTimeout)
+		client.Config.HTTPTimeout.IdleConnTimeout =
+			time.Second * time.Duration(readWriteTimeout)
 		client.Config.HTTPTimeout.LongTimeout =
 			time.Second * time.Duration(readWriteTimeout*10)
 	}

+ 5 - 4
oss/client_test.go

@@ -43,12 +43,12 @@ var (
 
 const (
 	// prefix of bucket name for bucket ops test
-	bucketNamePrefix = "go-sdk-test-bucket-xyzu-"
+	bucketNamePrefix = "go-sdk-test-bucket-xyzuv-"
 	// bucket name for object ops test
-	bucketName        = "go-sdk-test-bucket-xyzu-for-object"
-	archiveBucketName = "go-sdk-test-bucket-xyzu-for-archive"
+	bucketName        = "go-sdk-test-bucket-xyzuv-for-object"
+	archiveBucketName = "go-sdk-test-bucket-xyzuv-for-archive"
 	// object name for object ops test
-	objectNamePrefix = "go-sdk-test-object-xyzu-"
+	objectNamePrefix = "go-sdk-test-object-xyzuv-"
 	// sts region is one and only hangzhou
 	stsRegion = "cn-hangzhou"
 )
@@ -1400,6 +1400,7 @@ func (s *OssClientSuite) TestClientOption(c *C) {
 	c.Assert(client.Conn.config.HTTPTimeout.ConnectTimeout, Equals, time.Second*11)
 	c.Assert(client.Conn.config.HTTPTimeout.ReadWriteTimeout, Equals, time.Second*12)
 	c.Assert(client.Conn.config.HTTPTimeout.HeaderTimeout, Equals, time.Second*12)
+	c.Assert(client.Conn.config.HTTPTimeout.IdleConnTimeout, Equals, time.Second*12)
 	c.Assert(client.Conn.config.HTTPTimeout.LongTimeout, Equals, time.Second*12*10)
 
 	c.Assert(client.Conn.config.SecurityToken, Equals, "token")

+ 2 - 0
oss/conf.go

@@ -10,6 +10,7 @@ type HTTPTimeout struct {
 	ReadWriteTimeout time.Duration
 	HeaderTimeout    time.Duration
 	LongTimeout      time.Duration
+	IdleConnTimeout  time.Duration
 }
 
 // Config oss configure
@@ -52,6 +53,7 @@ func getDefaultOssConfig() *Config {
 	config.HTTPTimeout.ReadWriteTimeout = time.Second * 60 // 60s
 	config.HTTPTimeout.HeaderTimeout = time.Second * 60    // 60s
 	config.HTTPTimeout.LongTimeout = time.Second * 300     // 300s
+	config.HTTPTimeout.IdleConnTimeout = time.Second * 50  // 50s
 
 	config.IsUseProxy = false
 	config.ProxyHost = ""

+ 1 - 12
oss/conn.go

@@ -30,19 +30,8 @@ var signKeyList = []string{"acl", "uploads", "location", "cors", "logging", "web
 
 // init 初始化Conn
 func (conn *Conn) init(config *Config, urlMaker *urlMaker) error {
-	httpTimeOut := conn.config.HTTPTimeout
-
 	// new Transport
-	transport := &http.Transport{
-		Dial: func(netw, addr string) (net.Conn, error) {
-			conn, err := net.DialTimeout(netw, addr, httpTimeOut.ConnectTimeout)
-			if err != nil {
-				return nil, err
-			}
-			return newTimeoutConn(conn, httpTimeOut.ReadWriteTimeout, httpTimeOut.LongTimeout), nil
-		},
-		ResponseHeaderTimeout: httpTimeOut.HeaderTimeout,
-	}
+	transport := newTransport(conn, config)
 
 	// Proxy
 	if conn.config.IsUseProxy {

+ 1 - 1
oss/const.go

@@ -128,5 +128,5 @@ const (
 
 	CheckpointFileSuffix = ".cp" // Checkpoint文件后缀
 
-	Version = "1.7.0" // Go sdk版本
+	Version = "1.8.0" // Go sdk版本
 )

+ 24 - 0
oss/transport_1_6.go

@@ -0,0 +1,24 @@
+// +build !go1.7
+
+package oss
+
+import (
+	"net"
+	"net/http"
+)
+
+func newTransport(conn *Conn, config *Config) *http.Transport {
+	httpTimeOut := conn.config.HTTPTimeout
+	// new Transport
+	transport := &http.Transport{
+		Dial: func(netw, addr string) (net.Conn, error) {
+			conn, err := net.DialTimeout(netw, addr, httpTimeOut.ConnectTimeout)
+			if err != nil {
+				return nil, err
+			}
+			return newTimeoutConn(conn, httpTimeOut.ReadWriteTimeout, httpTimeOut.LongTimeout), nil
+		},
+		ResponseHeaderTimeout: httpTimeOut.HeaderTimeout,
+	}
+	return transport
+}

+ 25 - 0
oss/transport_1_7.go

@@ -0,0 +1,25 @@
+// +build go1.7
+
+package oss
+
+import (
+	"net"
+	"net/http"
+)
+
+func newTransport(conn *Conn, config *Config) *http.Transport {
+	httpTimeOut := conn.config.HTTPTimeout
+	// new Transport
+	transport := &http.Transport{
+		Dial: func(netw, addr string) (net.Conn, error) {
+			conn, err := net.DialTimeout(netw, addr, httpTimeOut.ConnectTimeout)
+			if err != nil {
+				return nil, err
+			}
+			return newTimeoutConn(conn, httpTimeOut.ReadWriteTimeout, httpTimeOut.LongTimeout), nil
+		},
+		IdleConnTimeout:       httpTimeOut.IdleConnTimeout,
+		ResponseHeaderTimeout: httpTimeOut.HeaderTimeout,
+	}
+	return transport
+}