Remove some redundant fetches from DB for the beacon state (#1257)

This commit is contained in:
Preston Van Loon 2019-01-06 00:05:16 -05:00 committed by Nishant Das
parent 141a8dba87
commit f47f123aab
2 changed files with 10 additions and 25 deletions

View File

@ -246,7 +246,7 @@ func (c *ChainService) blockProcessing(processedBlock chan<- *pb.BeaconBlock) {
} }
if currentSlot+1 == block.Slot { if currentSlot+1 == block.Slot {
if err := c.receiveBlock(block); err != nil { if err := c.receiveBlock(block, beaconState); err != nil {
log.Error(err) log.Error(err)
processedBlock <- nil processedBlock <- nil
continue continue
@ -257,7 +257,7 @@ func (c *ChainService) blockProcessing(processedBlock chan<- *pb.BeaconBlock) {
log.Debugf( log.Debugf(
"Block slot number is lower than the current slot in the beacon state %d", "Block slot number is lower than the current slot in the beacon state %d",
block.Slot) block.Slot)
c.sendAndDeleteCachedBlocks(currentSlot) c.sendAndDeleteCachedBlocks(currentSlot, beaconState)
} }
} }
} }
@ -286,24 +286,19 @@ func (c *ChainService) blockProcessing(processedBlock chan<- *pb.BeaconBlock) {
// else: // else:
// return False # or throw or whatever // return False # or throw or whatever
// //
func (c *ChainService) receiveBlock(block *pb.BeaconBlock) error { func (c *ChainService) receiveBlock(block *pb.BeaconBlock, beaconState *pb.BeaconState) error {
blockhash, err := b.Hash(block) blockhash, err := b.Hash(block)
if err != nil { if err != nil {
return fmt.Errorf("could not hash incoming block: %v", err) return fmt.Errorf("could not hash incoming block: %v", err)
} }
beaconState, err := c.beaconDB.GetState()
if err != nil {
return fmt.Errorf("failed to get beacon state: %v", err)
}
if block.Slot == 0 { if block.Slot == 0 {
return errors.New("cannot process a genesis block: received block with slot 0") return errors.New("cannot process a genesis block: received block with slot 0")
} }
// Save blocks with higher slot numbers in cache. // Save blocks with higher slot numbers in cache.
if err := c.isBlockReadyForProcessing(block); err != nil { if err := c.isBlockReadyForProcessing(block, beaconState); err != nil {
log.Debugf("block with hash %#x is not ready for processing: %v", blockhash, err) log.Debugf("block with hash %#x is not ready for processing: %v", blockhash, err)
return nil return nil
} }
@ -354,11 +349,7 @@ func (c *ChainService) receiveBlock(block *pb.BeaconBlock) error {
return nil return nil
} }
func (c *ChainService) isBlockReadyForProcessing(block *pb.BeaconBlock) error { func (c *ChainService) isBlockReadyForProcessing(block *pb.BeaconBlock, beaconState *pb.BeaconState) error {
beaconState, err := c.beaconDB.GetState()
if err != nil {
return fmt.Errorf("failed to get beacon state: %v", err)
}
var powBlockFetcher func(ctx context.Context, hash common.Hash) (*gethTypes.Block, error) var powBlockFetcher func(ctx context.Context, hash common.Hash) (*gethTypes.Block, error)
if c.enablePOWChain { if c.enablePOWChain {
@ -374,9 +365,9 @@ func (c *ChainService) isBlockReadyForProcessing(block *pb.BeaconBlock) error {
// sendAndDeleteCachedBlocks checks if there is any block saved in the cache with a // sendAndDeleteCachedBlocks checks if there is any block saved in the cache with a
// slot number equivalent to the current slot. If there is then the block is // slot number equivalent to the current slot. If there is then the block is
// sent to the incoming block channel and deleted from the cache. // sent to the incoming block channel and deleted from the cache.
func (c *ChainService) sendAndDeleteCachedBlocks(currentSlot uint64) { func (c *ChainService) sendAndDeleteCachedBlocks(currentSlot uint64, beaconState *pb.BeaconState) {
if block, ok := c.unProcessedBlocks[currentSlot+1]; ok { if block, ok := c.unProcessedBlocks[currentSlot+1]; ok {
if err := c.isBlockReadyForProcessing(block); err == nil { if err := c.isBlockReadyForProcessing(block, beaconState); err == nil {
c.incomingBlockChan <- block c.incomingBlockChan <- block
delete(c.unProcessedBlocks, currentSlot) delete(c.unProcessedBlocks, currentSlot)
} }

View File

@ -428,14 +428,11 @@ func TestIsBlockReadyForProcessing(t *testing.T) {
ParentRootHash32: []byte{'a'}, ParentRootHash32: []byte{'a'},
} }
if err := chainService.isBlockReadyForProcessing(block); err == nil { if err := chainService.isBlockReadyForProcessing(block, beaconState); err == nil {
t.Fatal("block processing succeeded despite block having no parent saved") t.Fatal("block processing succeeded despite block having no parent saved")
} }
beaconState.Slot = 10 beaconState.Slot = 10
if err := chainService.beaconDB.SaveState(beaconState); err != nil {
t.Fatalf("cannot save state: %v", err)
}
enc, _ := proto.Marshal(beaconState) enc, _ := proto.Marshal(beaconState)
stateRoot := hashutil.Hash(enc) stateRoot := hashutil.Hash(enc)
@ -453,7 +450,7 @@ func TestIsBlockReadyForProcessing(t *testing.T) {
Slot: 10, Slot: 10,
} }
if err := chainService.isBlockReadyForProcessing(block2); err == nil { if err := chainService.isBlockReadyForProcessing(block2, beaconState); err == nil {
t.Fatal("block processing succeeded despite block slot being invalid") t.Fatal("block processing succeeded despite block slot being invalid")
} }
@ -461,9 +458,6 @@ func TestIsBlockReadyForProcessing(t *testing.T) {
copy(h[:], []byte("a")) copy(h[:], []byte("a"))
beaconState.ProcessedPowReceiptRootHash32 = h[:] beaconState.ProcessedPowReceiptRootHash32 = h[:]
beaconState.Slot = 0 beaconState.Slot = 0
if err := chainService.beaconDB.SaveState(beaconState); err != nil {
t.Fatalf("cannot save state: %v", err)
}
currentSlot := uint64(1) currentSlot := uint64(1)
attestationSlot := uint64(0) attestationSlot := uint64(0)
@ -489,7 +483,7 @@ func TestIsBlockReadyForProcessing(t *testing.T) {
chainService.enablePOWChain = true chainService.enablePOWChain = true
if err := chainService.isBlockReadyForProcessing(block3); err != nil { if err := chainService.isBlockReadyForProcessing(block3, beaconState); err != nil {
t.Fatalf("block processing failed despite being a valid block: %v", err) t.Fatalf("block processing failed despite being a valid block: %v", err)
} }
} }