Skip to content

Commit

Permalink
Replace unique slices with sets in the engine interface (#2317)
Browse files Browse the repository at this point in the history
  • Loading branch information
StephenButtolph committed Nov 15, 2023
1 parent d00b67f commit 44f3aba
Show file tree
Hide file tree
Showing 17 changed files with 66 additions and 116 deletions.
8 changes: 4 additions & 4 deletions snow/engine/avalanche/getter/getter.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func (gh *getter) GetStateSummaryFrontier(_ context.Context, nodeID ids.NodeID,
return nil
}

func (gh *getter) GetAcceptedStateSummary(_ context.Context, nodeID ids.NodeID, requestID uint32, _ []uint64) error {
func (gh *getter) GetAcceptedStateSummary(_ context.Context, nodeID ids.NodeID, requestID uint32, _ set.Set[uint64]) error {
gh.log.Debug("dropping request",
zap.String("reason", "unhandled by this gear"),
zap.Stringer("messageOp", message.GetAcceptedStateSummaryOp),
Expand All @@ -96,9 +96,9 @@ func (gh *getter) GetAcceptedFrontier(ctx context.Context, validatorID ids.NodeI
}

// TODO: Remove support for GetAccepted messages after v1.11.x is activated.
func (gh *getter) GetAccepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs []ids.ID) error {
acceptedVtxIDs := make([]ids.ID, 0, len(containerIDs))
for _, vtxID := range containerIDs {
func (gh *getter) GetAccepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs set.Set[ids.ID]) error {
acceptedVtxIDs := make([]ids.ID, 0, containerIDs.Len())
for vtxID := range containerIDs {
if vtx, err := gh.storage.GetVtx(ctx, vtxID); err == nil && vtx.Status() == choices.Accepted {
acceptedVtxIDs = append(acceptedVtxIDs, vtxID)
}
Expand Down
3 changes: 2 additions & 1 deletion snow/engine/avalanche/getter/getter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/ava-labs/avalanchego/snow/engine/avalanche/vertex"
"github.com/ava-labs/avalanchego/snow/engine/common"
"github.com/ava-labs/avalanchego/utils/logging"
"github.com/ava-labs/avalanchego/utils/set"
)

var errUnknownVertex = errors.New("unknown vertex")
Expand Down Expand Up @@ -99,7 +100,7 @@ func TestFilterAccepted(t *testing.T) {
accepted = frontier
}

vtxIDs := []ids.ID{vtxID0, vtxID1, vtxID2}
vtxIDs := set.Of(vtxID0, vtxID1, vtxID2)
require.NoError(bs.GetAccepted(context.Background(), ids.EmptyNodeID, 0, vtxIDs))

require.Contains(accepted, vtxID0)
Expand Down
4 changes: 2 additions & 2 deletions snow/engine/common/bootstrapper.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ func (b *bootstrapper) markAcceptedFrontierReceived(ctx context.Context, nodeID
return nil
}

func (b *bootstrapper) Accepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs []ids.ID) error {
func (b *bootstrapper) Accepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs set.Set[ids.ID]) error {
// ignores any late responses
if requestID != b.Config.SharedCfg.RequestID {
b.Ctx.Log.Debug("received out-of-sync Accepted message",
Expand All @@ -205,7 +205,7 @@ func (b *bootstrapper) Accepted(ctx context.Context, nodeID ids.NodeID, requestI
b.pendingReceiveAccepted.Remove(nodeID)

weight := b.Beacons.GetWeight(b.Ctx.SubnetID, nodeID)
for _, containerID := range containerIDs {
for containerID := range containerIDs {
previousWeight := b.acceptedVotes[containerID]
newWeight, err := safemath.Add64(weight, previousWeight)
if err != nil {
Expand Down
9 changes: 5 additions & 4 deletions snow/engine/common/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/snow"
"github.com/ava-labs/avalanchego/snow/validators"
"github.com/ava-labs/avalanchego/utils/set"
)

// Engine describes the standard interface of a consensus engine.
Expand Down Expand Up @@ -108,7 +109,7 @@ type GetAcceptedStateSummaryHandler interface {
ctx context.Context,
nodeID ids.NodeID,
requestID uint32,
heights []uint64,
heights set.Set[uint64],
) error
}

Expand All @@ -122,7 +123,7 @@ type AcceptedStateSummaryHandler interface {
ctx context.Context,
nodeID ids.NodeID,
requestID uint32,
summaryIDs []ids.ID,
summaryIDs set.Set[ids.ID],
) error

// Notify this engine that a GetAcceptedStateSummary request it issued has
Expand Down Expand Up @@ -182,7 +183,7 @@ type GetAcceptedHandler interface {
ctx context.Context,
nodeID ids.NodeID,
requestID uint32,
containerIDs []ids.ID,
containerIDs set.Set[ids.ID],
) error
}

Expand All @@ -196,7 +197,7 @@ type AcceptedHandler interface {
ctx context.Context,
nodeID ids.NodeID,
requestID uint32,
containerIDs []ids.ID,
containerIDs set.Set[ids.ID],
) error

// Notify this engine that a GetAccepted request it issued has failed.
Expand Down
5 changes: 3 additions & 2 deletions snow/engine/common/no_ops_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/ava-labs/avalanchego/message"
"github.com/ava-labs/avalanchego/utils/constants"
"github.com/ava-labs/avalanchego/utils/logging"
"github.com/ava-labs/avalanchego/utils/set"
"github.com/ava-labs/avalanchego/version"
)

Expand Down Expand Up @@ -65,7 +66,7 @@ func NewNoOpAcceptedStateSummaryHandler(log logging.Logger) AcceptedStateSummary
return &noOpAcceptedStateSummaryHandler{log: log}
}

func (nop *noOpAcceptedStateSummaryHandler) AcceptedStateSummary(_ context.Context, nodeID ids.NodeID, requestID uint32, _ []ids.ID) error {
func (nop *noOpAcceptedStateSummaryHandler) AcceptedStateSummary(_ context.Context, nodeID ids.NodeID, requestID uint32, _ set.Set[ids.ID]) error {
nop.log.Debug("dropping request",
zap.String("reason", "unhandled by this gear"),
zap.Stringer("messageOp", message.AcceptedStateSummaryOp),
Expand Down Expand Up @@ -122,7 +123,7 @@ func NewNoOpAcceptedHandler(log logging.Logger) AcceptedHandler {
return &noOpAcceptedHandler{log: log}
}

func (nop *noOpAcceptedHandler) Accepted(_ context.Context, nodeID ids.NodeID, requestID uint32, _ []ids.ID) error {
func (nop *noOpAcceptedHandler) Accepted(_ context.Context, nodeID ids.NodeID, requestID uint32, _ set.Set[ids.ID]) error {
nop.log.Debug("dropping request",
zap.String("reason", "unhandled by this gear"),
zap.Stringer("messageOp", message.AcceptedOp),
Expand Down
15 changes: 8 additions & 7 deletions snow/engine/common/test_engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (

"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/snow"
"github.com/ava-labs/avalanchego/utils/set"
"github.com/ava-labs/avalanchego/version"
)

Expand Down Expand Up @@ -119,15 +120,15 @@ type EngineTest struct {
PushQueryF func(ctx context.Context, nodeID ids.NodeID, requestID uint32, container []byte, requestedHeight uint64) error
AncestorsF func(ctx context.Context, nodeID ids.NodeID, requestID uint32, containers [][]byte) error
AcceptedFrontierF func(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerID ids.ID) error
GetAcceptedF, AcceptedF func(ctx context.Context, nodeID ids.NodeID, requestID uint32, preferredIDs []ids.ID) error
GetAcceptedF, AcceptedF func(ctx context.Context, nodeID ids.NodeID, requestID uint32, preferredIDs set.Set[ids.ID]) error
ChitsF func(ctx context.Context, nodeID ids.NodeID, requestID uint32, preferredID ids.ID, preferredIDAtHeight ids.ID, acceptedID ids.ID) error
GetStateSummaryFrontierF, GetStateSummaryFrontierFailedF, GetAcceptedStateSummaryFailedF,
GetAcceptedFrontierF, GetFailedF, GetAncestorsFailedF,
QueryFailedF, GetAcceptedFrontierFailedF, GetAcceptedFailedF func(ctx context.Context, nodeID ids.NodeID, requestID uint32) error
AppRequestFailedF func(ctx context.Context, nodeID ids.NodeID, requestID uint32) error
StateSummaryFrontierF func(ctx context.Context, nodeID ids.NodeID, requestID uint32, summary []byte) error
GetAcceptedStateSummaryF func(ctx context.Context, nodeID ids.NodeID, requestID uint32, keys []uint64) error
AcceptedStateSummaryF func(ctx context.Context, nodeID ids.NodeID, requestID uint32, summaryIDs []ids.ID) error
GetAcceptedStateSummaryF func(ctx context.Context, nodeID ids.NodeID, requestID uint32, keys set.Set[uint64]) error
AcceptedStateSummaryF func(ctx context.Context, nodeID ids.NodeID, requestID uint32, summaryIDs set.Set[ids.ID]) error
ConnectedF func(ctx context.Context, nodeID ids.NodeID, nodeVersion *version.Application) error
DisconnectedF func(ctx context.Context, nodeID ids.NodeID) error
HealthF func(context.Context) (interface{}, error)
Expand Down Expand Up @@ -314,7 +315,7 @@ func (e *EngineTest) GetStateSummaryFrontierFailed(ctx context.Context, validato
return errGetStateSummaryFrontierFailed
}

func (e *EngineTest) GetAcceptedStateSummary(ctx context.Context, validatorID ids.NodeID, requestID uint32, keys []uint64) error {
func (e *EngineTest) GetAcceptedStateSummary(ctx context.Context, validatorID ids.NodeID, requestID uint32, keys set.Set[uint64]) error {
if e.GetAcceptedStateSummaryF != nil {
return e.GetAcceptedStateSummaryF(ctx, validatorID, requestID, keys)
}
Expand All @@ -327,7 +328,7 @@ func (e *EngineTest) GetAcceptedStateSummary(ctx context.Context, validatorID id
return errGetAcceptedStateSummary
}

func (e *EngineTest) AcceptedStateSummary(ctx context.Context, validatorID ids.NodeID, requestID uint32, summaryIDs []ids.ID) error {
func (e *EngineTest) AcceptedStateSummary(ctx context.Context, validatorID ids.NodeID, requestID uint32, summaryIDs set.Set[ids.ID]) error {
if e.AcceptedStateSummaryF != nil {
return e.AcceptedStateSummaryF(ctx, validatorID, requestID, summaryIDs)
}
Expand Down Expand Up @@ -392,7 +393,7 @@ func (e *EngineTest) AcceptedFrontier(ctx context.Context, nodeID ids.NodeID, re
return errAcceptedFrontier
}

func (e *EngineTest) GetAccepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs []ids.ID) error {
func (e *EngineTest) GetAccepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs set.Set[ids.ID]) error {
if e.GetAcceptedF != nil {
return e.GetAcceptedF(ctx, nodeID, requestID, containerIDs)
}
Expand All @@ -418,7 +419,7 @@ func (e *EngineTest) GetAcceptedFailed(ctx context.Context, nodeID ids.NodeID, r
return errGetAcceptedFailed
}

func (e *EngineTest) Accepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs []ids.ID) error {
func (e *EngineTest) Accepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs set.Set[ids.ID]) error {
if e.AcceptedF != nil {
return e.AcceptedF(ctx, nodeID, requestID, containerIDs)
}
Expand Down
17 changes: 9 additions & 8 deletions snow/engine/common/traced_engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/snow"
"github.com/ava-labs/avalanchego/trace"
"github.com/ava-labs/avalanchego/utils/set"
"github.com/ava-labs/avalanchego/version"
)

Expand Down Expand Up @@ -62,22 +63,22 @@ func (e *tracedEngine) GetStateSummaryFrontierFailed(ctx context.Context, nodeID
return e.engine.GetStateSummaryFrontierFailed(ctx, nodeID, requestID)
}

func (e *tracedEngine) GetAcceptedStateSummary(ctx context.Context, nodeID ids.NodeID, requestID uint32, heights []uint64) error {
func (e *tracedEngine) GetAcceptedStateSummary(ctx context.Context, nodeID ids.NodeID, requestID uint32, heights set.Set[uint64]) error {
ctx, span := e.tracer.Start(ctx, "tracedEngine.GetAcceptedStateSummary", oteltrace.WithAttributes(
attribute.Stringer("nodeID", nodeID),
attribute.Int64("requestID", int64(requestID)),
attribute.Int("numHeights", len(heights)),
attribute.Int("numHeights", heights.Len()),
))
defer span.End()

return e.engine.GetAcceptedStateSummary(ctx, nodeID, requestID, heights)
}

func (e *tracedEngine) AcceptedStateSummary(ctx context.Context, nodeID ids.NodeID, requestID uint32, summaryIDs []ids.ID) error {
func (e *tracedEngine) AcceptedStateSummary(ctx context.Context, nodeID ids.NodeID, requestID uint32, summaryIDs set.Set[ids.ID]) error {
ctx, span := e.tracer.Start(ctx, "tracedEngine.AcceptedStateSummary", oteltrace.WithAttributes(
attribute.Stringer("nodeID", nodeID),
attribute.Int64("requestID", int64(requestID)),
attribute.Int("numSummaryIDs", len(summaryIDs)),
attribute.Int("numSummaryIDs", summaryIDs.Len()),
))
defer span.End()

Expand Down Expand Up @@ -125,22 +126,22 @@ func (e *tracedEngine) GetAcceptedFrontierFailed(ctx context.Context, nodeID ids
return e.engine.GetAcceptedFrontierFailed(ctx, nodeID, requestID)
}

func (e *tracedEngine) GetAccepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs []ids.ID) error {
func (e *tracedEngine) GetAccepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs set.Set[ids.ID]) error {
ctx, span := e.tracer.Start(ctx, "tracedEngine.GetAccepted", oteltrace.WithAttributes(
attribute.Stringer("nodeID", nodeID),
attribute.Int64("requestID", int64(requestID)),
attribute.Int("numContainerIDs", len(containerIDs)),
attribute.Int("numContainerIDs", containerIDs.Len()),
))
defer span.End()

return e.engine.GetAccepted(ctx, nodeID, requestID, containerIDs)
}

func (e *tracedEngine) Accepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs []ids.ID) error {
func (e *tracedEngine) Accepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs set.Set[ids.ID]) error {
ctx, span := e.tracer.Start(ctx, "tracedEngine.Accepted", oteltrace.WithAttributes(
attribute.Stringer("nodeID", nodeID),
attribute.Int64("requestID", int64(requestID)),
attribute.Int("numContainerIDs", len(containerIDs)),
attribute.Int("numContainerIDs", containerIDs.Len()),
))
defer span.End()

Expand Down
15 changes: 8 additions & 7 deletions snow/engine/snowman/getter/getter.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"github.com/ava-labs/avalanchego/utils/constants"
"github.com/ava-labs/avalanchego/utils/logging"
"github.com/ava-labs/avalanchego/utils/metric"
"github.com/ava-labs/avalanchego/utils/set"
)

// Get requests are always served, regardless node state (bootstrapping or normal operations).
Expand Down Expand Up @@ -94,10 +95,10 @@ func (gh *getter) GetStateSummaryFrontier(ctx context.Context, nodeID ids.NodeID
return nil
}

func (gh *getter) GetAcceptedStateSummary(ctx context.Context, nodeID ids.NodeID, requestID uint32, heights []uint64) error {
func (gh *getter) GetAcceptedStateSummary(ctx context.Context, nodeID ids.NodeID, requestID uint32, heights set.Set[uint64]) error {
// If there are no requested heights, then we can return the result
// immediately, regardless of if the underlying VM implements state sync.
if len(heights) == 0 {
if heights.Len() == 0 {
gh.sender.SendAcceptedStateSummary(ctx, nodeID, requestID, nil)
return nil
}
Expand All @@ -114,8 +115,8 @@ func (gh *getter) GetAcceptedStateSummary(ctx context.Context, nodeID ids.NodeID
return nil
}

summaryIDs := make([]ids.ID, 0, len(heights))
for _, height := range heights {
summaryIDs := make([]ids.ID, 0, heights.Len())
for height := range heights {
summary, err := gh.ssVM.GetStateSummary(ctx, height)
if err == block.ErrStateSyncableVMNotImplemented {
gh.log.Debug("dropping GetAcceptedStateSummary message",
Expand Down Expand Up @@ -148,9 +149,9 @@ func (gh *getter) GetAcceptedFrontier(ctx context.Context, nodeID ids.NodeID, re
return nil
}

func (gh *getter) GetAccepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs []ids.ID) error {
acceptedIDs := make([]ids.ID, 0, len(containerIDs))
for _, blkID := range containerIDs {
func (gh *getter) GetAccepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs set.Set[ids.ID]) error {
acceptedIDs := make([]ids.ID, 0, containerIDs.Len())
for blkID := range containerIDs {
blk, err := gh.vm.GetBlock(ctx, blkID)
if err == nil && blk.Status() == choices.Accepted {
acceptedIDs = append(acceptedIDs, blkID)
Expand Down
3 changes: 2 additions & 1 deletion snow/engine/snowman/getter/getter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"github.com/ava-labs/avalanchego/snow/engine/snowman/block"
"github.com/ava-labs/avalanchego/snow/engine/snowman/block/mocks"
"github.com/ava-labs/avalanchego/utils/logging"
"github.com/ava-labs/avalanchego/utils/set"
)

var errUnknownBlock = errors.New("unknown block")
Expand Down Expand Up @@ -110,7 +111,7 @@ func TestFilterAccepted(t *testing.T) {
accepted = frontier
}

blkIDs := []ids.ID{blkID0, blkID1, blkID2}
blkIDs := set.Of(blkID0, blkID1, blkID2)
require.NoError(bs.GetAccepted(context.Background(), ids.EmptyNodeID, 0, blkIDs))

require.Len(accepted, 2)
Expand Down
6 changes: 3 additions & 3 deletions snow/engine/snowman/syncer/state_syncer.go
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ func (ss *stateSyncer) receivedStateSummaryFrontier(ctx context.Context) error {
return nil
}

func (ss *stateSyncer) AcceptedStateSummary(ctx context.Context, nodeID ids.NodeID, requestID uint32, summaryIDs []ids.ID) error {
func (ss *stateSyncer) AcceptedStateSummary(ctx context.Context, nodeID ids.NodeID, requestID uint32, summaryIDs set.Set[ids.ID]) error {
// ignores any late responses
if requestID != ss.requestID {
ss.Ctx.Log.Debug("received out-of-sync AcceptedStateSummary message",
Expand All @@ -248,10 +248,10 @@ func (ss *stateSyncer) AcceptedStateSummary(ctx context.Context, nodeID ids.Node
ss.Ctx.Log.Debug("adding weight to summaries",
zap.Stringer("nodeID", nodeID),
zap.Stringer("subnetID", ss.Ctx.SubnetID),
zap.Stringers("summaryIDs", summaryIDs),
zap.Reflect("summaryIDs", summaryIDs),
zap.Uint64("nodeWeight", nodeWeight),
)
for _, summaryID := range summaryIDs {
for summaryID := range summaryIDs {
ws, ok := ss.weightedSummaries[summaryID]
if !ok {
ss.Ctx.Log.Debug("skipping summary",
Expand Down

0 comments on commit 44f3aba

Please sign in to comment.