Skip to content

Commit b440181

Browse files
committed
[cache] BlockAccessor with caching separate from StateAccessor
1 parent 660891f commit b440181

File tree

13 files changed

+375
-70
lines changed

13 files changed

+375
-70
lines changed

nil/internal/collate/block_listener.go

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,22 @@ func unmarshalBlock(pbBlock *pb.RawFullBlock) (*types.BlockWithExtractedData, er
175175
return raw.DecodeBytes()
176176
}
177177

178+
type blockByNumberCache struct {
179+
blockByHash *execution.BlockByHashAccessor
180+
blockHashByNumber *execution.BlockHashByNumberAccessor
181+
}
182+
183+
func (b blockByNumberCache) Get(
184+
tx db.RoTx, shardId types.ShardId, num types.BlockNumber,
185+
) (*types.RawBlockWithExtractedData, error) {
186+
hash, err := b.blockHashByNumber.Get(tx, shardId, num)
187+
if err != nil {
188+
return nil, err
189+
}
190+
191+
return b.blockByHash.Get(tx, shardId, hash)
192+
}
193+
178194
func SetBlockRequestHandler(
179195
ctx context.Context, networkManager network.Manager, shardId types.ShardId, database db.DB, logger logging.Logger,
180196
) {
@@ -183,8 +199,10 @@ func SetBlockRequestHandler(
183199
return
184200
}
185201

186-
// Sharing accessor between all handlers enables caching.
187-
accessor := execution.NewStateAccessor(128, 0)
202+
accessor := &blockByNumberCache{
203+
blockByHash: execution.NewBlockByHashAccessor(128),
204+
blockHashByNumber: execution.NewBlockHashByNumberAccessor(128),
205+
}
188206
handler := func(s network.Stream) {
189207
if err := s.SetDeadline(time.Now().Add(requestTimeout)); err != nil {
190208
return
@@ -212,15 +230,8 @@ func SetBlockRequestHandler(
212230
}
213231
defer tx.Rollback()
214232

215-
acc := accessor.RawAccess(tx, shardId).
216-
GetBlock().
217-
WithOutTransactions().
218-
WithInTransactions().
219-
WithChildBlocks().
220-
WithConfig()
221-
222233
for id := blockReq.GetId(); ; id++ {
223-
resp, err := acc.ByNumber(types.BlockNumber(id))
234+
resp, err := accessor.Get(tx, shardId, types.BlockNumber(id))
224235
if err != nil {
225236
if !errors.Is(err, db.ErrKeyNotFound) {
226237
logError(logger, err, "DB error")
@@ -229,11 +240,11 @@ func SetBlockRequestHandler(
229240
}
230241

231242
b := &pb.RawFullBlock{
232-
BlockBytes: resp.Block(),
233-
OutTransactionsBytes: resp.OutTransactions(),
234-
InTransactionsBytes: resp.InTransactions(),
235-
ChildBlocks: pb.PackHashes(resp.ChildBlocks()),
236-
Config: resp.Config(),
243+
BlockBytes: resp.Block,
244+
OutTransactionsBytes: resp.OutTransactions,
245+
InTransactionsBytes: resp.InTransactions,
246+
ChildBlocks: pb.PackHashes(resp.ChildBlocks),
247+
Config: resp.Config,
237248
}
238249

239250
if err := writeBlockToStream(s, b); err != nil {

nil/internal/collate/proposer.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,10 @@ func (p *proposer) GenerateProposal(ctx context.Context, txFabric db.DB) (*execu
7373
if err != nil {
7474
return nil, fmt.Errorf("failed to fetch previous block: %w", err)
7575
}
76-
data, err := p.params.StateAccessor.Access(tx, p.params.ShardId).GetBlock().ByHash(prevBlockHash)
76+
prevBlock, err := p.params.BlockAccessor.GetByHash(tx, p.params.ShardId, prevBlockHash)
7777
if err != nil {
7878
return nil, err
7979
}
80-
prevBlock := data.Block()
8180

8281
if prevBlock.PatchLevel > validatorPatchLevel {
8382
return nil, fmt.Errorf(
@@ -94,7 +93,7 @@ func (p *proposer) GenerateProposal(ctx context.Context, txFabric db.DB) (*execu
9493
p.executionState, err = execution.NewExecutionState(tx, p.params.ShardId, execution.StateParams{
9594
Block: prevBlock,
9695
ConfigAccessor: configAccessor,
97-
StateAccessor: p.params.StateAccessor,
96+
BlockAccessor: p.params.BlockAccessor,
9897
FeeCalculator: p.params.FeeCalculator,
9998
Mode: execution.ModeProposal,
10099
})
@@ -381,17 +380,14 @@ func (p *proposer) handleTransactionsFromNeighbors(tx db.RoTx) error {
381380
neighbor := &state.Neighbors[position]
382381
nextTx := p.executionState.InTxCounts[neighborId]
383382

384-
shardAccessor := p.params.StateAccessor.Access(tx, neighborId)
385-
386383
for checkLimits() {
387-
data, err := shardAccessor.GetBlock().ByNumber(neighbor.BlockNumber)
384+
block, err := p.params.BlockAccessor.GetByNumber(tx, neighborId, neighbor.BlockNumber)
388385
if errors.Is(err, db.ErrKeyNotFound) {
389386
break
390387
}
391388
if err != nil {
392389
return err
393390
}
394-
block := data.Block()
395391

396392
outTxnTrie := execution.NewDbTransactionTrieReader(tx, neighborId)
397393
if err := outTxnTrie.SetRootHash(block.OutTransactionsRoot); err != nil {

nil/internal/collate/validator.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,11 @@ func (s *Validator) getLastBlockUnlocked(ctx context.Context) (*types.Block, com
112112
return nil, common.EmptyHash, err
113113
}
114114

115-
block, err := s.params.StateAccessor.Access(tx, s.params.ShardId).GetBlock().ByHash(hash)
115+
block, err := s.params.BlockAccessor.GetByHash(tx, s.params.ShardId, hash)
116116
if err != nil {
117117
return nil, common.EmptyHash, err
118118
}
119-
return block.Block(), hash, nil
119+
return block, hash, nil
120120
}
121121

122122
func (s *Validator) GetLastBlock(ctx context.Context) (*types.Block, common.Hash, error) {
@@ -140,11 +140,11 @@ func (s *Validator) getBlock(ctx context.Context, hash common.Hash) (*types.Bloc
140140
}
141141
defer tx.Rollback()
142142

143-
block, err := s.params.StateAccessor.Access(tx, s.params.ShardId).GetBlock().ByHash(hash)
143+
block, err := s.params.BlockAccessor.GetByHash(tx, s.params.ShardId, hash)
144144
if err != nil {
145145
return nil, err
146146
}
147-
return block.Block(), nil
147+
return block, nil
148148
}
149149

150150
func (s *Validator) TxPool() TxnPool {

0 commit comments

Comments
 (0)