Commit 0e54d28f authored by Damien Neil's avatar Damien Neil

all: remove os.ErrTimeout

It is unclear whether the current definition of os.IsTimeout is
desirable or not. Drop ErrTimeout for now so we can consider adding it
(or some other error) in a future release with a corrected definition.

Fixes #33411

Change-Id: I8b880da7d22afc343a08339eb5f0efd1075ecafe
Reviewed-on: https://go-review.googlesource.com/c/go/+/188758Reviewed-by: default avatarRuss Cox <rsc@golang.org>
Run-TryBot: Damien Neil <dneil@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 2d1a1e0a
...@@ -209,8 +209,6 @@ pkg net/http, type Transport struct, ForceAttemptHTTP2 bool ...@@ -209,8 +209,6 @@ pkg net/http, type Transport struct, ForceAttemptHTTP2 bool
pkg net/http, type Transport struct, ReadBufferSize int pkg net/http, type Transport struct, ReadBufferSize int
pkg net/http, type Transport struct, WriteBufferSize int pkg net/http, type Transport struct, WriteBufferSize int
pkg net, method (*DNSConfigError) Unwrap() error pkg net, method (*DNSConfigError) Unwrap() error
pkg net, method (*DNSError) Is(error) bool
pkg net, method (*OpError) Is(error) bool
pkg net, method (*OpError) Unwrap() error pkg net, method (*OpError) Unwrap() error
pkg net, type DNSError struct, IsNotFound bool pkg net, type DNSError struct, IsNotFound bool
pkg net, type ListenConfig struct, KeepAlive time.Duration pkg net, type ListenConfig struct, KeepAlive time.Duration
...@@ -237,7 +235,6 @@ pkg os (netbsd-arm64), const O_SYNC = 128 ...@@ -237,7 +235,6 @@ pkg os (netbsd-arm64), const O_SYNC = 128
pkg os (netbsd-arm64), const O_TRUNC = 1024 pkg os (netbsd-arm64), const O_TRUNC = 1024
pkg os (netbsd-arm64), const PathListSeparator = 58 pkg os (netbsd-arm64), const PathListSeparator = 58
pkg os (netbsd-arm64), const PathSeparator = 47 pkg os (netbsd-arm64), const PathSeparator = 47
pkg os, var ErrTimeout error
pkg path/filepath (netbsd-arm64-cgo), const ListSeparator = 58 pkg path/filepath (netbsd-arm64-cgo), const ListSeparator = 58
pkg path/filepath (netbsd-arm64-cgo), const Separator = 47 pkg path/filepath (netbsd-arm64-cgo), const Separator = 47
pkg path/filepath (netbsd-arm64), const ListSeparator = 58 pkg path/filepath (netbsd-arm64), const ListSeparator = 58
......
...@@ -49,7 +49,6 @@ package context ...@@ -49,7 +49,6 @@ package context
import ( import (
"errors" "errors"
"internal/oserror"
"internal/reflectlite" "internal/reflectlite"
"sync" "sync"
"time" "time"
...@@ -163,9 +162,6 @@ type deadlineExceededError struct{} ...@@ -163,9 +162,6 @@ type deadlineExceededError struct{}
func (deadlineExceededError) Error() string { return "context deadline exceeded" } func (deadlineExceededError) Error() string { return "context deadline exceeded" }
func (deadlineExceededError) Timeout() bool { return true } func (deadlineExceededError) Timeout() bool { return true }
func (deadlineExceededError) Temporary() bool { return true } func (deadlineExceededError) Temporary() bool { return true }
func (deadlineExceededError) Is(target error) bool {
return target == oserror.ErrTimeout
}
// An emptyCtx is never canceled, has no values, and has no deadline. It is not // An emptyCtx is never canceled, has no values, and has no deadline. It is not
// struct{}, since vars of this type must have distinct addresses. // struct{}, since vars of this type must have distinct addresses.
......
...@@ -5,10 +5,8 @@ ...@@ -5,10 +5,8 @@
package context package context
import ( import (
"errors"
"fmt" "fmt"
"math/rand" "math/rand"
"os"
"runtime" "runtime"
"strings" "strings"
"sync" "sync"
...@@ -649,7 +647,4 @@ func XTestDeadlineExceededSupportsTimeout(t testingT) { ...@@ -649,7 +647,4 @@ func XTestDeadlineExceededSupportsTimeout(t testingT) {
if !i.Timeout() { if !i.Timeout() {
t.Fatal("wrong value for timeout") t.Fatal("wrong value for timeout")
} }
if !errors.Is(DeadlineExceeded, os.ErrTimeout) {
t.Fatal("errors.Is(DeadlineExceeded, os.ErrTimeout) = false, want true")
}
} }
...@@ -250,7 +250,7 @@ var pkgDeps = map[string][]string{ ...@@ -250,7 +250,7 @@ var pkgDeps = map[string][]string{
"compress/gzip": {"L4", "compress/flate"}, "compress/gzip": {"L4", "compress/flate"},
"compress/lzw": {"L4"}, "compress/lzw": {"L4"},
"compress/zlib": {"L4", "compress/flate"}, "compress/zlib": {"L4", "compress/flate"},
"context": {"errors", "internal/oserror", "internal/reflectlite", "sync", "time"}, "context": {"errors", "internal/reflectlite", "sync", "time"},
"database/sql": {"L4", "container/list", "context", "database/sql/driver", "database/sql/internal"}, "database/sql": {"L4", "container/list", "context", "database/sql/driver", "database/sql/internal"},
"database/sql/driver": {"L4", "context", "time", "database/sql/internal"}, "database/sql/driver": {"L4", "context", "time", "database/sql/internal"},
"debug/dwarf": {"L4"}, "debug/dwarf": {"L4"},
......
...@@ -15,32 +15,4 @@ var ( ...@@ -15,32 +15,4 @@ var (
ErrExist = errors.New("file already exists") ErrExist = errors.New("file already exists")
ErrNotExist = errors.New("file does not exist") ErrNotExist = errors.New("file does not exist")
ErrClosed = errors.New("file already closed") ErrClosed = errors.New("file already closed")
ErrTimeout = timeoutError{}
) )
type timeoutError struct{}
func (timeoutError) Error() string { return "deadline exceeded" }
func (timeoutError) Timeout() bool { return true }
type temporaryError struct{}
func (temporaryError) Error() string { return "temporary error" }
func (temporaryError) Temporary() bool { return true }
// IsTimeout reports whether err indicates a timeout.
func IsTimeout(err error) bool {
for err != nil {
if err == ErrTimeout {
return true
}
if x, ok := err.(interface{ Timeout() bool }); ok {
return x.Timeout()
}
if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(ErrTimeout) {
return true
}
err = errors.Unwrap(err)
}
return false
}
package oserror_test
import (
"errors"
"fmt"
"internal/oserror"
"os"
"testing"
)
type ttError struct {
timeout bool
}
func (e ttError) Error() string {
return fmt.Sprintf("ttError{timeout:%v}", e.timeout)
}
func (e ttError) Timeout() bool { return e.timeout }
type isError struct {
err error
}
func (e isError) Error() string { return fmt.Sprintf("isError(%v)", e.err) }
func (e isError) Is(target error) bool { return e.err == target }
func TestIsTimeout(t *testing.T) {
for _, test := range []struct {
want bool
err error
}{
{true, ttError{timeout: true}},
{true, isError{os.ErrTimeout}},
{true, os.ErrTimeout},
{true, fmt.Errorf("wrap: %w", os.ErrTimeout)},
{false, ttError{timeout: false}},
{false, errors.New("error")},
} {
if got, want := oserror.IsTimeout(test.err), test.want; got != want {
t.Errorf("IsTimeout(err) = %v, want %v\n%+v", got, want, test.err)
}
}
}
...@@ -11,7 +11,6 @@ package poll ...@@ -11,7 +11,6 @@ package poll
import ( import (
"errors" "errors"
"internal/oserror"
) )
// ErrNetClosing is returned when a network descriptor is used after // ErrNetClosing is returned when a network descriptor is used after
...@@ -47,10 +46,6 @@ func (e *TimeoutError) Error() string { return "i/o timeout" } ...@@ -47,10 +46,6 @@ func (e *TimeoutError) Error() string { return "i/o timeout" }
func (e *TimeoutError) Timeout() bool { return true } func (e *TimeoutError) Timeout() bool { return true }
func (e *TimeoutError) Temporary() bool { return true } func (e *TimeoutError) Temporary() bool { return true }
func (e *TimeoutError) Is(target error) bool {
return target == oserror.ErrTimeout
}
// ErrNotPollable is returned when the file or socket is not suitable // ErrNotPollable is returned when the file or socket is not suitable
// for event notification. // for event notification.
var ErrNotPollable = errors.New("not pollable") var ErrNotPollable = errors.New("not pollable")
......
...@@ -24,7 +24,6 @@ import "C" ...@@ -24,7 +24,6 @@ import "C"
import ( import (
"context" "context"
"os"
"syscall" "syscall"
"unsafe" "unsafe"
) )
...@@ -38,14 +37,6 @@ func (eai addrinfoErrno) Error() string { return C.GoString(C.gai_strerror(C.i ...@@ -38,14 +37,6 @@ func (eai addrinfoErrno) Error() string { return C.GoString(C.gai_strerror(C.i
func (eai addrinfoErrno) Temporary() bool { return eai == C.EAI_AGAIN } func (eai addrinfoErrno) Temporary() bool { return eai == C.EAI_AGAIN }
func (eai addrinfoErrno) Timeout() bool { return false } func (eai addrinfoErrno) Timeout() bool { return false }
func (eai addrinfoErrno) Is(target error) bool {
switch target {
case os.ErrTimeout:
return eai.Timeout()
}
return false
}
type portLookupResult struct { type portLookupResult struct {
port int port int
err error err error
......
...@@ -2284,14 +2284,6 @@ func (e *httpError) Error() string { return e.err } ...@@ -2284,14 +2284,6 @@ func (e *httpError) Error() string { return e.err }
func (e *httpError) Timeout() bool { return e.timeout } func (e *httpError) Timeout() bool { return e.timeout }
func (e *httpError) Temporary() bool { return true } func (e *httpError) Temporary() bool { return true }
func (e *httpError) Is(target error) bool {
switch target {
case os.ErrTimeout:
return e.timeout
}
return false
}
var errTimeout error = &httpError{err: "net/http: timeout awaiting response headers", timeout: true} var errTimeout error = &httpError{err: "net/http: timeout awaiting response headers", timeout: true}
// errRequestCanceled is set to be identical to the one from h2 to facilitate // errRequestCanceled is set to be identical to the one from h2 to facilitate
...@@ -2626,10 +2618,6 @@ func (tlsHandshakeTimeoutError) Timeout() bool { return true } ...@@ -2626,10 +2618,6 @@ func (tlsHandshakeTimeoutError) Timeout() bool { return true }
func (tlsHandshakeTimeoutError) Temporary() bool { return true } func (tlsHandshakeTimeoutError) Temporary() bool { return true }
func (tlsHandshakeTimeoutError) Error() string { return "net/http: TLS handshake timeout" } func (tlsHandshakeTimeoutError) Error() string { return "net/http: TLS handshake timeout" }
func (tlsHandshakeTimeoutError) Is(target error) bool {
return target == os.ErrTimeout
}
// fakeLocker is a sync.Locker which does nothing. It's used to guard // fakeLocker is a sync.Locker which does nothing. It's used to guard
// test-only fields when not under test, to avoid runtime atomic // test-only fields when not under test, to avoid runtime atomic
// overhead. // overhead.
......
...@@ -516,14 +516,6 @@ func (e *OpError) Temporary() bool { ...@@ -516,14 +516,6 @@ func (e *OpError) Temporary() bool {
return ok && t.Temporary() return ok && t.Temporary()
} }
func (e *OpError) Is(target error) bool {
switch target {
case os.ErrTimeout:
return e.Timeout()
}
return false
}
// A ParseError is the error type of literal network address parsers. // A ParseError is the error type of literal network address parsers.
type ParseError struct { type ParseError struct {
// Type is the type of string that was expected, such as // Type is the type of string that was expected, such as
...@@ -615,14 +607,6 @@ func (e *DNSError) Timeout() bool { return e.IsTimeout } ...@@ -615,14 +607,6 @@ func (e *DNSError) Timeout() bool { return e.IsTimeout }
// error and return a DNSError for which Temporary returns false. // error and return a DNSError for which Temporary returns false.
func (e *DNSError) Temporary() bool { return e.IsTimeout || e.IsTemporary } func (e *DNSError) Temporary() bool { return e.IsTimeout || e.IsTemporary }
func (e *DNSError) Is(target error) bool {
switch target {
case os.ErrTimeout:
return e.Timeout()
}
return false
}
type writerOnly struct { type writerOnly struct {
io.Writer io.Writer
} }
......
...@@ -6,7 +6,6 @@ package net ...@@ -6,7 +6,6 @@ package net
import ( import (
"io" "io"
"os"
"sync" "sync"
"time" "time"
) )
...@@ -85,10 +84,6 @@ func (timeoutError) Error() string { return "deadline exceeded" } ...@@ -85,10 +84,6 @@ func (timeoutError) Error() string { return "deadline exceeded" }
func (timeoutError) Timeout() bool { return true } func (timeoutError) Timeout() bool { return true }
func (timeoutError) Temporary() bool { return true } func (timeoutError) Temporary() bool { return true }
func (timeoutError) Is(target error) bool {
return target == os.ErrTimeout
}
type pipeAddr struct{} type pipeAddr struct{}
func (pipeAddr) Network() string { return "pipe" } func (pipeAddr) Network() string { return "pipe" }
......
...@@ -7,9 +7,7 @@ ...@@ -7,9 +7,7 @@
package net package net
import ( import (
"errors"
"fmt" "fmt"
"internal/oserror"
"internal/poll" "internal/poll"
"internal/testenv" "internal/testenv"
"io" "io"
...@@ -90,9 +88,6 @@ func TestDialTimeout(t *testing.T) { ...@@ -90,9 +88,6 @@ func TestDialTimeout(t *testing.T) {
if nerr, ok := err.(Error); !ok || !nerr.Timeout() { if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
t.Fatalf("#%d: %v", i, err) t.Fatalf("#%d: %v", i, err)
} }
if !errors.Is(err, oserror.ErrTimeout) {
t.Fatalf("#%d: Dial error is not os.ErrTimeout: %v", i, err)
}
} }
} }
} }
......
...@@ -13,7 +13,6 @@ package url ...@@ -13,7 +13,6 @@ package url
import ( import (
"errors" "errors"
"fmt" "fmt"
"internal/oserror"
"sort" "sort"
"strconv" "strconv"
"strings" "strings"
...@@ -28,7 +27,13 @@ type Error struct { ...@@ -28,7 +27,13 @@ type Error struct {
func (e *Error) Unwrap() error { return e.Err } func (e *Error) Unwrap() error { return e.Err }
func (e *Error) Error() string { return e.Op + " " + e.URL + ": " + e.Err.Error() } func (e *Error) Error() string { return e.Op + " " + e.URL + ": " + e.Err.Error() }
func (e *Error) Timeout() bool { return oserror.IsTimeout(e.Err) }
func (e *Error) Timeout() bool {
t, ok := e.Err.(interface {
Timeout() bool
})
return ok && t.Timeout()
}
func (e *Error) Temporary() bool { func (e *Error) Temporary() bool {
t, ok := e.Err.(interface { t, ok := e.Err.(interface {
......
...@@ -22,7 +22,6 @@ var ( ...@@ -22,7 +22,6 @@ var (
ErrExist = errExist() // "file already exists" ErrExist = errExist() // "file already exists"
ErrNotExist = errNotExist() // "file does not exist" ErrNotExist = errNotExist() // "file does not exist"
ErrClosed = errClosed() // "file already closed" ErrClosed = errClosed() // "file already closed"
ErrTimeout = errTimeout() // "deadline exceeded"
ErrNoDeadline = errNoDeadline() // "file type does not support deadline" ErrNoDeadline = errNoDeadline() // "file type does not support deadline"
) )
...@@ -31,7 +30,6 @@ func errPermission() error { return oserror.ErrPermission } ...@@ -31,7 +30,6 @@ func errPermission() error { return oserror.ErrPermission }
func errExist() error { return oserror.ErrExist } func errExist() error { return oserror.ErrExist }
func errNotExist() error { return oserror.ErrNotExist } func errNotExist() error { return oserror.ErrNotExist }
func errClosed() error { return oserror.ErrClosed } func errClosed() error { return oserror.ErrClosed }
func errTimeout() error { return oserror.ErrTimeout }
func errNoDeadline() error { return poll.ErrNoDeadline } func errNoDeadline() error { return poll.ErrNoDeadline }
type timeout interface { type timeout interface {
......
...@@ -58,8 +58,6 @@ func (e Errno) Error() string { ...@@ -58,8 +58,6 @@ func (e Errno) Error() string {
func (e Errno) Is(target error) bool { func (e Errno) Is(target error) bool {
switch target { switch target {
case oserror.ErrTimeout:
return e.Timeout()
case oserror.ErrPermission: case oserror.ErrPermission:
return e == EACCES || e == EPERM return e == EACCES || e == EPERM
case oserror.ErrExist: case oserror.ErrExist:
......
...@@ -65,8 +65,6 @@ func (e Errno) Error() string { ...@@ -65,8 +65,6 @@ func (e Errno) Error() string {
func (e Errno) Is(target error) bool { func (e Errno) Is(target error) bool {
switch target { switch target {
case oserror.ErrTimeout:
return e.Timeout()
case oserror.ErrPermission: case oserror.ErrPermission:
return e == EACCES || e == EPERM return e == EACCES || e == EPERM
case oserror.ErrExist: case oserror.ErrExist:
......
...@@ -29,8 +29,6 @@ func NewError(s string) error { return ErrorString(s) } ...@@ -29,8 +29,6 @@ func NewError(s string) error { return ErrorString(s) }
func (e ErrorString) Is(target error) bool { func (e ErrorString) Is(target error) bool {
switch target { switch target {
case oserror.ErrTimeout:
return e.Timeout()
case oserror.ErrPermission: case oserror.ErrPermission:
return checkErrMessageContent(e, "permission denied") return checkErrMessageContent(e, "permission denied")
case oserror.ErrExist: case oserror.ErrExist:
......
...@@ -121,8 +121,6 @@ func (e Errno) Error() string { ...@@ -121,8 +121,6 @@ func (e Errno) Error() string {
func (e Errno) Is(target error) bool { func (e Errno) Is(target error) bool {
switch target { switch target {
case oserror.ErrTimeout:
return e.Timeout()
case oserror.ErrPermission: case oserror.ErrPermission:
return e == EACCES || e == EPERM return e == EACCES || e == EPERM
case oserror.ErrExist: case oserror.ErrExist:
......
...@@ -115,8 +115,6 @@ const _ERROR_BAD_NETPATH = Errno(53) ...@@ -115,8 +115,6 @@ const _ERROR_BAD_NETPATH = Errno(53)
func (e Errno) Is(target error) bool { func (e Errno) Is(target error) bool {
switch target { switch target {
case oserror.ErrTimeout:
return e.Timeout()
case oserror.ErrPermission: case oserror.ErrPermission:
return e == ERROR_ACCESS_DENIED return e == ERROR_ACCESS_DENIED
case oserror.ErrExist: case oserror.ErrExist:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment