throttling

package
v1.5.3-rc.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 5, 2021 License: BSD-3-Clause Imports: 14 Imported by: 21

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type DialThrottler

type DialThrottler interface {
	// Block until the event associated with this Acquire can happen.
	// If [ctx] is canceled, gives up and returns an error.
	Acquire(ctx context.Context) error
}

func NewDialThrottler

func NewDialThrottler(throttleLimit int) DialThrottler

func NewNoDialThrottler

func NewNoDialThrottler() DialThrottler

type InboundConnThrottler added in v1.4.11

type InboundConnThrottler interface {
	// Dispatch starts this InboundConnThrottler.
	// Must be called before [Allow].
	// Blocks until [Stop] is called (i.e. should be called in a goroutine.)
	Dispatch()
	// Stop this InboundConnThrottler and causes [Dispatch] to return.
	// Should be called when we're done with this InboundConnThrottler.
	// This InboundConnThrottler must not be used after [Stop] is called.
	Stop()
	// Returns whether we should allow an inbound connection from [ipStr].
	// Must only be called after [Dispatch] has been called.
	// Must not be called after [Stop] has been called.
	Allow(ipStr string) bool
}

InboundConnThrottler decides whether to allow an inbound connection from IP [ipStr]. If Allow(ipStr) returns false, the connection to that IP should be closed.

func NewInboundConnThrottler added in v1.4.11

func NewInboundConnThrottler(log logging.Logger, config InboundConnThrottlerConfig) InboundConnThrottler

Returns an InboundConnThrottler that allows an inbound connection from a given IP every [AllowCooldown].

type InboundConnThrottlerConfig added in v1.4.11

type InboundConnThrottlerConfig struct {
	// Allow(ipStr) returns true if it has been at least [AllowCooldown]
	// since the last time Allow(ipStr) returned true or if
	// Allow(ipStr) has never been called.
	// If <= 0, inbound connections not rate-limited.
	AllowCooldown time.Duration `json:"allowCooldown"`
	// Maximum number of inbound connections allowed within [AllowCooldown].
	// (As implemented in inboundConnThrottler, may actually allow
	// [MaxRecentConns+1] due to a race condition but that's fine.)
	// If <= 0, inbound connections not rate-limited.
	MaxRecentConns int `json:"maxRecentConns"`
}

type InboundMsgThrottler

type InboundMsgThrottler interface {
	// Blocks until node [nodeID] can put a message of
	// size [msgSize] onto the incoming message buffer.
	Acquire(msgSize uint64, nodeID ids.ShortID)

	// Mark that a message from [nodeID] of size [msgSize]
	// has been removed from the incoming message buffer.
	Release(msgSize uint64, nodeID ids.ShortID)
}

InboundMsgThrottler rate-limits incoming messages from the network.

func NewNoInboundThrottler

func NewNoInboundThrottler() InboundMsgThrottler

func NewSybilInboundMsgThrottler

func NewSybilInboundMsgThrottler(
	log logging.Logger,
	namespace string,
	registerer prometheus.Registerer,
	vdrs validators.Set,
	config MsgThrottlerConfig,
) (InboundMsgThrottler, error)

Returns a new MsgThrottler. If this function returns an error, the returned MsgThrottler may still be used. However, some of its metrics may not be registered.

type MsgThrottlerConfig

type MsgThrottlerConfig struct {
	VdrAllocSize        uint64 `json:"vdrAllocSize"`
	AtLargeAllocSize    uint64 `json:"atLargeAllocSize"`
	NodeMaxAtLargeBytes uint64 `json:"nodeMaxAtLargeBytes"`
}

Used by the sybil-safe inbound and outbound message throttlers

type OutboundMsgThrottler

type OutboundMsgThrottler interface {
	// Returns true if we can queue a message of size [msgSize] to be sent to node [nodeID].
	// Returns false if the message should be dropped (not sent to [nodeID]).
	// If this method returns true, Release([msgSize], [nodeID]) must be called (!) when
	// the message is sent (or when we give up trying to send the message, if applicable.)
	// If this method returns false, do not make a corresponding call to Release.
	Acquire(msgSize uint64, nodeID ids.ShortID) bool

	// Mark that a message of size [msgSize] has been sent to [nodeID] or we have
	// given up sending the message. Must correspond to a previous call to
	// Acquire([msgSize], [nodeID]) that returned true.
	Release(msgSize uint64, nodeID ids.ShortID)
}

Rate-limits outgoing messages

func NewNoOutboundThrottler

func NewNoOutboundThrottler() OutboundMsgThrottler

func NewSybilOutboundMsgThrottler

func NewSybilOutboundMsgThrottler(
	log logging.Logger,
	namespace string,
	registerer prometheus.Registerer,
	vdrs validators.Set,
	config MsgThrottlerConfig,
) (OutboundMsgThrottler, error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL