Skip to content

Commit

Permalink
Consolidate record poll (#2970)
Browse files Browse the repository at this point in the history
  • Loading branch information
aaronbuchwald authored May 1, 2024
1 parent f8d7b29 commit 9a89b5e
Show file tree
Hide file tree
Showing 16 changed files with 226 additions and 240 deletions.
27 changes: 10 additions & 17 deletions snow/consensus/snowball/binary_snowball.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import "fmt"

var _ Binary = (*binarySnowball)(nil)

func newBinarySnowball(beta, choice int) binarySnowball {
func newBinarySnowball(alphaPreference int, alphaConfidence int, beta int, choice int) binarySnowball {
return binarySnowball{
binarySnowflake: newBinarySnowflake(beta, choice),
binarySnowflake: newBinarySnowflake(alphaPreference, alphaConfidence, beta, choice),
preference: choice,
}
}
Expand Down Expand Up @@ -39,14 +39,14 @@ func (sb *binarySnowball) Preference() int {
return sb.preference
}

func (sb *binarySnowball) RecordSuccessfulPoll(choice int) {
sb.increasePreferenceStrength(choice)
sb.binarySnowflake.RecordSuccessfulPoll(choice)
}

func (sb *binarySnowball) RecordPollPreference(choice int) {
sb.increasePreferenceStrength(choice)
sb.binarySnowflake.RecordPollPreference(choice)
func (sb *binarySnowball) RecordPoll(count, choice int) {
if count >= sb.alphaPreference {
sb.preferenceStrength[choice]++
if sb.preferenceStrength[choice] > sb.preferenceStrength[1-choice] {
sb.preference = choice
}
}
sb.binarySnowflake.RecordPoll(count, choice)
}

func (sb *binarySnowball) String() string {
Expand All @@ -57,10 +57,3 @@ func (sb *binarySnowball) String() string {
sb.preferenceStrength[1],
&sb.binarySnowflake)
}

func (sb *binarySnowball) increasePreferenceStrength(choice int) {
sb.preferenceStrength[choice]++
if sb.preferenceStrength[choice] > sb.preferenceStrength[1-choice] {
sb.preference = choice
}
}
55 changes: 30 additions & 25 deletions snow/consensus/snowball/binary_snowball_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,26 @@ func TestBinarySnowball(t *testing.T) {
red := 0
blue := 1

alphaPreference, alphaConfidence := 2, 3
beta := 2

sb := newBinarySnowball(beta, red)
sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
require.Equal(red, sb.Preference())
require.False(sb.Finalized())

sb.RecordSuccessfulPoll(blue)
sb.RecordPoll(alphaConfidence, blue)
require.Equal(blue, sb.Preference())
require.False(sb.Finalized())

sb.RecordSuccessfulPoll(red)
sb.RecordPoll(alphaConfidence, red)
require.Equal(blue, sb.Preference())
require.False(sb.Finalized())

sb.RecordSuccessfulPoll(blue)
sb.RecordPoll(alphaConfidence, blue)
require.Equal(blue, sb.Preference())
require.False(sb.Finalized())

sb.RecordSuccessfulPoll(blue)
sb.RecordPoll(alphaConfidence, blue)
require.Equal(blue, sb.Preference())
require.True(sb.Finalized())
}
Expand All @@ -44,29 +45,30 @@ func TestBinarySnowballRecordPollPreference(t *testing.T) {
red := 0
blue := 1

alphaPreference, alphaConfidence := 1, 2
beta := 2

sb := newBinarySnowball(beta, red)
sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
require.Equal(red, sb.Preference())
require.False(sb.Finalized())

sb.RecordSuccessfulPoll(blue)
sb.RecordPoll(alphaConfidence, blue)
require.Equal(blue, sb.Preference())
require.False(sb.Finalized())

sb.RecordSuccessfulPoll(red)
sb.RecordPoll(alphaConfidence, red)
require.Equal(blue, sb.Preference())
require.False(sb.Finalized())

sb.RecordPollPreference(red)
sb.RecordPoll(alphaPreference, red)
require.Equal(red, sb.Preference())
require.False(sb.Finalized())

sb.RecordSuccessfulPoll(red)
sb.RecordPoll(alphaConfidence, red)
require.Equal(red, sb.Preference())
require.False(sb.Finalized())

sb.RecordSuccessfulPoll(red)
sb.RecordPoll(alphaConfidence, red)
require.Equal(red, sb.Preference())
require.True(sb.Finalized())

Expand All @@ -80,23 +82,24 @@ func TestBinarySnowballRecordUnsuccessfulPoll(t *testing.T) {
red := 0
blue := 1

alphaPreference, alphaConfidence := 1, 2
beta := 2

sb := newBinarySnowball(beta, red)
sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
require.Equal(red, sb.Preference())
require.False(sb.Finalized())

sb.RecordSuccessfulPoll(blue)
sb.RecordPoll(alphaConfidence, blue)
require.Equal(blue, sb.Preference())
require.False(sb.Finalized())

sb.RecordUnsuccessfulPoll()

sb.RecordSuccessfulPoll(blue)
sb.RecordPoll(alphaConfidence, blue)
require.Equal(blue, sb.Preference())
require.False(sb.Finalized())

sb.RecordSuccessfulPoll(blue)
sb.RecordPoll(alphaConfidence, blue)
require.Equal(blue, sb.Preference())
require.True(sb.Finalized())

Expand All @@ -110,32 +113,33 @@ func TestBinarySnowballAcceptWeirdColor(t *testing.T) {
blue := 0
red := 1

alphaPreference, alphaConfidence := 1, 2
beta := 2

sb := newBinarySnowball(beta, red)
sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)

require.Equal(red, sb.Preference())
require.False(sb.Finalized())

sb.RecordSuccessfulPoll(red)
sb.RecordPoll(alphaConfidence, red)
sb.RecordUnsuccessfulPoll()

require.Equal(red, sb.Preference())
require.False(sb.Finalized())

sb.RecordSuccessfulPoll(red)
sb.RecordPoll(alphaConfidence, red)

sb.RecordUnsuccessfulPoll()

require.Equal(red, sb.Preference())
require.False(sb.Finalized())

sb.RecordSuccessfulPoll(blue)
sb.RecordPoll(alphaConfidence, blue)

require.Equal(red, sb.Preference())
require.False(sb.Finalized())

sb.RecordSuccessfulPoll(blue)
sb.RecordPoll(alphaConfidence, blue)

require.Equal(blue, sb.Preference())
require.True(sb.Finalized())
Expand All @@ -150,22 +154,23 @@ func TestBinarySnowballLockColor(t *testing.T) {
red := 0
blue := 1

alphaPreference, alphaConfidence := 1, 2
beta := 1

sb := newBinarySnowball(beta, red)
sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)

sb.RecordSuccessfulPoll(red)
sb.RecordPoll(alphaConfidence, red)

require.Equal(red, sb.Preference())
require.True(sb.Finalized())

sb.RecordSuccessfulPoll(blue)
sb.RecordPoll(alphaConfidence, blue)

require.Equal(red, sb.Preference())
require.True(sb.Finalized())

sb.RecordPollPreference(blue)
sb.RecordSuccessfulPoll(blue)
sb.RecordPoll(alphaPreference, blue)
sb.RecordPoll(alphaConfidence, blue)

require.Equal(red, sb.Preference())
require.True(sb.Finalized())
Expand Down
36 changes: 23 additions & 13 deletions snow/consensus/snowball/binary_snowflake.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@ import "fmt"

var _ Binary = (*binarySnowflake)(nil)

func newBinarySnowflake(beta, choice int) binarySnowflake {
func newBinarySnowflake(alphaPreference, alphaConfidence, beta, choice int) binarySnowflake {
return binarySnowflake{
binarySlush: newBinarySlush(choice),
beta: beta,
binarySlush: newBinarySlush(choice),
alphaPreference: alphaPreference,
alphaConfidence: alphaConfidence,
beta: beta,
}
}

Expand All @@ -23,6 +25,12 @@ type binarySnowflake struct {
// returned the preference
confidence int

// alphaPreference is the threshold required to update the preference
alphaPreference int

// alphaConfidence is the threshold required to increment the confidence counter
alphaConfidence int

// beta is the number of consecutive successful queries required for
// finalization.
beta int
Expand All @@ -32,11 +40,22 @@ type binarySnowflake struct {
finalized bool
}

func (sf *binarySnowflake) RecordSuccessfulPoll(choice int) {
func (sf *binarySnowflake) RecordPoll(count, choice int) {
if sf.finalized {
return // This instance is already decided.
}

if count < sf.alphaPreference {
sf.RecordUnsuccessfulPoll()
return
}

if count < sf.alphaConfidence {
sf.confidence = 0
sf.binarySlush.RecordSuccessfulPoll(choice)
return
}

if preference := sf.Preference(); preference == choice {
sf.confidence++
} else {
Expand All @@ -49,15 +68,6 @@ func (sf *binarySnowflake) RecordSuccessfulPoll(choice int) {
sf.binarySlush.RecordSuccessfulPoll(choice)
}

func (sf *binarySnowflake) RecordPollPreference(choice int) {
if sf.finalized {
return // This instance is already decided.
}

sf.confidence = 0
sf.binarySlush.RecordSuccessfulPoll(choice)
}

func (sf *binarySnowflake) RecordUnsuccessfulPoll() {
sf.confidence = 0
}
Expand Down
15 changes: 8 additions & 7 deletions snow/consensus/snowball/binary_snowflake_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,37 +15,38 @@ func TestBinarySnowflake(t *testing.T) {
blue := 0
red := 1

alphaPreference, alphaConfidence := 1, 2
beta := 2

sf := newBinarySnowflake(beta, red)
sf := newBinarySnowflake(alphaPreference, alphaConfidence, beta, red)

require.Equal(red, sf.Preference())
require.False(sf.Finalized())

sf.RecordSuccessfulPoll(blue)
sf.RecordPoll(alphaConfidence, blue)

require.Equal(blue, sf.Preference())
require.False(sf.Finalized())

sf.RecordSuccessfulPoll(red)
sf.RecordPoll(alphaConfidence, red)

require.Equal(red, sf.Preference())
require.False(sf.Finalized())

sf.RecordSuccessfulPoll(blue)
sf.RecordPoll(alphaConfidence, blue)

require.Equal(blue, sf.Preference())
require.False(sf.Finalized())

sf.RecordPollPreference(red)
sf.RecordPoll(alphaPreference, red)
require.Equal(red, sf.Preference())
require.False(sf.Finalized())

sf.RecordSuccessfulPoll(blue)
sf.RecordPoll(alphaConfidence, blue)
require.Equal(blue, sf.Preference())
require.False(sf.Finalized())

sf.RecordSuccessfulPoll(blue)
sf.RecordPoll(alphaConfidence, blue)
require.Equal(blue, sf.Preference())
require.True(sf.Finalized())
}
Loading

0 comments on commit 9a89b5e

Please sign in to comment.