Skip to content

Commit f824d4a

Browse files
committed
be compatible for go 1.10
1 parent 34483b6 commit f824d4a

File tree

9 files changed

+135
-53
lines changed

9 files changed

+135
-53
lines changed

storage/region_uc_v2_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
package storage
55

66
import (
7+
"os"
78
"strings"
9+
"sync"
810
"testing"
911

1012
clientV1 "github.com/qiniu/go-sdk/v7/client"
@@ -21,6 +23,9 @@ func TestUCRetry(t *testing.T) {
2123
SetUcHosts("aaa.aaa.com", "uc.qbox.me")
2224
defer SetUcHosts("uc.qbox.me")
2325

26+
_ = os.Remove(regionV2CachePath)
27+
regionV2Cache = sync.Map{}
28+
2429
r, err := GetRegion(testAK, testBucket)
2530
if err != nil {
2631
t.Fatalf("GetRegion error:%v", err)

storagev2/http_client/http_client.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,9 @@ func NewClient(options *Options) *Client {
192192
options.ShouldFreezeHost = defaultShouldFreezeHost
193193
}
194194
if options.Credentials == nil {
195-
options.Credentials = auth.Default()
195+
if defaultAuth := auth.Default(); defaultAuth != nil {
196+
options.Credentials = defaultAuth
197+
}
196198
}
197199

198200
return &Client{

storagev2/internal/uplog/dns1.12.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//go:build !1.13
2+
// +build !1.13
3+
4+
package uplog
5+
6+
import "net"
7+
8+
func isDnsNotFoundError(dnsError *net.DNSError) bool {
9+
return !dnsError.IsTemporary
10+
}

storagev2/internal/uplog/dns1.13.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//go:build 1.13
2+
// +build 1.13
3+
4+
package uplog
5+
6+
import "net"
7+
8+
func isDnsNotFoundError(dnsError *net.DNSError) bool {
9+
return dnsError.IsNotFound
10+
}

storagev2/internal/uplog/uplog.go

+38-24
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ package uplog
22

33
import (
44
"context"
5-
"crypto/tls"
6-
"errors"
75
"net"
8-
"net/http"
96
"net/url"
107
"os"
118
"strings"
@@ -75,30 +72,47 @@ func getOsVersion() (string, error) {
7572
}
7673

7774
func detectErrorType(err error) ErrorType {
78-
var (
79-
dnsError *net.DNSError
80-
urlError *url.Error
81-
tlsVerifyCertError *tls.CertificateVerificationError
82-
syscallError syscall.Errno
83-
)
84-
if os.IsTimeout(err) || errors.Is(err, syscall.ETIMEDOUT) {
75+
tryToUnwrapUnderlyingError := func(err error) (error, bool) {
76+
switch err := err.(type) {
77+
case *os.PathError:
78+
return err.Err, true
79+
case *os.LinkError:
80+
return err.Err, true
81+
case *os.SyscallError:
82+
return err.Err, true
83+
case *url.Error:
84+
return err.Err, true
85+
case *net.OpError:
86+
return err.Err, true
87+
}
88+
return err, false
89+
}
90+
unwrapUnderlyingError := func(err error) error {
91+
ok := true
92+
for ok {
93+
err, ok = tryToUnwrapUnderlyingError(err)
94+
}
95+
return err
96+
}
97+
98+
unwrapedErr := unwrapUnderlyingError(err)
99+
if os.IsTimeout(unwrapedErr) {
85100
return ErrorTypeTimeout
86-
} else if errors.As(err, &dnsError) && dnsError.IsNotFound {
101+
} else if dnsError, ok := unwrapedErr.(*net.DNSError); ok && isDnsNotFoundError(dnsError) {
87102
return ErrorTypeUnknownHost
88-
} else if os.IsNotExist(err) || os.IsPermission(err) {
103+
} else if os.IsNotExist(unwrapedErr) || os.IsPermission(unwrapedErr) {
89104
return ErrorTypeLocalIoError
90-
} else if errors.Is(err, syscall.ECONNREFUSED) || errors.Is(err, syscall.ECONNABORTED) || errors.Is(err, syscall.ECONNRESET) {
91-
return ErrorTypeCannotConnectToHost
92-
} else if errors.As(err, &syscallError) {
93-
return ErrorTypeUnexpectedSyscallError
94-
} else if errors.Is(err, context.Canceled) {
105+
} else if syscallError, ok := unwrapedErr.(*os.SyscallError); ok {
106+
switch syscallError.Err {
107+
case syscall.ECONNREFUSED, syscall.ECONNABORTED, syscall.ECONNRESET:
108+
return ErrorTypeCannotConnectToHost
109+
default:
110+
return ErrorTypeUnexpectedSyscallError
111+
}
112+
} else if unwrapedErr == context.Canceled {
95113
return ErrorTypeUserCanceled
96-
} else if errors.Is(err, http.ErrSchemeMismatch) {
97-
return ErrorTypeProtocolError
98-
} else if errors.As(err, &tlsVerifyCertError) {
99-
return ErrorTypeSSLError
100-
} else if errors.As(err, &urlError) {
101-
desc := urlError.Err.Error()
114+
} else {
115+
desc := unwrapedErr.Error()
102116
if strings.HasPrefix(desc, "tls: ") ||
103117
strings.HasPrefix(desc, "x509: ") {
104118
return ErrorTypeSSLError
@@ -108,8 +122,8 @@ func detectErrorType(err error) ErrorType {
108122
strings.Contains(desc, "server closed idle connection") {
109123
return ErrorTypeTransmissionError
110124
}
125+
return ErrorTypeUnknownError
111126
}
112-
return ErrorTypeUnknownError
113127
}
114128

115129
func getHttpClientName() string {

storagev2/internal/uplog/uplog_buffer.go

+7-4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bytes"
55
"compress/gzip"
66
"io"
7+
"io/ioutil"
78
"os"
89
"path/filepath"
910
"strings"
@@ -243,7 +244,8 @@ func SetWriteFileBufferInterval(d time.Duration) {
243244
d = 1 * time.Minute
244245
}
245246
uplogWriteFileBufferInterval = d
246-
uplogWriteFileBufferTicker.Reset(d)
247+
uplogWriteFileBufferTicker.Stop()
248+
uplogWriteFileBufferTicker = time.NewTicker(d)
247249
}
248250

249251
func GetWriteFileBufferInterval() time.Duration {
@@ -256,7 +258,8 @@ func GetWriteFileBufferInterval() time.Duration {
256258
func resetWriteFileBufferInterval() {
257259
uplogWriteFileBufferTimerLock.Lock()
258260
defer uplogWriteFileBufferTimerLock.Unlock()
259-
uplogWriteFileBufferTicker.Reset(uplogWriteFileBufferInterval)
261+
uplogWriteFileBufferTicker.Stop()
262+
uplogWriteFileBufferTicker = time.NewTicker(uplogWriteFileBufferInterval)
260263
}
261264

262265
type multipleFileReader struct {
@@ -330,14 +333,14 @@ func (r *multipleFileReader) Close() error {
330333
}
331334

332335
func getArchivedUplogFileBufferPaths(dirPath string) ([]string, error) {
333-
dirEntries, err := os.ReadDir(dirPath)
336+
dirEntries, err := ioutil.ReadDir(dirPath)
334337
if err != nil {
335338
return nil, err
336339
}
337340

338341
archivedPaths := make([]string, 0, len(dirEntries))
339342
for _, dirEntry := range dirEntries {
340-
if !dirEntry.Type().IsRegular() {
343+
if !dirEntry.Mode().IsRegular() {
341344
continue
342345
}
343346
if !strings.HasPrefix(dirEntry.Name(), UPLOG_FILE_BUFFER_NAME+".") {

storagev2/retrier/dns1.12.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//go:build !1.13
2+
// +build !1.13
3+
4+
package retrier
5+
6+
import "net"
7+
8+
func isDnsNotFoundError(dnsError *net.DNSError) bool {
9+
return !dnsError.IsTemporary
10+
}

storagev2/retrier/dns1.13.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//go:build 1.13
2+
// +build 1.13
3+
4+
package retrier
5+
6+
import "net"
7+
8+
func isDnsNotFoundError(dnsError *net.DNSError) bool {
9+
return dnsError.IsNotFound
10+
}

storagev2/retrier/retrier.go

+42-24
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package retrier
22

33
import (
44
"context"
5-
"errors"
65
"net"
76
"net/http"
87
"net/url"
@@ -114,37 +113,56 @@ func getRetryDecisionForError(err error) RetryDecision {
114113
return DontRetry
115114
}
116115

117-
var dnsError *net.DNSError
118-
if os.IsTimeout(err) || errors.Is(err, syscall.ETIMEDOUT) {
119-
return RetryRequest
120-
} else if errors.As(err, &dnsError) && dnsError.IsNotFound {
121-
return TryNextHost
122-
} else if errors.Is(err, syscall.ECONNREFUSED) || errors.Is(err, syscall.ECONNABORTED) || errors.Is(err, syscall.ECONNRESET) {
123-
return TryNextHost
124-
} else if errors.Is(err, context.Canceled) {
125-
return DontRetry
126-
} else if errors.Is(err, http.ErrSchemeMismatch) {
127-
return DontRetry
116+
tryToUnwrapUnderlyingError := func(err error) (error, bool) {
117+
switch err := err.(type) {
118+
case *os.PathError:
119+
return err.Err, true
120+
case *os.LinkError:
121+
return err.Err, true
122+
case *os.SyscallError:
123+
return err.Err, true
124+
case *url.Error:
125+
return err.Err, true
126+
case *net.OpError:
127+
return err.Err, true
128+
}
129+
return err, false
130+
}
131+
unwrapUnderlyingError := func(err error) error {
132+
ok := true
133+
for ok {
134+
err, ok = tryToUnwrapUnderlyingError(err)
135+
}
136+
return err
128137
}
129138

130-
switch t := err.(type) {
131-
case *url.Error:
132-
desc := err.Error()
133-
if strings.Contains(desc, "use of closed network connection") ||
134-
strings.Contains(desc, "unexpected EOF reading trailer") ||
135-
strings.Contains(desc, "transport connection broken") ||
136-
strings.Contains(desc, "server closed idle connection") {
137-
return RetryRequest
138-
} else {
139+
unwrapedErr := unwrapUnderlyingError(err)
140+
if os.IsTimeout(unwrapedErr) {
141+
return RetryRequest
142+
} else if dnsError, ok := unwrapedErr.(*net.DNSError); ok && isDnsNotFoundError(dnsError) {
143+
return TryNextHost
144+
} else if syscallError, ok := unwrapedErr.(*os.SyscallError); ok {
145+
switch syscallError.Err {
146+
case syscall.ECONNREFUSED, syscall.ECONNABORTED, syscall.ECONNRESET:
147+
return TryNextHost
148+
default:
139149
return DontRetry
140150
}
141-
case *clientv1.ErrorInfo:
142-
if isStatusCodeRetryable(t.Code) {
151+
} else if unwrapedErr == context.Canceled {
152+
return DontRetry
153+
} else if clientErr, ok := unwrapedErr.(*clientv1.ErrorInfo); ok {
154+
if isStatusCodeRetryable(clientErr.Code) {
143155
return RetryRequest
144156
} else {
145157
return DontRetry
146158
}
147-
default:
159+
}
160+
desc := unwrapedErr.Error()
161+
if strings.Contains(desc, "use of closed network connection") ||
162+
strings.Contains(desc, "unexpected EOF reading trailer") ||
163+
strings.Contains(desc, "transport connection broken") ||
164+
strings.Contains(desc, "server closed idle connection") {
148165
return RetryRequest
149166
}
167+
return DontRetry
150168
}

0 commit comments

Comments
 (0)