From b04292c97ad618fe58f833b934e994106010e261 Mon Sep 17 00:00:00 2001 From: Ori Newman Date: Mon, 22 Nov 2021 09:56:30 +0200 Subject: [PATCH] Don't server parallel PruningPointAndItsAnticoneRequests --- ...pruning_point_and_its_anticone_requests.go | 84 +++++++++++-------- 1 file changed, 51 insertions(+), 33 deletions(-) diff --git a/app/protocol/flows/blockrelay/handle_pruning_point_and_its_anticone_requests.go b/app/protocol/flows/blockrelay/handle_pruning_point_and_its_anticone_requests.go index 168d0b34b..db07653e2 100644 --- a/app/protocol/flows/blockrelay/handle_pruning_point_and_its_anticone_requests.go +++ b/app/protocol/flows/blockrelay/handle_pruning_point_and_its_anticone_requests.go @@ -3,9 +3,12 @@ package blockrelay import ( "github.com/kaspanet/kaspad/app/appmessage" peerpkg "github.com/kaspanet/kaspad/app/protocol/peer" + "github.com/kaspanet/kaspad/app/protocol/protocolerrors" "github.com/kaspanet/kaspad/domain" "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router" + "runtime" + "sync/atomic" ) // PruningPointAndItsAnticoneRequestsContext is the interface for the context needed for the HandlePruningPointAndItsAnticoneRequests flow. @@ -13,52 +16,65 @@ type PruningPointAndItsAnticoneRequestsContext interface { Domain() domain.Domain } +var isBusy uint32 + // HandlePruningPointAndItsAnticoneRequests listens to appmessage.MsgRequestPruningPointAndItsAnticone messages and sends // the pruning point and its anticone to the requesting peer. func HandlePruningPointAndItsAnticoneRequests(context PruningPointAndItsAnticoneRequestsContext, incomingRoute *router.Route, outgoingRoute *router.Route, peer *peerpkg.Peer) error { for { - _, err := incomingRoute.Dequeue() - if err != nil { - return err - } - - log.Debugf("Got request for pruning point and its anticone from %s", peer) - - pruningPointHeaders, err := context.Domain().Consensus().PruningPointHeaders() - if err != nil { - return err - } - - msgPruningPointHeaders := make([]*appmessage.MsgBlockHeader, len(pruningPointHeaders)) - for i, header := range pruningPointHeaders { - msgPruningPointHeaders[i] = appmessage.DomainBlockHeaderToBlockHeader(header) - } - - err = outgoingRoute.Enqueue(appmessage.NewMsgPruningPoints(msgPruningPointHeaders)) - if err != nil { - return err - } - - pointAndItsAnticone, err := context.Domain().Consensus().PruningPointAndItsAnticone() - if err != nil { - return err - } - - for _, blockHash := range pointAndItsAnticone { - err := sendBlockWithTrustedData(context, outgoingRoute, blockHash) + err := func() error { + _, err := incomingRoute.Dequeue() if err != nil { return err } - } - err = outgoingRoute.Enqueue(appmessage.NewMsgDoneBlocksWithTrustedData()) + if !atomic.CompareAndSwapUint32(&isBusy, 0, 1) { + return protocolerrors.Errorf(false, "node is busy with other pruning point anticone requests") + } + defer atomic.StoreUint32(&isBusy, 0) + + log.Debugf("Got request for pruning point and its anticone from %s", peer) + + pruningPointHeaders, err := context.Domain().Consensus().PruningPointHeaders() + if err != nil { + return err + } + + msgPruningPointHeaders := make([]*appmessage.MsgBlockHeader, len(pruningPointHeaders)) + for i, header := range pruningPointHeaders { + msgPruningPointHeaders[i] = appmessage.DomainBlockHeaderToBlockHeader(header) + } + + err = outgoingRoute.Enqueue(appmessage.NewMsgPruningPoints(msgPruningPointHeaders)) + if err != nil { + return err + } + + pointAndItsAnticone, err := context.Domain().Consensus().PruningPointAndItsAnticone() + if err != nil { + return err + } + + for _, blockHash := range pointAndItsAnticone { + err := sendBlockWithTrustedData(context, outgoingRoute, blockHash) + if err != nil { + return err + } + } + + err = outgoingRoute.Enqueue(appmessage.NewMsgDoneBlocksWithTrustedData()) + if err != nil { + return err + } + + log.Debugf("Sent pruning point and its anticone to %s", peer) + return nil + }() if err != nil { return err } - - log.Debugf("Sent pruning point and its anticone to %s", peer) } } @@ -73,5 +89,7 @@ func sendBlockWithTrustedData(context PruningPointAndItsAnticoneRequestsContext, return err } + runtime.GC() + return nil }