mirror of
https://github.com/bjdgyc/anylink.git
synced 2025-08-06 19:43:25 +08:00
解决IpAuditMap在UDP下的fatal error: concurrent map read and map write
This commit is contained in:
76
server/pkg/utils/maps_test.go
Normal file
76
server/pkg/utils/maps_test.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
const (
|
||||
NumOfReader = 200
|
||||
NumOfWriter = 100
|
||||
)
|
||||
|
||||
func TestMaps(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
var ipAuditMap IMaps
|
||||
key := "one"
|
||||
value := 100
|
||||
|
||||
testMapData := map[string]int{"basemap": 512, "cmap": 0, "rwmap": 512, "syncmap": 0}
|
||||
for name, len := range testMapData {
|
||||
ipAuditMap = NewMap(name, len)
|
||||
ipAuditMap.Set(key, value)
|
||||
v, ok := ipAuditMap.Get(key)
|
||||
assert.Equal(v.(int), value)
|
||||
assert.True(ok)
|
||||
ipAuditMap.Del(key)
|
||||
v, ok = ipAuditMap.Get(key)
|
||||
assert.Nil(v)
|
||||
assert.False(ok)
|
||||
}
|
||||
}
|
||||
|
||||
func benchmarkMap(b *testing.B, hm IMaps) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
var wg sync.WaitGroup
|
||||
for i := 0; i < NumOfWriter; i++ {
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
for i := 0; i < 100; i++ {
|
||||
hm.Set(strconv.Itoa(i), i*i)
|
||||
hm.Set(strconv.Itoa(i), i*i)
|
||||
hm.Del(strconv.Itoa(i))
|
||||
}
|
||||
wg.Done()
|
||||
}()
|
||||
}
|
||||
for i := 0; i < NumOfReader; i++ {
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
for i := 0; i < 100; i++ {
|
||||
hm.Get(strconv.Itoa(i))
|
||||
}
|
||||
wg.Done()
|
||||
}()
|
||||
}
|
||||
wg.Wait()
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkMaps(b *testing.B) {
|
||||
b.Run("RW map", func(b *testing.B) {
|
||||
myMap := NewMap("rwmap", 512)
|
||||
benchmarkMap(b, myMap)
|
||||
})
|
||||
b.Run("Concurrent map", func(b *testing.B) {
|
||||
myMap := NewMap("cmap", 0)
|
||||
benchmarkMap(b, myMap)
|
||||
})
|
||||
b.Run("Sync map", func(b *testing.B) {
|
||||
myMap := NewMap("syncmap", 0)
|
||||
benchmarkMap(b, myMap)
|
||||
})
|
||||
}
|
Reference in New Issue
Block a user