Merge pull request #481 from nspcc-dev/core-fix-init-corner-cases

Fix init corner cases
This commit is contained in:
Vsevolod 2019-11-06 18:36:40 +03:00 committed by GitHub
commit f686069f37
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -101,6 +101,10 @@ func (bc *Blockchain) init() error {
return err return err
} }
bc.headerList = NewHeaderHashList(genesisBlock.Hash()) bc.headerList = NewHeaderHashList(genesisBlock.Hash())
err = bc.store.Put(storage.SYSCurrentHeader.Bytes(), hashAndIndexToBytes(genesisBlock.Hash(), genesisBlock.Index))
if err != nil {
return err
}
return bc.storeBlock(genesisBlock) return bc.storeBlock(genesisBlock)
} }
if ver != version { if ver != version {
@ -131,6 +135,9 @@ func (bc *Blockchain) init() error {
if err != nil { if err != nil {
return err return err
} }
if bc.storedHeaderCount == 0 && currHeaderHeight == 0 {
bc.headerList.Add(currHeaderHash)
}
// There is a high chance that the Node is stopped before the next // There is a high chance that the Node is stopped before the next
// batch of 2000 headers was stored. Via the currentHeaders stored we can sync // batch of 2000 headers was stored. Via the currentHeaders stored we can sync
@ -146,6 +153,7 @@ func (bc *Blockchain) init() error {
return err return err
} }
targetHash = genesisBlock.Hash() targetHash = genesisBlock.Hash()
bc.headerList.Add(targetHash)
} }
headers := make([]*Header, 0) headers := make([]*Header, 0)
@ -157,7 +165,6 @@ func (bc *Blockchain) init() error {
headers = append(headers, header) headers = append(headers, header)
hash = header.PrevHash hash = header.PrevHash
} }
headerSliceReverse(headers) headerSliceReverse(headers)
for _, h := range headers { for _, h := range headers {
if !h.Verify() { if !h.Verify() {
@ -266,7 +273,7 @@ func (bc *Blockchain) AddHeaders(headers ...*Header) (err error) {
} }
if oldlen != headerList.Len() { if oldlen != headerList.Len() {
updateHeaderHeightMetric(headerList.Len()-1) updateHeaderHeightMetric(headerList.Len() - 1)
if err = bc.store.PutBatch(batch); err != nil { if err = bc.store.PutBatch(batch); err != nil {
return return
} }
@ -492,18 +499,18 @@ func (bc *Blockchain) persist() error {
if err != nil { if err != nil {
return err return err
} }
bHeight, err := storage.CurrentBlockHeight(bc.store)
if err != nil {
return err
}
oldHeight := atomic.SwapUint32(&bc.persistedHeight, bHeight)
diff := bHeight - oldHeight
storedHeaderHeight, _, err := storage.CurrentHeaderHeight(bc.store)
if err != nil {
return err
}
if persisted > 0 { if persisted > 0 {
bHeight, err := storage.CurrentBlockHeight(bc.store)
if err != nil {
return err
}
oldHeight := atomic.SwapUint32(&bc.persistedHeight, bHeight)
diff := bHeight - oldHeight
storedHeaderHeight, _, err := storage.CurrentHeaderHeight(bc.store)
if err != nil {
return err
}
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"persistedBlocks": diff, "persistedBlocks": diff,
"persistedKeys": persisted, "persistedKeys": persisted,