good morning!!!!

Skip to content
Snippets Groups Projects
Unverified Commit eeecd692 authored by Jaynti Kanani's avatar Jaynti Kanani
Browse files

fix: fill ancient data using convenience method

parent 0c21e1c6
No related branches found
No related tags found
No related merge requests found
...@@ -1445,19 +1445,26 @@ func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types. ...@@ -1445,19 +1445,26 @@ func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types.
rawdb.WriteBlock(blockBatch, block) rawdb.WriteBlock(blockBatch, block)
rawdb.WriteReceipts(blockBatch, block.Hash(), block.NumberU64(), receipts) rawdb.WriteReceipts(blockBatch, block.Hash(), block.NumberU64(), receipts)
// storing bor block receipt // System call appends state-sync logs into state. So, `state.Logs()` contains
// all logs including system-call logs (state sync logs) while `logs` contains
// only logs generated by transactions (receipts).
//
// That means that state.Logs() can have more logs than receipt logs.
// In that case, we can safely assume that extra logs are from state sync logs.
//
// block logs = receipt logs + state sync logs = `state.Logs()`
blockLogs := state.Logs() blockLogs := state.Logs()
if len(blockLogs) > 0 { if len(blockLogs) > 0 {
sort.SliceStable(blockLogs, func(i, j int) bool { sort.SliceStable(blockLogs, func(i, j int) bool {
return blockLogs[i].Index < blockLogs[j].Index return blockLogs[i].Index < blockLogs[j].Index
}) })
}
if len(blockLogs) > len(logs) { if len(blockLogs) > len(logs) {
rawdb.WriteBorReceipt(blockBatch, block.Hash(), block.NumberU64(), &types.BorReceiptForStorage{ rawdb.WriteBorReceipt(blockBatch, block.Hash(), block.NumberU64(), &types.BorReceiptForStorage{
Logs: blockLogs[len(logs):], Logs: blockLogs[len(logs):], // get state-sync logs from `state.Logs()`
}) })
} }
}
rawdb.WritePreimages(blockBatch, state.Preimages()) rawdb.WritePreimages(blockBatch, state.Preimages())
if err := blockBatch.Write(); err != nil { if err := blockBatch.Write(); err != nil {
......
...@@ -115,6 +115,19 @@ func newFreezer(datadir string, namespace string) (*freezer, error) { ...@@ -115,6 +115,19 @@ func newFreezer(datadir string, namespace string) (*freezer, error) {
} }
freezer.tables[name] = table freezer.tables[name] = table
} }
// Adjust table length for bor-receipt freezer for already synced nodes.
//
// Since, table only supports sequential data, this will fill empty-data upto current
// synced block (till current total header number).
//
// This way they don't have to sync again from block 0 and still be compatible
// for block logs for future blocks. Note that already synced nodes
// won't have past block logs. Newly synced node will have all the data.
if err := freezer.tables[freezerBorReceiptTable].Fill(freezer.tables[freezerHeaderTable].items); err != nil {
return nil, err
}
if err := freezer.repair(); err != nil { if err := freezer.repair(); err != nil {
for _, table := range freezer.tables { for _, table := range freezer.tables {
table.Close() table.Close()
......
...@@ -648,3 +648,21 @@ func (t *freezerTable) printIndex() { ...@@ -648,3 +648,21 @@ func (t *freezerTable) printIndex() {
} }
fmt.Printf("|-----------------|\n") fmt.Printf("|-----------------|\n")
} }
//
// Bor related changes
//
// Fill adds empty data till given number (convenience method for backward compatibilty)
func (t *freezerTable) Fill(number uint64) error {
if t.items < number {
log.Info("Filling all data into freezer for backward compatablity", "name", t.name, "items", t.items, "number", number)
for t.items < number {
if err := t.Append(t.items, nil); err != nil {
log.Error("Failed to fill data into freezer", "name", t.name, "items", t.items, "number", number, "err", err)
return err
}
}
}
return nil
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment