contractcourt: fix concurrent access to resolved
This commit makes `resolved` an atomic bool to avoid data race. This field is now defined in `contractResolverKit` to avoid code duplication.
This commit is contained in:
11 files changed
+111
-129
No files matched your search
@@ -12,9 +12,6 @@ import (
|
||||
// future, this will likely take over the duties the current BreachArbitrator
|
||||
// has.
|
||||
type breachResolver struct {
|
||||
// resolved reflects if the contract has been fully resolved or not.
|
||||
resolved bool
|
||||
|
||||
// subscribed denotes whether or not the breach resolver has subscribed
|
||||
// to the BreachArbitrator for breach resolution.
|
||||
subscribed bool
|
||||
@@ -62,7 +59,7 @@ func (b *breachResolver) Resolve() (ContractResolver, error) {
|
||||
// If the breach resolution process is already complete, then
|
||||
// we can cleanup and checkpoint the resolved state.
|
||||
if complete {
|
||||
b.resolved = true
|
||||
b.markResolved()
|
||||
return nil, b.Checkpoint(b)
|
||||
}
|
||||
|
||||
@@ -75,8 +72,9 @@ func (b *breachResolver) Resolve() (ContractResolver, error) {
|
||||
// The replyChan has been closed, signalling that the breach
|
||||
// has been fully resolved. Checkpoint the resolved state and
|
||||
// exit.
|
||||
b.resolved = true
|
||||
b.markResolved()
|
||||
return nil, b.Checkpoint(b)
|
||||
|
||||
case <-b.quit:
|
||||
}
|
||||
|
||||
@@ -89,19 +87,13 @@ func (b *breachResolver) Stop() {
|
||||
close(b.quit)
|
||||
}
|
||||
|
||||
// IsResolved returns true if the breachResolver is fully resolved and cleanup
|
||||
// can occur.
|
||||
func (b *breachResolver) IsResolved() bool {
|
||||
return b.resolved
|
||||
}
|
||||
|
||||
// SupplementState adds additional state to the breachResolver.
|
||||
func (b *breachResolver) SupplementState(_ *channeldb.OpenChannel) {
|
||||
}
|
||||
|
||||
// Encode encodes the breachResolver to the passed writer.
|
||||
func (b *breachResolver) Encode(w io.Writer) error {
|
||||
return binary.Write(w, endian, b.resolved)
|
||||
return binary.Write(w, endian, b.IsResolved())
|
||||
}
|
||||
|
||||
// newBreachResolverFromReader attempts to decode an encoded breachResolver
|
||||
@@ -114,9 +106,13 @@ func newBreachResolverFromReader(r io.Reader, resCfg ResolverConfig) (
|
||||
replyChan: make(chan struct{}),
|
||||
}
|
||||
|
||||
if err := binary.Read(r, endian, &b.resolved); err != nil {
|
||||
var resolved bool
|
||||
if err := binary.Read(r, endian, &resolved); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if resolved {
|
||||
b.markResolved()
|
||||
}
|
||||
|
||||
b.initLogger(fmt.Sprintf("%T(%v)", b, b.ChanPoint))
|
||||
|
||||
|
||||
Reference in new issue
Block a user