@@ -320,14 +320,15 @@ func (pool *BlockPool) AddBlock(peerID types.NodeID, block *types.Block, extComm
320
320
return fmt .Errorf ("peer sent us a block we didn't expect (peer: %s, current height: %d, block height: %d)" , peerID , pool .height , block .Height )
321
321
}
322
322
323
- if requester .setBlock (block , extCommit , peerID ) {
323
+ setBlockResult := requester .setBlock (block , extCommit , peerID )
324
+ if setBlockResult == 0 {
324
325
atomic .AddInt32 (& pool .numPending , - 1 )
325
326
peer := pool .peers [peerID ]
326
327
if peer != nil {
327
328
peer .decrPending (blockSize )
328
329
}
329
- } else {
330
- err := errors .New ("requester is different or block already exists " )
330
+ } else if setBlockResult < 0 {
331
+ err := errors .New ("bpr requester peer is different from original peer " )
331
332
pool .sendError (err , peerID )
332
333
return fmt .Errorf ("%w (peer: %s, requester: %s, block height: %d)" , err , peerID , requester .getPeerID (), block .Height )
333
334
}
@@ -671,24 +672,26 @@ func (bpr *bpRequester) OnStart(ctx context.Context) error {
671
672
672
673
func (* bpRequester ) OnStop () {}
673
674
674
- // Returns true if the peer matches and block doesn't already exist.
675
- func (bpr * bpRequester ) setBlock (block * types.Block , extCommit * types.ExtendedCommit , peerID types.NodeID ) bool {
675
+ // Returns 0 if block doesn't already exist.
676
+ // Returns -1 if block exist but peers doesn't match.
677
+ // Return 1 if block exist and peer matches.
678
+ func (bpr * bpRequester ) setBlock (block * types.Block , extCommit * types.ExtendedCommit , peerID types.NodeID ) int {
676
679
bpr .mtx .Lock ()
677
- if bpr .block != nil || bpr . peerID != peerID {
678
- bpr .mtx . Unlock ()
679
- return false
680
- }
681
- bpr .block = block
682
- if extCommit != nil {
683
- bpr . extCommit = extCommit
684
- }
685
- bpr . mtx . Unlock ()
686
-
687
- select {
688
- case bpr .gotBlockCh <- struct {}{}:
689
- default :
680
+ defer bpr .mtx . Unlock ()
681
+ if bpr .block == nil {
682
+ bpr . block = block
683
+ if extCommit != nil {
684
+ bpr .extCommit = extCommit
685
+ }
686
+ select {
687
+ case bpr . gotBlockCh <- struct {}{}:
688
+ default :
689
+ }
690
+ return 0
691
+ } else if bpr .peerID == peerID {
692
+ return 1
690
693
}
691
- return true
694
+ return - 1
692
695
}
693
696
694
697
func (bpr * bpRequester ) getBlock () * types.Block {
0 commit comments