Skip to content

Commit

Permalink
Feat/en 2595 bootstrap from a given round (#226)
Browse files Browse the repository at this point in the history
* Changed parameters in config.toml
* Added tests and TODO
* Fixed one bug and changed some print info
* Changed getHeaderWithNonce to getHeaderFromPoolWithNonce in metablock and shardblock sync
* Refactored after review
* Changed some prints info
* Reorder new methods
* Fixed tests
  • Loading branch information
SebastianMarian committed Jun 27, 2019
1 parent d07c1c2 commit 929ff5a
Show file tree
Hide file tree
Showing 14 changed files with 999 additions and 164 deletions.
10 changes: 10 additions & 0 deletions cmd/node/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,12 @@ VERSION:
Usage: "The file containing the secret keys which ...",
Value: "./config/initialNodesSk.pem",
}
// boostrapRoundIndex defines a flag that specifies the round index from which node should bootstrap from storage
boostrapRoundIndex = cli.UintFlag{
Name: "boostrap-round-index",
Usage: "Boostrap round index specifies the round index from which node should bootstrap from storage",
Value: math.MaxUint32,
}

//TODO remove uniqueID
uniqueID = ""
Expand Down Expand Up @@ -216,6 +222,7 @@ func main() {
gopsEn,
serversConfigurationFile,
restApiPort,
boostrapRoundIndex,
}
app.Authors = []cli.Author{
{
Expand Down Expand Up @@ -440,6 +447,7 @@ func startNode(ctx *cli.Context, log *logger.Logger) error {
cryptoComponents,
processComponents,
networkComponents,
uint32(ctx.GlobalUint(boostrapRoundIndex.Name)),
)
if err != nil {
return err
Expand Down Expand Up @@ -618,6 +626,7 @@ func createNode(
crypto *factory.Crypto,
process *factory.Process,
network *factory.Network,
boostrapRoundIndex uint32,
) (*node.Node, error) {
nd, err := node.NewNode(
node.WithMessenger(network.NetMessenger),
Expand Down Expand Up @@ -650,6 +659,7 @@ func createNode(
node.WithConsensusType(config.Consensus.Type),
node.WithTxSingleSigner(crypto.TxSingleSigner),
node.WithTxStorageSize(config.TxStorage.Cache.Size),
node.WithBoostrapRoundIndex(boostrapRoundIndex),
)
if err != nil {
return nil, errors.New("error creating node: " + err.Error())
Expand Down
12 changes: 11 additions & 1 deletion dataRetriever/requestHandlers/requestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/ElrondNetwork/elrond-go/core/logger"
"github.com/ElrondNetwork/elrond-go/core/partitioning"
"github.com/ElrondNetwork/elrond-go/dataRetriever"
"github.com/ElrondNetwork/elrond-go/sharding"
)

type ResolverRequestHandler struct {
Expand Down Expand Up @@ -136,7 +137,16 @@ func (rrh *ResolverRequestHandler) RequestHeader(shardId uint32, hash []byte) {

func (rrh *ResolverRequestHandler) requestByHash(destShardID uint32, hash []byte, baseTopic string) {
log.Debug(fmt.Sprintf("Requesting %s from shard %d with hash %s from network\n", baseTopic, destShardID, core.ToB64(hash)))
resolver, err := rrh.resolversFinder.CrossShardResolver(baseTopic, destShardID)

var resolver dataRetriever.Resolver
var err error

if destShardID == sharding.MetachainShardId {
resolver, err = rrh.resolversFinder.MetaChainResolver(baseTopic)
} else {
resolver, err = rrh.resolversFinder.CrossShardResolver(baseTopic, destShardID)
}

if err != nil {
log.Error(fmt.Sprintf("missing resolver to %s topic to shard %d", baseTopic, destShardID))
return
Expand Down
8 changes: 8 additions & 0 deletions node/defineOptions.go
Original file line number Diff line number Diff line change
Expand Up @@ -377,3 +377,11 @@ func WithTxStorageSize(txStorageSize uint32) Option {
return nil
}
}

// WithBoostrapRoundIndex sets up a boostrapRoundIndex option for the Node
func WithBoostrapRoundIndex(boostrapRoundIndex uint32) Option {
return func(n *Node) error {
n.boostrapRoundIndex = boostrapRoundIndex
return nil
}
}
3 changes: 3 additions & 0 deletions node/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ type Node struct {
isMetachainActive bool
txStorageSize uint32
currentSendingGoRoutines int32
boostrapRoundIndex uint32
}

// ApplyOptions can set up different configurable options of a Node instance
Expand Down Expand Up @@ -425,6 +426,7 @@ func (n *Node) createShardBootstrapper(rounder consensus.Rounder) (process.Boots
n.resolversFinder,
n.shardCoordinator,
n.accounts,
n.boostrapRoundIndex,
)
if err != nil {
return nil, err
Expand All @@ -447,6 +449,7 @@ func (n *Node) createMetaChainBootstrapper(rounder consensus.Rounder) (process.B
n.resolversFinder,
n.shardCoordinator,
n.accounts,
n.boostrapRoundIndex,
)

if err != nil {
Expand Down
9 changes: 5 additions & 4 deletions process/block/metablock.go
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,7 @@ func (mp *metaProcessor) CommitBlock(
return err
}

//TODO: Should be analyzed if put in pool is really necessary or not (right now there is no action of removing them)
_ = headerNoncePool.Put(headerHandler.GetNonce(), headerHash)

for i := 0; i < len(header.ShardInfo); i++ {
Expand Down Expand Up @@ -813,14 +814,14 @@ func (mp *metaProcessor) computeMissingHeaders(metaBlock *block.MetaBlock) map[u

for i := 0; i < len(metaBlock.ShardInfo); i++ {
shardData := metaBlock.ShardInfo[i]
header, _ := process.GetShardHeaderFromPool(shardData.HeaderHash, mp.dataPool.ShardHeaders())
if header == nil {
hdr, err := process.GetShardHeaderFromPool(shardData.HeaderHash, mp.dataPool.ShardHeaders())
if err != nil {
missingHeaders[shardData.ShardId] = append(missingHeaders[shardData.ShardId], shardData.HeaderHash)
continue
}

if header.Nonce > mp.currHighestShardHdrsNonces[shardData.ShardId] {
mp.currHighestShardHdrsNonces[shardData.ShardId] = header.Nonce
if hdr.Nonce > mp.currHighestShardHdrsNonces[shardData.ShardId] {
mp.currHighestShardHdrsNonces[shardData.ShardId] = hdr.Nonce
}
}

Expand Down
21 changes: 6 additions & 15 deletions process/block/shardblock.go
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,7 @@ func (sp *shardProcessor) CommitBlock(
return err
}

//TODO: Should be analyzed if put in pool is really necessary or not (right now there is no action of removing them)
_ = headerNoncePool.Put(headerHandler.GetNonce(), headerHash)

err = sp.txPreProcess.SaveTxBlockToStorage(body)
Expand Down Expand Up @@ -821,25 +822,15 @@ func (sp *shardProcessor) computeMissingHeaders(header *block.Header) [][]byte {
missingHeaders := make([][]byte, 0)
sp.currHighestMetaHdrNonce = uint64(0)

metaBlockCache := sp.dataPool.MetaBlocks()
if metaBlockCache == nil {
return missingHeaders
}

for i := 0; i < len(header.MetaBlockHashes); i++ {
obj, ok := metaBlockCache.Peek(header.MetaBlockHashes[i])
if !ok {
hdr, err := process.GetMetaHeaderFromPool(header.MetaBlockHashes[i], sp.dataPool.MetaBlocks())
if err != nil {
missingHeaders = append(missingHeaders, header.MetaBlockHashes[i])
continue
}

metaBlock, ok := obj.(data.HeaderHandler)
if !ok {
continue
}

if metaBlock.GetNonce() > sp.currHighestMetaHdrNonce {
sp.currHighestMetaHdrNonce = metaBlock.GetNonce()
if hdr.Nonce > sp.currHighestMetaHdrNonce {
sp.currHighestMetaHdrNonce = hdr.Nonce
}
}

Expand Down Expand Up @@ -1244,7 +1235,7 @@ func (sp *shardProcessor) createMiniBlocks(
return miniBlocks, nil
}

addedTxs := 0
addedTxs := int(txs)
for i := 0; i < int(noShards); i++ {
miniBlock, err := sp.txPreProcess.CreateAndProcessMiniBlock(sp.shardCoordinator.SelfId(), uint32(i), maxTxInBlock-addedTxs, haveTime, round)
if err != nil {
Expand Down
7 changes: 2 additions & 5 deletions process/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,9 +214,6 @@ var ErrNilHeadersNonceHashStorage = errors.New("nil headers nonce hash storage")
// ErrNilMetachainHeadersStorage signals that a nil metachain header storage has been provided
var ErrNilMetachainHeadersStorage = errors.New("nil metachain headers storage")

// ErrNilResolverSender signals that a nil resolver sender object has been provided
var ErrNilResolverSender = errors.New("nil resolver sender")

// ErrNilBlockBodyStorage signals that a nil block body storage has been provided
var ErrNilBlockBodyStorage = errors.New("nil block body storage")

Expand Down Expand Up @@ -358,8 +355,8 @@ var ErrNilBalanceFromSC = errors.New("output balance from VM is nil")
// ErrNilTemporaryAccountsHandler signals that temporary accounts handler is nil
var ErrNilTemporaryAccountsHandler = errors.New("temporary accounts handler is nil")

// ErrBoostrapFromStorage signals that boostrap from storage has been failed
var ErrBoostrapFromStorage = errors.New("boostrap from storage has been failed")
// ErrNotEnoughValidBlocksInStorage signals that boostrap from storage failed due to not enough valid blocks stored
var ErrNotEnoughValidBlocksInStorage = errors.New("not enough valid blocks in storage")

// ErrNilSmartContractResult signals that the smart contract result is nil
var ErrNilSmartContractResult = errors.New("smart contract result is nil")
Expand Down

0 comments on commit 929ff5a

Please sign in to comment.