go net/http: server.Serve() 使用了已弃用的 net.Error.Temporary()

cuxqih21  于 6个月前  发布在  Go
关注(0)|答案(5)|浏览(48)

Go版本

1.22

在你的模块/工作区中,go env 的输出是什么?

GO111MODULE=''
GOARCH='amd64'
GOBIN=''
GOCACHE='/home/pivotal/.cache/go-build'
GOENV='/home/pivotal/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMODCACHE='/home/pivotal/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/home/pivotal/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/usr/local/go'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/local/go/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.22.0'
GCCGO='gccgo'
GOAMD64='v1'
AR='ar'
CC='gcc'
CXX='g++'
CGO_ENABLED='1'
GOMOD='/home/pivotal/workspace/diego-release/src/code.cloudfoundry.org/go.mod'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build3180483851=/tmp/go-build -gno-record-gcc-switches'

你做了什么?

staticcheck -tests=false -checks SA1019 net/http | grep- i temporary

你看到了什么发生?

/usr/local/go/src/net/http/server.go:3260:40:自Go 1.18起,ne.Temporary已被弃用,因为它不应该被使用:临时错误定义不清。大多数“临时”错误都是超时,少数例外令人惊讶。不要使用这个方法。(SA1019)

你期望看到什么?

在尝试调查如何更新依赖于已弃用的net.Error.Temporary()函数的一些代码库时,我查看了net/http.Server.Serve示例,了解应该怎么做得最好。不幸的是,这里的逻辑也使用了已弃用的Temporary()函数。它还在接受下一个连接之前使用最多1秒的退避延迟。这对于性能似乎不太理想,或者我误解了代码的意图吗?

g6ll5ycj

g6ll5ycj2#

我相信,这主要是检查 EMFILEENFILE 错误,表示进程或系统已用完文件描述符。回退是基于这样的假设:如果我们等待并再次尝试,FDs 可能已经可用。在正常操作中,这些错误不会发生,也不会执行回退。
显然,ECONNRESETECONNABORTED 也会出现。我不确定在什么情况下可能会发生这些错误。
我们可以尝试使 http.Server 代码现代化,但现在它似乎可以正常工作。如果我们重新安排事情,以便我们不调用 Temporary 但具有与今天相同的行为,那就是无益的折腾。如果我们进行功能性更改,我们需要首先了解这些更改应该是什么样的。

5kgi1eie

5kgi1eie3#

如果我们进行功能性更改,首先需要了解这些更改应该是什么。我同意。然而,这感觉就像是一个人吃掉了自己的蛋糕。如果Golang的http.Server等基本部分继续使用它,那么net.Error.Temporary()不应该被弃用,或者应该有更清晰的文档说明该函数会返回true的错误是什么,以便http.Server和其他使用它的代码库可以正确地处理停止使用它的变化。

z0qdvdin

z0qdvdin4#

net.Error.Temporary已被弃用,因为它过于宽泛且明显令人困惑。即使在非常有限的情况下可以安全地使用它,这并不会改变这一点。
然而,我们应该有一个非弃用的替代方案来测试 transient 的Accept错误。已提交#66252并附有具体提案。

相关问题