From 24ebb38d02ea7de820e34f890c4206cf6b891955 Mon Sep 17 00:00:00 2001 From: "Vojtech Vitek (golang.cz)" Date: Thu, 28 Nov 2024 17:20:38 +0100 Subject: [PATCH 1/3] Try to fix Github action access issue (#51) --- .github/workflows/benchmark.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index 152f323..a3b6091 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -1,7 +1,11 @@ name: Bechmark on: - pull_request: + pull_request_target: + +permissions: + contents: read + pull-requests: write jobs: benchmark: From 9d627fb3c8a009b20ae198abe84b3a1d10a22a94 Mon Sep 17 00:00:00 2001 From: George <104024088+neuralcoral@users.noreply.github.com> Date: Thu, 28 Nov 2024 08:24:01 -0800 Subject: [PATCH 2/3] Update README.md: add missing 'time' import in code example (#49) * Added missing "time" import in README.md * Use tab --------- Co-authored-by: Vojtech Vitek (golang.cz) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fcb7eb3..074fee5 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ package main import ( "net/http" + "time" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" From c0b6272bcac673c105a4d29c98dd9be27a0d644d Mon Sep 17 00:00:00 2001 From: Peter Kieltyka Date: Sat, 29 Mar 2025 16:29:09 -0400 Subject: [PATCH 3/3] upgrade to xxh3 hashing pkg (#54) --- _example/go.mod | 10 ++++++++-- _example/go.sum | 14 ++++++++++---- go.mod | 13 ++++++++++--- go.sum | 16 ++++++++++------ limit_key.go | 4 ++-- local_counter.go | 24 ++++++++++++++++++++++-- local_counter_go1.20.go | 21 --------------------- local_counter_go1.21.go | 25 ------------------------- 8 files changed, 62 insertions(+), 65 deletions(-) delete mode 100644 local_counter_go1.20.go delete mode 100644 local_counter_go1.21.go diff --git a/_example/go.mod b/_example/go.mod index e24b12b..98303cd 100644 --- a/_example/go.mod +++ b/_example/go.mod @@ -1,6 +1,8 @@ module github.com/go-chi/httprate/_example -go 1.22.5 +go 1.23.0 + +toolchain go1.24.1 replace github.com/go-chi/httprate => ../ @@ -9,4 +11,8 @@ require ( github.com/go-chi/httprate v0.0.0-00010101000000-000000000000 ) -require github.com/cespare/xxhash/v2 v2.3.0 // indirect +require ( + github.com/klauspost/cpuid/v2 v2.2.10 // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + golang.org/x/sys v0.30.0 // indirect +) diff --git a/_example/go.sum b/_example/go.sum index 29685bd..dca1b96 100644 --- a/_example/go.sum +++ b/_example/go.sum @@ -1,6 +1,12 @@ -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/go.mod b/go.mod index 998cbf5..90b49fa 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,14 @@ module github.com/go-chi/httprate -go 1.17 +go 1.23.0 -require github.com/cespare/xxhash/v2 v2.3.0 +toolchain go1.24.1 -require golang.org/x/sync v0.7.0 // indirect +require github.com/zeebo/xxh3 v1.0.2 + +require golang.org/x/sys v0.30.0 // indirect + +require ( + github.com/klauspost/cpuid/v2 v2.2.10 // indirect + golang.org/x/sync v0.12.0 +) diff --git a/go.sum b/go.sum index 09aebbf..6805a1c 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,10 @@ -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/limit_key.go b/limit_key.go index dbc6966..1a1ff1d 100644 --- a/limit_key.go +++ b/limit_key.go @@ -4,11 +4,11 @@ import ( "fmt" "time" - "github.com/cespare/xxhash/v2" + "github.com/zeebo/xxh3" ) func LimitCounterKey(key string, window time.Time) uint64 { - h := xxhash.New() + h := xxh3.New() h.WriteString(key) h.WriteString(fmt.Sprintf("%d", window.Unix())) return h.Sum64() diff --git a/local_counter.go b/local_counter.go index d152a6c..37cd083 100644 --- a/local_counter.go +++ b/local_counter.go @@ -4,7 +4,7 @@ import ( "sync" "time" - "github.com/cespare/xxhash/v2" + "github.com/zeebo/xxh3" ) // NewLocalLimitCounter creates an instance of localCounter, @@ -71,8 +71,28 @@ func (c *localCounter) Increment(key string, currentWindow time.Time) error { return c.IncrementBy(key, currentWindow, 1) } +func (c *localCounter) evict(currentWindow time.Time) { + if c.latestWindow == currentWindow { + return + } + + previousWindow := currentWindow.Add(-c.windowLength) + if c.latestWindow == previousWindow { + c.latestWindow = currentWindow + // Shift the windows without map re-allocation. + clear(c.previousCounters) + c.latestCounters, c.previousCounters = c.previousCounters, c.latestCounters + return + } + + c.latestWindow = currentWindow + + clear(c.previousCounters) + clear(c.latestCounters) +} + func limitCounterKey(key string) uint64 { - h := xxhash.New() + h := xxh3.New() h.WriteString(key) return h.Sum64() } diff --git a/local_counter_go1.20.go b/local_counter_go1.20.go deleted file mode 100644 index e73a839..0000000 --- a/local_counter_go1.20.go +++ /dev/null @@ -1,21 +0,0 @@ -//go:build !go1.21 - -package httprate - -import "time" - -func (c *localCounter) evict(currentWindow time.Time) { - if c.latestWindow == currentWindow { - return - } - - previousWindow := currentWindow.Add(-c.windowLength) - if c.latestWindow == previousWindow { - c.latestWindow = currentWindow - c.latestCounters, c.previousCounters = make(map[uint64]int), c.latestCounters - return - } - - c.latestWindow = currentWindow - c.previousCounters, c.latestCounters = make(map[uint64]int), make(map[uint64]int) -} diff --git a/local_counter_go1.21.go b/local_counter_go1.21.go deleted file mode 100644 index 5aab646..0000000 --- a/local_counter_go1.21.go +++ /dev/null @@ -1,25 +0,0 @@ -//go:build go1.21 - -package httprate - -import "time" - -func (c *localCounter) evict(currentWindow time.Time) { - if c.latestWindow == currentWindow { - return - } - - previousWindow := currentWindow.Add(-c.windowLength) - if c.latestWindow == previousWindow { - c.latestWindow = currentWindow - // Shift the windows without map re-allocation. - clear(c.previousCounters) - c.latestCounters, c.previousCounters = c.previousCounters, c.latestCounters - return - } - - c.latestWindow = currentWindow - - clear(c.previousCounters) - clear(c.latestCounters) -}