Skip to content

Commit

Permalink
Merge branch 'MX-15953-cross-chain-header-storage-sync' into MX-15917…
Browse files Browse the repository at this point in the history
…-force-cross-chain-hdr-genesis-at-config-round

# Conflicts:
#	process/sync/storageBootstrap/shardStorageBootstrapper.go
  • Loading branch information
mariusmihaic committed Oct 25, 2024
2 parents e8d0707 + 89ce0ae commit 3ab6d45
Show file tree
Hide file tree
Showing 3 changed files with 167 additions and 40 deletions.
82 changes: 45 additions & 37 deletions process/sync/storageBootstrap/shardStorageBootstrapper.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package storageBootstrap

import (
"fmt"

"github.com/multiversx/mx-chain-core-go/core"
"github.com/multiversx/mx-chain-core-go/data"
"github.com/multiversx/mx-chain-core-go/data/block"
Expand Down Expand Up @@ -81,25 +83,23 @@ func (ssb *shardStorageBootstrapper) getHeaderWithNonce(nonce uint64, shardID ui

func (ssb *shardStorageBootstrapper) applyCrossNotarizedHeaders(crossNotarizedHeaders []bootstrapStorage.BootstrapHeaderInfo) error {
for _, crossNotarizedHeader := range crossNotarizedHeaders {
if crossNotarizedHeader.ShardId != core.MainChainShardId {
if crossNotarizedHeader.ShardId != core.MetachainShardId {
continue
}

log.Error("shardStorageBootstrapper.applyCrossNotarizedHeaders")

extendedHeader, err := process.GetExtendedShardHeaderFromStorage(crossNotarizedHeader.Hash, ssb.marshalizer, ssb.store)
metaBlock, err := process.GetMetaHeaderFromStorage(crossNotarizedHeader.Hash, ssb.marshalizer, ssb.store)
if err != nil {
return err
}

log.Error("added cross notarized header in block tracker",
"shard", core.MainChainShardId,
"round", extendedHeader.GetRound(),
"nonce", extendedHeader.GetNonce(),
log.Debug("added cross notarized header in block tracker",
"shard", core.MetachainShardId,
"round", metaBlock.GetRound(),
"nonce", metaBlock.GetNonce(),
"hash", crossNotarizedHeader.Hash)

ssb.blockTracker.AddCrossNotarizedHeader(core.MainChainShardId, extendedHeader, crossNotarizedHeader.Hash)
ssb.blockTracker.AddTrackedHeader(extendedHeader, crossNotarizedHeader.Hash)
ssb.blockTracker.AddCrossNotarizedHeader(core.MetachainShardId, metaBlock, crossNotarizedHeader.Hash)
ssb.blockTracker.AddTrackedHeader(metaBlock, crossNotarizedHeader.Hash)
}

return nil
Expand All @@ -116,8 +116,8 @@ func (ssb *shardStorageBootstrapper) cleanupNotarizedStorage(shardHeaderHash []b
}

for _, metaBlockHash := range shardHeader.GetMetaBlockHashes() {
var metaBlock *block.ShardHeaderExtended
metaBlock, err = process.GetExtendedShardHeaderFromStorage(metaBlockHash, ssb.marshalizer, ssb.store)
var metaBlock *block.MetaBlock
metaBlock, err = process.GetMetaHeaderFromStorage(metaBlockHash, ssb.marshalizer, ssb.store)
if err != nil {
log.Debug("meta block is not found in MetaBlockUnit storage",
"hash", metaBlockHash)
Expand All @@ -129,8 +129,8 @@ func (ssb *shardStorageBootstrapper) cleanupNotarizedStorage(shardHeaderHash []b
"nonce", metaBlock.GetNonce(),
"hash", metaBlockHash)

ssb.removeMetaFromMetaHeaderNonceToHashUnit(metaBlock, metaBlockHash)
ssb.removeMetaFromMetaBlockUnit(metaBlock, metaBlockHash)
ssb.removeHdrFromHeaderNonceToHashUnit(metaBlock, metaBlockHash, dataRetriever.MetaHdrNonceHashDataUnit)
ssb.removeBlockFromBlockUnit(metaBlock, metaBlockHash, dataRetriever.MetaBlockUnit)
}
}

Expand All @@ -139,7 +139,7 @@ func (ssb *shardStorageBootstrapper) cleanupNotarizedStorageForHigherNoncesIfExi
) {
var numConsecutiveNoncesNotFound int

lastCrossNotarizedNonce, err := getLastCrossNotarizedHeaderNonce(crossNotarizedHeaders)
lastCrossNotarizedNonce, err := getLastCrossNotarizedHeaderNonce(crossNotarizedHeaders, core.MetachainShardId)
if err != nil {
log.Warn("cleanupNotarizedStorageForHigherNoncesIfExist", "error", err.Error())
return
Expand All @@ -151,7 +151,7 @@ func (ssb *shardStorageBootstrapper) cleanupNotarizedStorageForHigherNoncesIfExi
for {
nonce++

metaBlock, metaBlockHash, err := process.GetExtendedHeaderFromStorageWithNonce(
metaBlock, metaBlockHash, err := process.GetMetaHeaderFromStorageWithNonce(
nonce,
ssb.store,
ssb.uint64Converter,
Expand Down Expand Up @@ -179,53 +179,61 @@ func (ssb *shardStorageBootstrapper) cleanupNotarizedStorageForHigherNoncesIfExi
"nonce", metaBlock.GetNonce(),
"hash", metaBlockHash)

ssb.removeMetaFromMetaHeaderNonceToHashUnit(metaBlock, metaBlockHash)
ssb.removeMetaFromMetaBlockUnit(metaBlock, metaBlockHash)
ssb.removeHdrFromHeaderNonceToHashUnit(metaBlock, metaBlockHash, dataRetriever.MetaHdrNonceHashDataUnit)
ssb.removeBlockFromBlockUnit(metaBlock, metaBlockHash, dataRetriever.MetaBlockUnit)
}
}

func (ssb *shardStorageBootstrapper) removeMetaFromMetaHeaderNonceToHashUnit(metaBlock *block.ShardHeaderExtended, metaBlockHash []byte) {
nonceToByteSlice := ssb.uint64Converter.ToByteSlice(metaBlock.GetNonce())
metaHdrNonceHashStorer, err := ssb.store.GetStorer(dataRetriever.ExtendedShardHeadersNonceHashDataUnit)
func (ssb *shardStorageBootstrapper) removeHdrFromHeaderNonceToHashUnit(
block data.HeaderHandler,
hash []byte,
unitType dataRetriever.UnitType,
) {
nonceToByteSlice := ssb.uint64Converter.ToByteSlice(block.GetNonce())
hdrNonceHashStorer, err := ssb.store.GetStorer(unitType)
if err != nil {
log.Debug("could not get storage unit",
"unit", dataRetriever.ExtendedShardHeadersNonceHashDataUnit,
"unit", unitType,
"error", err.Error())
return
}

err = metaHdrNonceHashStorer.Remove(nonceToByteSlice)
err = hdrNonceHashStorer.Remove(nonceToByteSlice)
if err != nil {
log.Debug("meta block was not removed from MetaHdrNonceHashDataUnit storage",
"shardId", metaBlock.GetShardID(),
"nonce", metaBlock.GetNonce(),
"hash", metaBlockHash,
log.Debug(fmt.Sprintf("block was not removed from %s storage", unitType.String()),
"shardId", block.GetShardID(),
"nonce", block.GetNonce(),
"hash", hash,
"error", err.Error())
}
}

func (ssb *shardStorageBootstrapper) removeMetaFromMetaBlockUnit(metaBlock *block.ShardHeaderExtended, metaBlockHash []byte) {
metaBlockStorer, err := ssb.store.GetStorer(dataRetriever.ExtendedShardHeadersUnit)
func (ssb *shardStorageBootstrapper) removeBlockFromBlockUnit(
block data.HeaderHandler,
hash []byte,
unitType dataRetriever.UnitType,
) {
blockStorer, err := ssb.store.GetStorer(unitType)
if err != nil {
log.Debug("could not get storage unit",
"unit", dataRetriever.ExtendedShardHeadersUnit,
"unit", unitType,
"error", err.Error())
return
}

err = metaBlockStorer.Remove(metaBlockHash)
err = blockStorer.Remove(hash)
if err != nil {
log.Debug("meta block was not removed from MetaBlockUnit storage",
"shardId", metaBlock.GetShardID(),
"nonce", metaBlock.GetNonce(),
"hash", metaBlockHash,
log.Debug(fmt.Sprintf("block was not removed from %s storage", unitType.String()),
"shardId", block.GetShardID(),
"nonce", block.GetNonce(),
"hash", hash,
"error", err.Error())
}
}

func getLastCrossNotarizedHeaderNonce(crossNotarizedHeaders []bootstrapStorage.BootstrapHeaderInfo) (uint64, error) {
func getLastCrossNotarizedHeaderNonce(crossNotarizedHeaders []bootstrapStorage.BootstrapHeaderInfo, shardID uint32) (uint64, error) {
for _, crossNotarizedHeader := range crossNotarizedHeaders {
if crossNotarizedHeader.ShardId != core.MainChainShardId {
if crossNotarizedHeader.ShardId != shardID {
continue
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,12 +244,12 @@ func TestShardStorageBootstrapper_GetCrossNotarizedHeaderNonceShouldWork(t *test
crossNotarizedHeaders := make([]bootstrapStorage.BootstrapHeaderInfo, 0)

crossNotarizedHeaders = append(crossNotarizedHeaders, bootstrapStorage.BootstrapHeaderInfo{ShardId: 0, Nonce: 1})
nonce, err := getLastCrossNotarizedHeaderNonce(crossNotarizedHeaders)
nonce, err := getLastCrossNotarizedHeaderNonce(crossNotarizedHeaders, core.MetachainShardId)
assert.Equal(t, sync.ErrHeaderNotFound, err)
assert.Equal(t, uint64(0), nonce)

crossNotarizedHeaders = append(crossNotarizedHeaders, bootstrapStorage.BootstrapHeaderInfo{ShardId: core.MetachainShardId, Nonce: 2})
nonce, err = getLastCrossNotarizedHeaderNonce(crossNotarizedHeaders)
nonce, err = getLastCrossNotarizedHeaderNonce(crossNotarizedHeaders, core.MetachainShardId)
assert.Nil(t, err)
assert.Equal(t, uint64(2), nonce)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
package storageBootstrap

import "github.com/multiversx/mx-chain-go/process"
import (
"github.com/multiversx/mx-chain-core-go/core"
"github.com/multiversx/mx-chain-core-go/data"
"github.com/multiversx/mx-chain-core-go/data/block"
"github.com/multiversx/mx-chain-go/dataRetriever"
"github.com/multiversx/mx-chain-go/process"
"github.com/multiversx/mx-chain-go/process/block/bootstrapStorage"
)

type sovereignChainShardStorageBootstrapper struct {
*shardStorageBootstrapper
Expand All @@ -19,5 +26,117 @@ func NewSovereignChainShardStorageBootstrapper(shardStorageBootstrapper *shardSt
scssb.getScheduledRootHashMethod = scssb.sovereignChainGetScheduledRootHash
scssb.setScheduledInfoMethod = scssb.sovereignChainSetScheduledInfo

scssb.bootstrapper = scssb
return scssb, nil
}

func (ssb *sovereignChainShardStorageBootstrapper) applyCrossNotarizedHeaders(crossNotarizedHeaders []bootstrapStorage.BootstrapHeaderInfo) error {
for _, crossNotarizedHeader := range crossNotarizedHeaders {
if crossNotarizedHeader.ShardId != core.MainChainShardId {
continue
}

extendedHeader, err := process.GetExtendedShardHeaderFromStorage(crossNotarizedHeader.Hash, ssb.marshalizer, ssb.store)
if err != nil {
return err
}

log.Debug("added cross notarized header in block tracker",
"shard", core.MainChainShardId,
"round", extendedHeader.GetRound(),
"nonce", extendedHeader.GetNonce(),
"hash", crossNotarizedHeader.Hash)

ssb.blockTracker.AddCrossNotarizedHeader(core.MainChainShardId, extendedHeader, crossNotarizedHeader.Hash)
ssb.blockTracker.AddTrackedHeader(extendedHeader, crossNotarizedHeader.Hash)
}

return nil
}

func (ssb *sovereignChainShardStorageBootstrapper) cleanupNotarizedStorage(shardHeaderHash []byte) {
log.Debug("sovereign cleanup notarized storage")

shardHeader, err := process.GetShardHeaderFromStorage(shardHeaderHash, ssb.marshalizer, ssb.store)
if err != nil {
log.Debug("shard header is not found in BlockHeaderUnit storage",
"hash", shardHeaderHash)
return
}

sovereignHeader, castOk := shardHeader.(data.SovereignChainHeaderHandler)
if !castOk {
log.Warn("sovereignChainShardStorageBootstrapper.cleanupNotarizedStorage",
"error", process.ErrWrongTypeAssertion,
"expected shard header of type", "SovereignChainHeaderHandler",
)
}

for _, extendedHeaderHash := range sovereignHeader.GetExtendedShardHeaderHashes() {
var extendedHeader *block.ShardHeaderExtended
extendedHeader, err = process.GetExtendedShardHeaderFromStorage(extendedHeaderHash, ssb.marshalizer, ssb.store)
if err != nil {
log.Debug("extended block is not found in ExtendedShardHeadersUnit storage",
"hash", extendedHeaderHash)
continue
}

log.Debug("removing extended header from storage",
"shardId", extendedHeader.GetShardID(),
"nonce", extendedHeader.GetNonce(),
"hash", extendedHeaderHash)

ssb.removeHdrFromHeaderNonceToHashUnit(extendedHeader, extendedHeaderHash, dataRetriever.ExtendedShardHeadersNonceHashDataUnit)
ssb.removeBlockFromBlockUnit(extendedHeader, extendedHeaderHash, dataRetriever.ExtendedShardHeadersUnit)
}
}

func (ssb *sovereignChainShardStorageBootstrapper) cleanupNotarizedStorageForHigherNoncesIfExist(
crossNotarizedHeaders []bootstrapStorage.BootstrapHeaderInfo,
) {
var numConsecutiveNoncesNotFound int

lastCrossNotarizedNonce, err := getLastCrossNotarizedHeaderNonce(crossNotarizedHeaders, core.MainChainShardId)
if err != nil {
log.Warn("cleanupNotarizedStorageForHigherNoncesIfExist", "error", err.Error())
return
}

log.Debug("cleanup notarized storage has been started", "from nonce", lastCrossNotarizedNonce+1)
nonce := lastCrossNotarizedNonce

for {
nonce++

extendedBlock, extendedBlockHash, err := process.GetExtendedHeaderFromStorageWithNonce(
nonce,
ssb.store,
ssb.uint64Converter,
ssb.marshalizer,
)
if err != nil {
log.Debug("extended block is not found in ExtendedShardHeadersNonceHashDataUnit storage",
"nonce", nonce, "error", err.Error())

numConsecutiveNoncesNotFound++
if numConsecutiveNoncesNotFound > maxNumOfConsecutiveNoncesNotFoundAccepted {
log.Debug("cleanup notarized storage has been finished",
"from nonce", lastCrossNotarizedNonce+1,
"to nonce", nonce)
break
}

continue
}

numConsecutiveNoncesNotFound = 0

log.Debug("removing extended block from storage",
"shardId", extendedBlock.GetShardID(),
"nonce", extendedBlock.GetNonce(),
"hash", extendedBlockHash)

ssb.removeHdrFromHeaderNonceToHashUnit(extendedBlock, extendedBlockHash, dataRetriever.ExtendedShardHeadersNonceHashDataUnit)
ssb.removeBlockFromBlockUnit(extendedBlock, extendedBlockHash, dataRetriever.ExtendedShardHeadersUnit)
}
}

0 comments on commit 3ab6d45

Please sign in to comment.