mirror of
https://github.com/minio/minio.git
synced 2025-11-09 13:39:46 -05:00
go1.8: Changes to support golang 1.8 (#4759)
QuirkConn is added to replace net.Conn as a workaround to a golang bug: https://github.com/golang/go/issues/21133
This commit is contained in:
committed by
Harshavardhana
parent
218049300c
commit
b4dc6df35c
@@ -24,7 +24,7 @@ import (
|
||||
|
||||
// BufConn - is a generic stream-oriented network connection supporting buffered reader and read/write timeout.
|
||||
type BufConn struct {
|
||||
net.Conn
|
||||
QuirkConn
|
||||
bufReader *bufio.Reader // buffered reader wraps reader in net.Conn.
|
||||
readTimeout time.Duration // sets the read timeout in the connection.
|
||||
writeTimeout time.Duration // sets the write timeout in the connection.
|
||||
@@ -34,7 +34,7 @@ type BufConn struct {
|
||||
|
||||
// Sets read timeout
|
||||
func (c *BufConn) setReadTimeout() {
|
||||
if c.readTimeout != 0 {
|
||||
if c.readTimeout != 0 && c.canSetReadDeadline() {
|
||||
c.SetReadDeadline(time.Now().UTC().Add(c.readTimeout))
|
||||
}
|
||||
}
|
||||
@@ -91,7 +91,7 @@ func (c *BufConn) Write(b []byte) (n int, err error) {
|
||||
func newBufConn(c net.Conn, readTimeout, writeTimeout time.Duration,
|
||||
updateBytesReadFunc, updateBytesWrittenFunc func(int)) *BufConn {
|
||||
return &BufConn{
|
||||
Conn: c,
|
||||
QuirkConn: QuirkConn{Conn: c},
|
||||
bufReader: bufio.NewReader(c),
|
||||
readTimeout: readTimeout,
|
||||
writeTimeout: writeTimeout,
|
||||
|
||||
48
pkg/http/conn_bug_21133.go
Normal file
48
pkg/http/conn_bug_21133.go
Normal file
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Minio Cloud Storage, (C) 2017 Minio, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package http
|
||||
|
||||
import (
|
||||
"net"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
)
|
||||
|
||||
// QuirkConn - similar to golang net.Conn struct, but contains a workaround of the
|
||||
// following the go bug reported here https://github.com/golang/go/issues/21133.
|
||||
// Once the bug will be fixed, we can remove this structure and replaces it with
|
||||
// the standard net.Conn
|
||||
type QuirkConn struct {
|
||||
net.Conn
|
||||
hadReadDeadlineInPast int32 // atomic
|
||||
}
|
||||
|
||||
// SetReadDeadline - implements a workaround of SetReadDeadline go bug
|
||||
func (q *QuirkConn) SetReadDeadline(t time.Time) error {
|
||||
inPast := int32(0)
|
||||
if t.Before(time.Now()) {
|
||||
inPast = 1
|
||||
}
|
||||
atomic.StoreInt32(&q.hadReadDeadlineInPast, inPast)
|
||||
return q.Conn.SetReadDeadline(t)
|
||||
}
|
||||
|
||||
// canSetReadDeadline - returns if it is safe to set a new
|
||||
// read deadline without triggering golang/go#21133 issue.
|
||||
func (q *QuirkConn) canSetReadDeadline() bool {
|
||||
return atomic.LoadInt32(&q.hadReadDeadlineInPast) != 1
|
||||
}
|
||||
@@ -180,9 +180,6 @@ func TestIsHTTPMethod(t *testing.T) {
|
||||
|
||||
func TestNewHTTPListener(t *testing.T) {
|
||||
errMsg := ": no such host"
|
||||
if runtime.GOOS == "windows" {
|
||||
errMsg = ": No such host is known."
|
||||
}
|
||||
|
||||
remoteAddrErrMsg := "listen tcp 93.184.216.34:9000: bind: cannot assign requested address"
|
||||
if runtime.GOOS == "windows" {
|
||||
@@ -204,7 +201,7 @@ func TestNewHTTPListener(t *testing.T) {
|
||||
}{
|
||||
{[]string{"93.184.216.34:9000"}, nil, time.Duration(0), time.Duration(0), time.Duration(0), nil, nil, nil, errors.New(remoteAddrErrMsg)},
|
||||
{[]string{"example.org:9000"}, nil, time.Duration(0), time.Duration(0), time.Duration(0), nil, nil, nil, errors.New(remoteAddrErrMsg)},
|
||||
{[]string{"unknown-host"}, nil, time.Duration(0), time.Duration(0), time.Duration(0), nil, nil, nil, errors.New("listen tcp: missing port in address unknown-host")},
|
||||
{[]string{"unknown-host"}, nil, time.Duration(0), time.Duration(0), time.Duration(0), nil, nil, nil, errors.New("listen tcp: address unknown-host: missing port in address")},
|
||||
{[]string{"unknown-host:9000"}, nil, time.Duration(0), time.Duration(0), time.Duration(0), nil, nil, nil, errors.New("listen tcp: lookup unknown-host" + errMsg)},
|
||||
{[]string{"localhost:9000", "93.184.216.34:9000"}, nil, time.Duration(0), time.Duration(0), time.Duration(0), nil, nil, nil, errors.New(remoteAddrErrMsg)},
|
||||
{[]string{"localhost:9000", "unknown-host:9000"}, nil, time.Duration(0), time.Duration(0), time.Duration(0), nil, nil, nil, errors.New("listen tcp: lookup unknown-host" + errMsg)},
|
||||
|
||||
Reference in New Issue
Block a user