mirror of
https://github.com/lightninglabs/loop
synced 2024-11-08 01:10:29 +00:00
c34d04e2f7
The race was detected in CI and locally when running with -race. It happened between the following calls: WARNING: DATA RACE Write at 0x00c0003e6638 by goroutine 1374: runtime.racewrite() <autogenerated>:1 +0x1e github.com/lightninglabs/loop/sweepbatcher.(*batch).Wait() sweepbatcher/sweep_batch.go:463 +0x6e github.com/lightninglabs/loop/sweepbatcher.(*Batcher).Run.func1() sweepbatcher/sweep_batcher.go:272 +0x10e Previous read at 0x00c0003e6638 by goroutine 1388: runtime.raceread() <autogenerated>:1 +0x1e github.com/lightninglabs/loop/sweepbatcher.(*batch).monitorConfirmations() sweepbatcher/sweep_batch.go:1144 +0x285 github.com/lightninglabs/loop/sweepbatcher.(*batch).handleSpend() sweepbatcher/sweep_batch.go:1309 +0x10e4 github.com/lightninglabs/loop/sweepbatcher.(*batch).Run() sweepbatcher/sweep_batch.go:526 +0xb04 github.com/lightninglabs/loop/sweepbatcher.(*Batcher).spinUpBatch.func1() sweepbatcher/sweep_batcher.go:455 +0xbd The race was caused because wg.Add(1) and wg.Wait() were running from different goroutines (one goroutine was running batch.Run() and another - batcher.Run()). To avoid this scenario, wg.Wait() call was moved into batch.Run() call, so it waits itself for its children goroutines, after which the channel b.finished is closed, and it serves a signal for external waiters (the batcher, calling batch.Wait()). Also the channel batch.stopped was renamed to batch.stopping to better reflect its nature. Added TestSweepBatcherCloseDuringAdding to make sure adding a sweep during shutting down does not cause a crash. The test did not catch the original race condition. |
||
---|---|---|
.. | ||
log.go | ||
store_mock.go | ||
store.go | ||
sweep_batch.go | ||
sweep_batcher_test.go | ||
sweep_batcher.go |