Skip to content

Commit 4d6336a

Browse files
committed
test: fix race condition in handler tests
Add sync.RWMutex to mockTCCFenceStore to protect concurrent access to mock functions from multiple goroutines. This fixes race conditions detected by go test -race. The race detector identified concurrent reads/writes to the mock's function fields when goroutines in traversalCleanChannel tests accessed the mock simultaneously.
1 parent 5d3e708 commit 4d6336a

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

pkg/rm/tcc/fence/handler/tcc_fence_wrapper_handler_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"context"
2222
"database/sql"
2323
"errors"
24+
"sync"
2425
"testing"
2526
"time"
2627

@@ -36,6 +37,7 @@ import (
3637

3738
// mockTCCFenceStore is a mock implementation of TCCFenceStore for testing
3839
type mockTCCFenceStore struct {
40+
mu sync.RWMutex
3941
insertFunc func(tx *sql.Tx, tccFenceDo *model.TCCFenceDO) error
4042
queryFunc func(tx *sql.Tx, xid string, branchId int64) (*model.TCCFenceDO, error)
4143
updateFunc func(tx *sql.Tx, xid string, branchId int64, oldStatus enum.FenceStatus, newStatus enum.FenceStatus) error
@@ -46,48 +48,62 @@ type mockTCCFenceStore struct {
4648
}
4749

4850
func (m *mockTCCFenceStore) InsertTCCFenceDO(tx *sql.Tx, tccFenceDo *model.TCCFenceDO) error {
51+
m.mu.RLock()
52+
defer m.mu.RUnlock()
4953
if m.insertFunc != nil {
5054
return m.insertFunc(tx, tccFenceDo)
5155
}
5256
return nil
5357
}
5458

5559
func (m *mockTCCFenceStore) QueryTCCFenceDO(tx *sql.Tx, xid string, branchId int64) (*model.TCCFenceDO, error) {
60+
m.mu.RLock()
61+
defer m.mu.RUnlock()
5662
if m.queryFunc != nil {
5763
return m.queryFunc(tx, xid, branchId)
5864
}
5965
return nil, nil
6066
}
6167

6268
func (m *mockTCCFenceStore) UpdateTCCFenceDO(tx *sql.Tx, xid string, branchId int64, oldStatus enum.FenceStatus, newStatus enum.FenceStatus) error {
69+
m.mu.RLock()
70+
defer m.mu.RUnlock()
6371
if m.updateFunc != nil {
6472
return m.updateFunc(tx, xid, branchId, oldStatus, newStatus)
6573
}
6674
return nil
6775
}
6876

6977
func (m *mockTCCFenceStore) DeleteTCCFenceDO(tx *sql.Tx, xid string, branchId int64) error {
78+
m.mu.RLock()
79+
defer m.mu.RUnlock()
7080
if m.deleteFunc != nil {
7181
return m.deleteFunc(tx, xid, branchId)
7282
}
7383
return nil
7484
}
7585

7686
func (m *mockTCCFenceStore) DeleteMultipleTCCFenceLogIdentity(tx *sql.Tx, identity []model.FenceLogIdentity) error {
87+
m.mu.RLock()
88+
defer m.mu.RUnlock()
7789
if m.deleteMultipleFunc != nil {
7890
return m.deleteMultipleFunc(tx, identity)
7991
}
8092
return nil
8193
}
8294

8395
func (m *mockTCCFenceStore) DeleteTCCFenceDOByMdfDate(tx *sql.Tx, datetime time.Time, limit int32) (int64, error) {
96+
m.mu.RLock()
97+
defer m.mu.RUnlock()
8498
if m.deleteTCCFenceDOByMdfDateFunc != nil {
8599
return m.deleteTCCFenceDOByMdfDateFunc(tx, datetime, limit)
86100
}
87101
return 0, nil
88102
}
89103

90104
func (m *mockTCCFenceStore) QueryTCCFenceLogIdentityByMdDate(tx *sql.Tx, datetime time.Time) ([]model.FenceLogIdentity, error) {
105+
m.mu.RLock()
106+
defer m.mu.RUnlock()
91107
if m.queryTCCFenceLogIdentityByMdDate != nil {
92108
return m.queryTCCFenceLogIdentityByMdDate(tx, datetime)
93109
}

0 commit comments

Comments
 (0)