mirror of https://github.com/usememos/memos.git
Fix all data races detected by -race flag in parallel store tests. Problems fixed: 1. TestMain not propagating exit code - Was: m.Run(); return - Now: os.Exit(m.Run()) 2. Data races on global DSN variables - mysqlBaseDSN and postgresBaseDSN written in sync.Once - Read outside Once without synchronization - Race detector: write/read without happens-before relationship 3. Data races on container pointers - mysqlContainer, postgresContainer, testDockerNetwork - Same pattern: write in Once, read in cleanup Solution: Use atomic operations - atomic.Value for DSN strings (Store/Load) - atomic.Pointer for container pointers (Store/Load) - Provides proper memory synchronization - Race-free reads and writes Why sync.Once alone wasn't enough: - sync.Once guarantees function runs once - Does NOT provide memory barrier for variables written inside - Reads outside Once have no synchronization with writes - Race detector correctly flags this as violation Technical details: - atomic.Value.Store() provides release semantics - atomic.Value.Load() provides acquire semantics - Guarantees happens-before relationship per Go memory model - All 159 parallel tests can safely access globals Impact: - Tests now pass with -race flag - No performance degradation (atomic ops are fast) - Maintains parallel execution benefits (8-10x speedup) - Proper Go memory model compliance Related: Issues #2, #3 from race analysis |
||
|---|---|---|
| .. | ||
| Dockerfile | ||
| README.md | ||
| activity_test.go | ||
| attachment_filter_test.go | ||
| attachment_test.go | ||
| containers.go | ||
| filter_helpers_test.go | ||
| idp_test.go | ||
| inbox_test.go | ||
| instance_setting_test.go | ||
| main_test.go | ||
| memo_filter_test.go | ||
| memo_relation_test.go | ||
| memo_test.go | ||
| migrator_test.go | ||
| reaction_test.go | ||
| store.go | ||
| user_setting_test.go | ||
| user_test.go | ||
README.md
Store tests
How to test store with MySQL?
- Create a database in your MySQL server.
- Run the following command with two environment variables set:
DRIVER=mysql DSN=root@/memos_test go test -v ./test/store/...
DRIVERshould be set tomysql.DSNshould be set to the DSN of your MySQL server.