mirror of
https://github.com/yusing/godoxy.git
synced 2025-07-04 14:04:25 +02:00
feat(pool): add checkExists method to debug build to detect unexpected behavior
This commit is contained in:
parent
c80a557a42
commit
9af42a9439
3 changed files with 28 additions and 15 deletions
|
@ -3,25 +3,23 @@ package pool
|
||||||
import (
|
import (
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
|
"github.com/puzpuzpuz/xsync/v3"
|
||||||
"github.com/yusing/go-proxy/internal/logging"
|
"github.com/yusing/go-proxy/internal/logging"
|
||||||
"github.com/yusing/go-proxy/internal/utils"
|
|
||||||
"github.com/yusing/go-proxy/internal/utils/functional"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
Pool[T Object] struct {
|
Pool[T Object] struct {
|
||||||
m functional.Map[string, T]
|
m *xsync.MapOf[string, T]
|
||||||
name string
|
name string
|
||||||
}
|
}
|
||||||
Object interface {
|
Object interface {
|
||||||
Key() string
|
Key() string
|
||||||
Name() string
|
Name() string
|
||||||
utils.MapMarshaler
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func New[T Object](name string) Pool[T] {
|
func New[T Object](name string) Pool[T] {
|
||||||
return Pool[T]{functional.NewMapOf[string, T](), name}
|
return Pool[T]{xsync.NewMapOf[string, T](), name}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Pool[T]) Name() string {
|
func (p Pool[T]) Name() string {
|
||||||
|
@ -29,6 +27,7 @@ func (p Pool[T]) Name() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Pool[T]) Add(obj T) {
|
func (p Pool[T]) Add(obj T) {
|
||||||
|
p.checkExists(obj.Key())
|
||||||
p.m.Store(obj.Key(), obj)
|
p.m.Store(obj.Key(), obj)
|
||||||
logging.Info().Msgf("%s: added %s", p.name, obj.Name())
|
logging.Info().Msgf("%s: added %s", p.name, obj.Name())
|
||||||
}
|
}
|
||||||
|
@ -50,8 +49,8 @@ func (p Pool[T]) Clear() {
|
||||||
p.m.Clear()
|
p.m.Clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Pool[T]) Base() functional.Map[string, T] {
|
func (p Pool[T]) Iter(fn func(k string, v T) bool) {
|
||||||
return p.m
|
p.m.Range(fn)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Pool[T]) Slice() []T {
|
func (p Pool[T]) Slice() []T {
|
||||||
|
@ -64,11 +63,3 @@ func (p Pool[T]) Slice() []T {
|
||||||
})
|
})
|
||||||
return slice
|
return slice
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Pool[T]) Iter(fn func(k string, v T) bool) {
|
|
||||||
p.m.Range(fn)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p Pool[T]) IterAll(fn func(k string, v T)) {
|
|
||||||
p.m.RangeAll(fn)
|
|
||||||
}
|
|
||||||
|
|
15
internal/utils/pool/pool_debug.go
Normal file
15
internal/utils/pool/pool_debug.go
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
//go:build debug
|
||||||
|
|
||||||
|
package pool
|
||||||
|
|
||||||
|
import (
|
||||||
|
"runtime/debug"
|
||||||
|
|
||||||
|
"github.com/yusing/go-proxy/internal/logging"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (p Pool[T]) checkExists(key string) {
|
||||||
|
if _, ok := p.m.Load(key); ok {
|
||||||
|
logging.Warn().Msgf("%s: key %s already exists\nstacktrace: %s", p.name, key, string(debug.Stack()))
|
||||||
|
}
|
||||||
|
}
|
7
internal/utils/pool/pool_prod.go
Normal file
7
internal/utils/pool/pool_prod.go
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
//go:build !debug
|
||||||
|
|
||||||
|
package pool
|
||||||
|
|
||||||
|
func (p Pool[T]) checkExists(key string) {
|
||||||
|
// no-op in production
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue