From bd97075e073ea10bc3d22f710a0ccdaaff2080a8 Mon Sep 17 00:00:00 2001 From: stasatdaglabs <39559713+stasatdaglabs@users.noreply.github.com> Date: Thu, 24 Dec 2020 16:53:26 +0200 Subject: [PATCH] Remove the limit to the returned headers from buildMsgBlockHeaders (#1281) * Remove the limit to the returned header hashes from buildMsgBlockHeaders. * Build msgBlockHeaders in batches rather than all at once. --- .../blockrelay/handle_request_headers.go | 48 +++++++------------ .../blockrelay/handle_request_headers_test.go | 15 ------ 2 files changed, 16 insertions(+), 47 deletions(-) delete mode 100644 app/protocol/flows/blockrelay/handle_request_headers_test.go diff --git a/app/protocol/flows/blockrelay/handle_request_headers.go b/app/protocol/flows/blockrelay/handle_request_headers.go index 6600461d8..a512369b3 100644 --- a/app/protocol/flows/blockrelay/handle_request_headers.go +++ b/app/protocol/flows/blockrelay/handle_request_headers.go @@ -10,7 +10,6 @@ import ( ) const ibdBatchSize = router.DefaultMaxMessages -const maxHeaders = appmessage.MaxInvPerMsg // RequestIBDBlocksContext is the interface for the context needed for the HandleRequestHeaders flow. type RequestIBDBlocksContext interface { @@ -39,26 +38,35 @@ func (flow *handleRequestBlocksFlow) start() error { return err } - msgHeaders, err := flow.buildMsgBlockHeaders(lowHash, highHash) + blockHashes, err := flow.Domain().Consensus().GetHashesBetween(lowHash, highHash) if err != nil { return err } - for offset := 0; offset < len(msgHeaders); offset += ibdBatchSize { + for offset := 0; offset < len(blockHashes); offset += ibdBatchSize { end := offset + ibdBatchSize - if end > len(msgHeaders) { - end = len(msgHeaders) + if end > len(blockHashes) { + end = len(blockHashes) } - blocksToSend := msgHeaders[offset:end] - err = flow.sendHeaders(blocksToSend) + blocksHashesToSend := blockHashes[offset:end] + + msgBlockHeadersToSend := make([]*appmessage.MsgBlockHeader, len(blocksHashesToSend)) + for i, blockHash := range blocksHashesToSend { + header, err := flow.Domain().Consensus().GetBlockHeader(blockHash) + if err != nil { + return err + } + msgBlockHeadersToSend[i] = appmessage.DomainBlockHeaderToBlockHeader(header) + } + err = flow.sendHeaders(msgBlockHeadersToSend) if err != nil { return nil } // Exit the loop and don't wait for the GetNextIBDBlocks message if the last batch was // less than ibdBatchSize. - if len(blocksToSend) < ibdBatchSize { + if len(blocksHashesToSend) < ibdBatchSize { break } @@ -91,30 +99,6 @@ func receiveRequestHeaders(incomingRoute *router.Route) (lowHash *externalapi.Do return msgRequestIBDBlocks.LowHash, msgRequestIBDBlocks.HighHash, nil } -func (flow *handleRequestBlocksFlow) buildMsgBlockHeaders(lowHash *externalapi.DomainHash, - highHash *externalapi.DomainHash) ([]*appmessage.MsgBlockHeader, error) { - - blockHashes, err := flow.Domain().Consensus().GetHashesBetween(lowHash, highHash) - if err != nil { - return nil, err - } - - if len(blockHashes) > maxHeaders { - blockHashes = blockHashes[:maxHeaders] - } - - msgBlockHeaders := make([]*appmessage.MsgBlockHeader, len(blockHashes)) - for i, blockHash := range blockHashes { - header, err := flow.Domain().Consensus().GetBlockHeader(blockHash) - if err != nil { - return nil, err - } - msgBlockHeaders[i] = appmessage.DomainBlockHeaderToBlockHeader(header) - } - - return msgBlockHeaders, nil -} - func (flow *handleRequestBlocksFlow) sendHeaders(headers []*appmessage.MsgBlockHeader) error { for _, msgBlockHeader := range headers { err := flow.outgoingRoute.Enqueue(msgBlockHeader) diff --git a/app/protocol/flows/blockrelay/handle_request_headers_test.go b/app/protocol/flows/blockrelay/handle_request_headers_test.go deleted file mode 100644 index 704cad76b..000000000 --- a/app/protocol/flows/blockrelay/handle_request_headers_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package blockrelay - -import ( - "github.com/kaspanet/kaspad/domain/consensus/utils/testutils" - "github.com/kaspanet/kaspad/domain/dagconfig" - "testing" -) - -func TestMaxHeaders(t *testing.T) { - testutils.ForAllNets(t, false, func(t *testing.T, params *dagconfig.Params) { - if params.FinalityDepth() > maxHeaders { - t.Errorf("FinalityDepth() in %s should be lower or equal to appmessage.MaxInvPerMsg", params.Name) - } - }) -}