golang / go

The Go programming language
https://go.dev
BSD 3-Clause "New" or "Revised" License
123.31k stars 17.58k forks source link

x/time/rate: incomplete dependency injection in Limiter #48020

Open MikeSpreitzer opened 3 years ago

MikeSpreitzer commented 3 years ago

What version of Go are you using (go version)?

$ go version
go version go1.16.7 darwin/amd64

Does this issue reproduce with the latest release?

Yes.

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/mspreitz/Library/Caches/go-build"
GOENV="/Users/mspreitz/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/mspreitz/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/mspreitz/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="go1.16.7"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/vs/qkb72z0s57s_yr0ttjfzh8h40000gn/T/go-build213368521=/tmp/go-build -gno-record-gcc-switches -fno-common"

What did you do?

I wanted to use x/time/rate.Limiter with client-supplied time behavior. I discovered that this is possible with all the FooN methods except WaitN.

What did you expect to see?

I expected a variety of Wait that lets the client supply clock behavior (both the reading of time and waiting for the advance of time).

What did you see instead?

The implementation of WaitN uses the real clock to read Now() and create and use a Timer.

cherrymui commented 3 years ago

cc @bradfitz @Sajmani