From 635b793e142f0a3dcac45f91ff5731653409a29c Mon Sep 17 00:00:00 2001 From: Kaspa Profiler <> Date: Tue, 13 Apr 2021 12:46:50 +0300 Subject: [PATCH] Add --delay to kaspad --- .../flows/blockrelay/handle_relay_invs.go | 5 ++++ infrastructure/config/config.go | 5 ++++ .../network/netadapter/netadapter.go | 25 +++++++++++-------- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/app/protocol/flows/blockrelay/handle_relay_invs.go b/app/protocol/flows/blockrelay/handle_relay_invs.go index 09264ca22..703fd5f3d 100644 --- a/app/protocol/flows/blockrelay/handle_relay_invs.go +++ b/app/protocol/flows/blockrelay/handle_relay_invs.go @@ -1,6 +1,8 @@ package blockrelay import ( + "time" + "github.com/kaspanet/kaspad/app/appmessage" "github.com/kaspanet/kaspad/app/protocol/common" peerpkg "github.com/kaspanet/kaspad/app/protocol/peer" @@ -11,6 +13,7 @@ import ( "github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing" "github.com/kaspanet/kaspad/infrastructure/config" "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router" + "github.com/kaspanet/kaspad/util/mstime" "github.com/pkg/errors" ) @@ -109,6 +112,8 @@ func (flow *handleRelayInvsFlow) start() error { if err != nil { return err } + msTime := mstime.UnixMilliseconds(block.Header.TimeInMilliseconds()) + time.Sleep(time.Until(msTime.ToNativeTime().Add(config.DelayDuration))) log.Debugf("Processing block %s", inv.Hash) missingParents, blockInsertionResult, err := flow.processBlock(block) diff --git a/infrastructure/config/config.go b/infrastructure/config/config.go index 268d0937b..1cd5a1c76 100644 --- a/infrastructure/config/config.go +++ b/infrastructure/config/config.go @@ -25,6 +25,9 @@ import ( "github.com/pkg/errors" ) +// DelayDuration a duration for the delay, global for testing +var DelayDuration time.Duration + const ( defaultConfigFilename = "kaspad.conf" defaultDataDirname = "data" @@ -117,6 +120,7 @@ type Flags struct { MaxUTXOCacheSize uint64 `long:"maxutxocachesize" description:"Max size of loaded UTXO into ram from the disk in bytes"` UTXOIndex bool `long:"utxoindex" description:"Enable the UTXO index"` IsArchivalNode bool `long:"archival" description:"Run as an archival node: don't delete old block data when moving the pruning point (Warning: heavy disk usage)'"` + Delay float32 `long:"delay" description:"Provide a delay in seconds as a floating point"` NetworkFlags ServiceOptions *ServiceOptions } @@ -574,6 +578,7 @@ func LoadConfig() (*Config, error) { log.Warnf("%s", configFileError) } + DelayDuration = time.Duration(cfg.Delay * float32(time.Second)) return cfg, nil } diff --git a/infrastructure/network/netadapter/netadapter.go b/infrastructure/network/netadapter/netadapter.go index a2111e52a..784f8b57b 100644 --- a/infrastructure/network/netadapter/netadapter.go +++ b/infrastructure/network/netadapter/netadapter.go @@ -3,6 +3,7 @@ package netadapter import ( "sync" "sync/atomic" + "time" "github.com/kaspanet/kaspad/app/appmessage" "github.com/kaspanet/kaspad/infrastructure/config" @@ -175,18 +176,20 @@ func (na *NetAdapter) ID() *id.ID { // P2PBroadcast sends the given `message` to every peer corresponding // to each NetConnection in the given netConnections func (na *NetAdapter) P2PBroadcast(netConnections []*NetConnection, message appmessage.Message) error { - na.p2pConnectionsLock.RLock() - defer na.p2pConnectionsLock.RUnlock() - - for _, netConnection := range netConnections { - err := netConnection.router.OutgoingRoute().Enqueue(message) - if err != nil { - if errors.Is(err, routerpkg.ErrRouteClosed) { - log.Debugf("Cannot enqueue message to %s: router is closed", netConnection) - continue + go func() { + time.Sleep(config.DelayDuration) + na.p2pConnectionsLock.RLock() + defer na.p2pConnectionsLock.RUnlock() + for _, netConnection := range netConnections { + err := netConnection.router.OutgoingRoute().Enqueue(message) + if err != nil { + if errors.Is(err, routerpkg.ErrRouteClosed) { + log.Debugf("Cannot enqueue message to %s: router is closed", netConnection) + continue + } + log.Error(err) } - return err } - } + }() return nil }