Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions snow/consensus/snowman/poll/set.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package poll

import (
"errors"
"fmt"
"strings"
"time"
Expand All @@ -19,6 +20,11 @@ import (
"github.com/ava-labs/avalanchego/utils/metric"
)

var (
errFailedPollsMetric = errors.New("failed to register polls metric")
errFailedPollDurationMetrics = errors.New("failed to register poll_duration metrics")
)

type pollHolder interface {
GetPoll() Poll
StartTime() time.Time
Expand Down Expand Up @@ -52,16 +58,14 @@ func NewSet(
log logging.Logger,
namespace string,
reg prometheus.Registerer,
) Set {
) (Set, error) {
numPolls := prometheus.NewGauge(prometheus.GaugeOpts{
Namespace: namespace,
Name: "polls",
Help: "Number of pending network polls",
})
if err := reg.Register(numPolls); err != nil {
log.Error("failed to register polls statistics",
zap.Error(err),
)
return nil, fmt.Errorf("%w: %w", errFailedPollsMetric, err)
}

durPolls, err := metric.NewAverager(
Expand All @@ -71,9 +75,7 @@ func NewSet(
reg,
)
if err != nil {
log.Error("failed to register poll_duration statistics",
zap.Error(err),
)
return nil, fmt.Errorf("%w: %w", errFailedPollDurationMetrics, err)
}

return &set{
Expand All @@ -82,7 +84,7 @@ func NewSet(
durPolls: durPolls,
factory: factory,
polls: linkedhashmap.New[uint32, pollHolder](),
}
}, nil
}

// Add to the current set of polls
Expand Down
42 changes: 32 additions & 10 deletions snow/consensus/snowman/poll/set_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ var (
vdr5 = ids.NodeID{5}
)

func TestNewSetErrorOnMetrics(t *testing.T) {
func TestNewSetErrorOnPollsMetrics(t *testing.T) {
require := require.New(t)

factory := NewEarlyTermNoTraversalFactory(1, 1)
Expand All @@ -37,13 +37,29 @@ func TestNewSetErrorOnMetrics(t *testing.T) {
registerer := prometheus.NewRegistry()

require.NoError(registerer.Register(prometheus.NewCounter(prometheus.CounterOpts{
Name: "polls",
Namespace: namespace,
Name: "polls",
})))

_, err := NewSet(factory, log, namespace, registerer)
require.ErrorIs(err, errFailedPollsMetric)
}

func TestNewSetErrorOnPollDurationMetrics(t *testing.T) {
require := require.New(t)

factory := NewEarlyTermNoTraversalFactory(1, 1)
log := logging.NoLog{}
namespace := ""
registerer := prometheus.NewRegistry()

require.NoError(registerer.Register(prometheus.NewCounter(prometheus.CounterOpts{
Name: "poll_duration",
Namespace: namespace,
Name: "poll_duration_count",
})))

require.NotNil(NewSet(factory, log, namespace, registerer))
_, err := NewSet(factory, log, namespace, registerer)
require.ErrorIs(err, errFailedPollDurationMetrics)
}

func TestCreateAndFinishPollOutOfOrder_NewerFinishesFirst(t *testing.T) {
Expand All @@ -56,7 +72,8 @@ func TestCreateAndFinishPollOutOfOrder_NewerFinishesFirst(t *testing.T) {
log := logging.NoLog{}
namespace := ""
registerer := prometheus.NewRegistry()
s := NewSet(factory, log, namespace, registerer)
s, err := NewSet(factory, log, namespace, registerer)
require.NoError(err)

// create two polls for the two blocks
vdrBag := bag.Of(vdrs...)
Expand Down Expand Up @@ -92,7 +109,8 @@ func TestCreateAndFinishPollOutOfOrder_OlderFinishesFirst(t *testing.T) {
log := logging.NoLog{}
namespace := ""
registerer := prometheus.NewRegistry()
s := NewSet(factory, log, namespace, registerer)
s, err := NewSet(factory, log, namespace, registerer)
require.NoError(err)

// create two polls for the two blocks
vdrBag := bag.Of(vdrs...)
Expand Down Expand Up @@ -128,7 +146,8 @@ func TestCreateAndFinishPollOutOfOrder_UnfinishedPollsGaps(t *testing.T) {
log := logging.NoLog{}
namespace := ""
registerer := prometheus.NewRegistry()
s := NewSet(factory, log, namespace, registerer)
s, err := NewSet(factory, log, namespace, registerer)
require.NoError(err)

// create three polls for the two blocks
vdrBag := bag.Of(vdrs...)
Expand Down Expand Up @@ -172,7 +191,8 @@ func TestCreateAndFinishSuccessfulPoll(t *testing.T) {
log := logging.NoLog{}
namespace := ""
registerer := prometheus.NewRegistry()
s := NewSet(factory, log, namespace, registerer)
s, err := NewSet(factory, log, namespace, registerer)
require.NoError(err)

require.Zero(s.Len())

Expand Down Expand Up @@ -204,7 +224,8 @@ func TestCreateAndFinishFailedPoll(t *testing.T) {
log := logging.NoLog{}
namespace := ""
registerer := prometheus.NewRegistry()
s := NewSet(factory, log, namespace, registerer)
s, err := NewSet(factory, log, namespace, registerer)
require.NoError(err)

require.Zero(s.Len())

Expand Down Expand Up @@ -233,7 +254,8 @@ func TestSetString(t *testing.T) {
log := logging.NoLog{}
namespace := ""
registerer := prometheus.NewRegistry()
s := NewSet(factory, log, namespace, registerer)
s, err := NewSet(factory, log, namespace, registerer)
require.NoError(err)

expected := `current polls: (Size = 1)
RequestID 0:
Expand Down
17 changes: 11 additions & 6 deletions snow/engine/snowman/transitive.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,16 @@ func newTransitive(config Config) (*Transitive, error) {
config.Params.AlphaPreference,
config.Params.AlphaConfidence,
)
polls, err := poll.NewSet(
factory,
config.Ctx.Log,
"",
config.Ctx.Registerer,
)
if err != nil {
return nil, err
}

t := &Transitive{
Config: config,
StateSummaryFrontierHandler: common.NewNoOpStateSummaryFrontierHandler(config.Ctx.Log),
Expand All @@ -129,12 +139,7 @@ func newTransitive(config Config) (*Transitive, error) {
nonVerifieds: ancestor.NewTree(),
nonVerifiedCache: nonVerifiedCache,
acceptedFrontiers: acceptedFrontiers,
polls: poll.NewSet(
factory,
config.Ctx.Log,
"",
config.Ctx.Registerer,
),
polls: polls,
}

return t, t.metrics.Initialize("", config.Ctx.Registerer)
Expand Down