fix: 按完成时刻分批清理并限制读连接池
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestReaderPoolCapAndQueryOnly(t *testing.T) {
|
||||
t.Parallel()
|
||||
dir := t.TempDir()
|
||||
db, err := Open(dir, "FULL")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(func() { _ = db.Close() })
|
||||
|
||||
ctx := context.Background()
|
||||
if _, err := db.Read.ExecContext(ctx, `INSERT INTO settings(key,value,updated_at) VALUES('x','y',1)`); err == nil {
|
||||
t.Fatal("query_only reader accepted write")
|
||||
}
|
||||
|
||||
var maxOpen atomic.Int32
|
||||
var wg sync.WaitGroup
|
||||
for i := 0; i < 200; i++ {
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
var one int
|
||||
if qErr := db.Read.QueryRowContext(ctx, `SELECT 1`).Scan(&one); qErr != nil {
|
||||
t.Errorf("read: %v", qErr)
|
||||
return
|
||||
}
|
||||
n := int32(db.Read.Stats().OpenConnections)
|
||||
for {
|
||||
cur := maxOpen.Load()
|
||||
if n <= cur || maxOpen.CompareAndSwap(cur, n) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
wg.Wait()
|
||||
if maxOpen.Load() > 64 {
|
||||
t.Fatalf("open connections %d exceed 64", maxOpen.Load())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user