Skip to content

Commit 6e1a905

Browse files
authored
Abort query if not enough stake is connected (#3345)
Signed-off-by: Yacov Manevich <[email protected]>
1 parent 718128a commit 6e1a905

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

snow/engine/snowman/engine.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ import (
3131
"github.com/ava-labs/avalanchego/utils/units"
3232
)
3333

34-
const nonVerifiedCacheSize = 64 * units.MiB
34+
const (
35+
nonVerifiedCacheSize = 64 * units.MiB
36+
errInsufficientStake = "insufficient connected stake"
37+
)
3538

3639
var _ common.Engine = (*Engine)(nil)
3740

@@ -871,6 +874,10 @@ func (e *Engine) sendQuery(
871874
blkBytes []byte,
872875
push bool,
873876
) {
877+
if e.abortDueToInsufficientConnectedStake(blkID) {
878+
return
879+
}
880+
874881
e.Ctx.Log.Verbo("sampling from validators",
875882
zap.Stringer("validators", e.Validators),
876883
)
@@ -916,6 +923,21 @@ func (e *Engine) sendQuery(
916923
}
917924
}
918925

926+
func (e *Engine) abortDueToInsufficientConnectedStake(blkID ids.ID) bool {
927+
stakeConnectedRatio := e.Config.ConnectedValidators.ConnectedPercent()
928+
minConnectedStakeToQuery := float64(e.Params.AlphaConfidence) / float64(e.Params.K)
929+
930+
if stakeConnectedRatio < minConnectedStakeToQuery {
931+
e.Ctx.Log.Debug("dropped query for block",
932+
zap.String("reason", errInsufficientStake),
933+
zap.Stringer("blkID", blkID),
934+
zap.Float64("ratio", stakeConnectedRatio),
935+
)
936+
return true
937+
}
938+
return false
939+
}
940+
919941
// issue [blk] to consensus
920942
// If [push] is true, a push query will be used. Otherwise, a pull query will be
921943
// used.

snow/engine/snowman/engine_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@ import (
2222
"github.com/ava-labs/avalanchego/snow/consensus/snowman"
2323
"github.com/ava-labs/avalanchego/snow/consensus/snowman/snowmantest"
2424
"github.com/ava-labs/avalanchego/snow/engine/common"
25+
"github.com/ava-labs/avalanchego/snow/engine/common/tracker"
2526
"github.com/ava-labs/avalanchego/snow/engine/enginetest"
2627
"github.com/ava-labs/avalanchego/snow/engine/snowman/ancestor"
2728
"github.com/ava-labs/avalanchego/snow/engine/snowman/block/blocktest"
2829
"github.com/ava-labs/avalanchego/snow/engine/snowman/getter"
2930
"github.com/ava-labs/avalanchego/snow/snowtest"
3031
"github.com/ava-labs/avalanchego/snow/validators"
3132
"github.com/ava-labs/avalanchego/utils"
33+
"github.com/ava-labs/avalanchego/utils/logging"
3234
"github.com/ava-labs/avalanchego/utils/set"
3335
"github.com/ava-labs/avalanchego/version"
3436
)
@@ -3182,3 +3184,40 @@ func TestShouldIssueBlock(t *testing.T) {
31823184
})
31833185
}
31843186
}
3187+
3188+
type mockConnVDR struct {
3189+
tracker.Peers
3190+
percent float64
3191+
}
3192+
3193+
func (m *mockConnVDR) ConnectedPercent() float64 {
3194+
return m.percent
3195+
}
3196+
3197+
type logBuffer struct {
3198+
bytes.Buffer
3199+
}
3200+
3201+
func (logBuffer) Close() error {
3202+
return nil
3203+
}
3204+
3205+
func TestEngineAbortQueryWhenInPartition(t *testing.T) {
3206+
require := require.New(t)
3207+
3208+
// Buffer to record the log entries
3209+
buff := logBuffer{}
3210+
3211+
conf := DefaultConfig(t)
3212+
// Overwrite the log to record what it says
3213+
conf.Ctx.Log = logging.NewLogger("", logging.NewWrappedCore(logging.Verbo, &buff, logging.Plain.ConsoleEncoder()))
3214+
conf.Params = snowball.DefaultParameters
3215+
conf.ConnectedValidators = &mockConnVDR{percent: 0.7, Peers: conf.ConnectedValidators}
3216+
3217+
_, _, _, _, engine := setup(t, conf)
3218+
3219+
// Gossip will cause a pull query if enough stake is connected
3220+
engine.sendQuery(context.Background(), ids.ID{}, nil, false)
3221+
3222+
require.Contains(buff.String(), errInsufficientStake)
3223+
}

0 commit comments

Comments
 (0)