[lbry] blockchain: clear statusValid upon statusValidateFailed is set

The status management of index does need some refactoring.
For now, we just manually clear the statusValid in every occurance
of statusValidateFailed being set.

Co-authored-by: Roy Lee <roylee17@gmail.com>
This commit is contained in:
Brannon King 2021-12-29 21:30:44 -08:00 committed by Roy Lee
parent 405897fa38
commit 6784830246

View file

@ -1004,6 +1004,7 @@ func (b *BlockChain) reorganizeChain(detachNodes, attachNodes *list.List) error
err = b.checkConnectBlock(n, block, view, nil) err = b.checkConnectBlock(n, block, view, nil)
if err != nil { if err != nil {
if _, ok := err.(RuleError); ok { if _, ok := err.(RuleError); ok {
b.index.UnsetStatusFlags(n, statusValid)
b.index.SetStatusFlags(n, statusValidateFailed) b.index.SetStatusFlags(n, statusValidateFailed)
for de := e.Next(); de != nil; de = de.Next() { for de := e.Next(); de != nil; de = de.Next() {
dn := de.Value.(*blockNode) dn := de.Value.(*blockNode)
@ -1141,6 +1142,7 @@ func (b *BlockChain) connectBestChain(node *blockNode, block *btcutil.Block, fla
if err == nil { if err == nil {
b.index.SetStatusFlags(node, statusValid) b.index.SetStatusFlags(node, statusValid)
} else if _, ok := err.(RuleError); ok { } else if _, ok := err.(RuleError); ok {
b.index.UnsetStatusFlags(node, statusValid)
b.index.SetStatusFlags(node, statusValidateFailed) b.index.SetStatusFlags(node, statusValidateFailed)
} else { } else {
return false, err return false, err
@ -1175,6 +1177,7 @@ func (b *BlockChain) connectBestChain(node *blockNode, block *btcutil.Block, fla
// that status of the block as invalid and flush the // that status of the block as invalid and flush the
// index state to disk before returning with the error. // index state to disk before returning with the error.
if _, ok := err.(RuleError); ok { if _, ok := err.(RuleError); ok {
b.index.UnsetStatusFlags(node, statusValid)
b.index.SetStatusFlags( b.index.SetStatusFlags(
node, statusValidateFailed, node, statusValidateFailed,
) )
@ -1720,7 +1723,7 @@ func (b *BlockChain) reconsiderBlock(hash *chainhash.Hash) error {
} }
// No need to reconsider, it is already valid. // No need to reconsider, it is already valid.
if node.status.KnownValid() { if node.status.KnownValid() && !node.status.KnownInvalid() { // second clause works around old bug
err := fmt.Errorf("block %s is already valid", hash) err := fmt.Errorf("block %s is already valid", hash)
return err return err
} }