engine: graph: Use an atomic bool instead of a mutex
The isStateOK variable can be accessed concurrently as these are supposed to be "benign" races. As such, they need to be labelled as such so that we don't hit some undefined compiler behaviour. Here are five good references relating to "benign" data races in golang. 1) https://web.archive.org/web/20181022150257/https://software.intel.com/en-us/blogs/2013/01/06/benign-data-races-what-could-possibly-go-wrong 2) https://go.dev/ref/mem - "Informal Overview" section. 3) https://docs.oracle.com/cd/E19205-01/820-0619/gecqt/index.html 4) https://www.usenix.org/legacy/event/hotpar11/tech/final_files/Boehm.pdf 5) https://go.dev/doc/articles/race_detector TL;DR: wrap your benign races with sync/atomic or eliminate them.
This commit is contained in:
@@ -246,7 +246,7 @@ func (obj *State) ReversalCleanup() error {
|
||||
return nil // nothing to erase, we're not a reversal resource
|
||||
}
|
||||
|
||||
if !obj.isStateOK { // did we successfully reverse?
|
||||
if !obj.isStateOK.Load() { // did we successfully reverse? (mutex RLock/RUnlock)
|
||||
obj.Logf("did not complete reversal") // warn
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user