Skip to content

Commit 9a89b5e

Browse files
Consolidate record poll (#2970)
1 parent f8d7b29 commit 9a89b5e

16 files changed

+226
-240
lines changed

snow/consensus/snowball/binary_snowball.go

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import "fmt"
77

88
var _ Binary = (*binarySnowball)(nil)
99

10-
func newBinarySnowball(beta, choice int) binarySnowball {
10+
func newBinarySnowball(alphaPreference int, alphaConfidence int, beta int, choice int) binarySnowball {
1111
return binarySnowball{
12-
binarySnowflake: newBinarySnowflake(beta, choice),
12+
binarySnowflake: newBinarySnowflake(alphaPreference, alphaConfidence, beta, choice),
1313
preference: choice,
1414
}
1515
}
@@ -39,14 +39,14 @@ func (sb *binarySnowball) Preference() int {
3939
return sb.preference
4040
}
4141

42-
func (sb *binarySnowball) RecordSuccessfulPoll(choice int) {
43-
sb.increasePreferenceStrength(choice)
44-
sb.binarySnowflake.RecordSuccessfulPoll(choice)
45-
}
46-
47-
func (sb *binarySnowball) RecordPollPreference(choice int) {
48-
sb.increasePreferenceStrength(choice)
49-
sb.binarySnowflake.RecordPollPreference(choice)
42+
func (sb *binarySnowball) RecordPoll(count, choice int) {
43+
if count >= sb.alphaPreference {
44+
sb.preferenceStrength[choice]++
45+
if sb.preferenceStrength[choice] > sb.preferenceStrength[1-choice] {
46+
sb.preference = choice
47+
}
48+
}
49+
sb.binarySnowflake.RecordPoll(count, choice)
5050
}
5151

5252
func (sb *binarySnowball) String() string {
@@ -57,10 +57,3 @@ func (sb *binarySnowball) String() string {
5757
sb.preferenceStrength[1],
5858
&sb.binarySnowflake)
5959
}
60-
61-
func (sb *binarySnowball) increasePreferenceStrength(choice int) {
62-
sb.preferenceStrength[choice]++
63-
if sb.preferenceStrength[choice] > sb.preferenceStrength[1-choice] {
64-
sb.preference = choice
65-
}
66-
}

snow/consensus/snowball/binary_snowball_test.go

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,26 @@ func TestBinarySnowball(t *testing.T) {
1515
red := 0
1616
blue := 1
1717

18+
alphaPreference, alphaConfidence := 2, 3
1819
beta := 2
1920

20-
sb := newBinarySnowball(beta, red)
21+
sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
2122
require.Equal(red, sb.Preference())
2223
require.False(sb.Finalized())
2324

24-
sb.RecordSuccessfulPoll(blue)
25+
sb.RecordPoll(alphaConfidence, blue)
2526
require.Equal(blue, sb.Preference())
2627
require.False(sb.Finalized())
2728

28-
sb.RecordSuccessfulPoll(red)
29+
sb.RecordPoll(alphaConfidence, red)
2930
require.Equal(blue, sb.Preference())
3031
require.False(sb.Finalized())
3132

32-
sb.RecordSuccessfulPoll(blue)
33+
sb.RecordPoll(alphaConfidence, blue)
3334
require.Equal(blue, sb.Preference())
3435
require.False(sb.Finalized())
3536

36-
sb.RecordSuccessfulPoll(blue)
37+
sb.RecordPoll(alphaConfidence, blue)
3738
require.Equal(blue, sb.Preference())
3839
require.True(sb.Finalized())
3940
}
@@ -44,29 +45,30 @@ func TestBinarySnowballRecordPollPreference(t *testing.T) {
4445
red := 0
4546
blue := 1
4647

48+
alphaPreference, alphaConfidence := 1, 2
4749
beta := 2
4850

49-
sb := newBinarySnowball(beta, red)
51+
sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
5052
require.Equal(red, sb.Preference())
5153
require.False(sb.Finalized())
5254

53-
sb.RecordSuccessfulPoll(blue)
55+
sb.RecordPoll(alphaConfidence, blue)
5456
require.Equal(blue, sb.Preference())
5557
require.False(sb.Finalized())
5658

57-
sb.RecordSuccessfulPoll(red)
59+
sb.RecordPoll(alphaConfidence, red)
5860
require.Equal(blue, sb.Preference())
5961
require.False(sb.Finalized())
6062

61-
sb.RecordPollPreference(red)
63+
sb.RecordPoll(alphaPreference, red)
6264
require.Equal(red, sb.Preference())
6365
require.False(sb.Finalized())
6466

65-
sb.RecordSuccessfulPoll(red)
67+
sb.RecordPoll(alphaConfidence, red)
6668
require.Equal(red, sb.Preference())
6769
require.False(sb.Finalized())
6870

69-
sb.RecordSuccessfulPoll(red)
71+
sb.RecordPoll(alphaConfidence, red)
7072
require.Equal(red, sb.Preference())
7173
require.True(sb.Finalized())
7274

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

85+
alphaPreference, alphaConfidence := 1, 2
8386
beta := 2
8487

85-
sb := newBinarySnowball(beta, red)
88+
sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
8689
require.Equal(red, sb.Preference())
8790
require.False(sb.Finalized())
8891

89-
sb.RecordSuccessfulPoll(blue)
92+
sb.RecordPoll(alphaConfidence, blue)
9093
require.Equal(blue, sb.Preference())
9194
require.False(sb.Finalized())
9295

9396
sb.RecordUnsuccessfulPoll()
9497

95-
sb.RecordSuccessfulPoll(blue)
98+
sb.RecordPoll(alphaConfidence, blue)
9699
require.Equal(blue, sb.Preference())
97100
require.False(sb.Finalized())
98101

99-
sb.RecordSuccessfulPoll(blue)
102+
sb.RecordPoll(alphaConfidence, blue)
100103
require.Equal(blue, sb.Preference())
101104
require.True(sb.Finalized())
102105

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

116+
alphaPreference, alphaConfidence := 1, 2
113117
beta := 2
114118

115-
sb := newBinarySnowball(beta, red)
119+
sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
116120

117121
require.Equal(red, sb.Preference())
118122
require.False(sb.Finalized())
119123

120-
sb.RecordSuccessfulPoll(red)
124+
sb.RecordPoll(alphaConfidence, red)
121125
sb.RecordUnsuccessfulPoll()
122126

123127
require.Equal(red, sb.Preference())
124128
require.False(sb.Finalized())
125129

126-
sb.RecordSuccessfulPoll(red)
130+
sb.RecordPoll(alphaConfidence, red)
127131

128132
sb.RecordUnsuccessfulPoll()
129133

130134
require.Equal(red, sb.Preference())
131135
require.False(sb.Finalized())
132136

133-
sb.RecordSuccessfulPoll(blue)
137+
sb.RecordPoll(alphaConfidence, blue)
134138

135139
require.Equal(red, sb.Preference())
136140
require.False(sb.Finalized())
137141

138-
sb.RecordSuccessfulPoll(blue)
142+
sb.RecordPoll(alphaConfidence, blue)
139143

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

157+
alphaPreference, alphaConfidence := 1, 2
153158
beta := 1
154159

155-
sb := newBinarySnowball(beta, red)
160+
sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
156161

157-
sb.RecordSuccessfulPoll(red)
162+
sb.RecordPoll(alphaConfidence, red)
158163

159164
require.Equal(red, sb.Preference())
160165
require.True(sb.Finalized())
161166

162-
sb.RecordSuccessfulPoll(blue)
167+
sb.RecordPoll(alphaConfidence, blue)
163168

164169
require.Equal(red, sb.Preference())
165170
require.True(sb.Finalized())
166171

167-
sb.RecordPollPreference(blue)
168-
sb.RecordSuccessfulPoll(blue)
172+
sb.RecordPoll(alphaPreference, blue)
173+
sb.RecordPoll(alphaConfidence, blue)
169174

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

snow/consensus/snowball/binary_snowflake.go

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ import "fmt"
77

88
var _ Binary = (*binarySnowflake)(nil)
99

10-
func newBinarySnowflake(beta, choice int) binarySnowflake {
10+
func newBinarySnowflake(alphaPreference, alphaConfidence, beta, choice int) binarySnowflake {
1111
return binarySnowflake{
12-
binarySlush: newBinarySlush(choice),
13-
beta: beta,
12+
binarySlush: newBinarySlush(choice),
13+
alphaPreference: alphaPreference,
14+
alphaConfidence: alphaConfidence,
15+
beta: beta,
1416
}
1517
}
1618

@@ -23,6 +25,12 @@ type binarySnowflake struct {
2325
// returned the preference
2426
confidence int
2527

28+
// alphaPreference is the threshold required to update the preference
29+
alphaPreference int
30+
31+
// alphaConfidence is the threshold required to increment the confidence counter
32+
alphaConfidence int
33+
2634
// beta is the number of consecutive successful queries required for
2735
// finalization.
2836
beta int
@@ -32,11 +40,22 @@ type binarySnowflake struct {
3240
finalized bool
3341
}
3442

35-
func (sf *binarySnowflake) RecordSuccessfulPoll(choice int) {
43+
func (sf *binarySnowflake) RecordPoll(count, choice int) {
3644
if sf.finalized {
3745
return // This instance is already decided.
3846
}
3947

48+
if count < sf.alphaPreference {
49+
sf.RecordUnsuccessfulPoll()
50+
return
51+
}
52+
53+
if count < sf.alphaConfidence {
54+
sf.confidence = 0
55+
sf.binarySlush.RecordSuccessfulPoll(choice)
56+
return
57+
}
58+
4059
if preference := sf.Preference(); preference == choice {
4160
sf.confidence++
4261
} else {
@@ -49,15 +68,6 @@ func (sf *binarySnowflake) RecordSuccessfulPoll(choice int) {
4968
sf.binarySlush.RecordSuccessfulPoll(choice)
5069
}
5170

52-
func (sf *binarySnowflake) RecordPollPreference(choice int) {
53-
if sf.finalized {
54-
return // This instance is already decided.
55-
}
56-
57-
sf.confidence = 0
58-
sf.binarySlush.RecordSuccessfulPoll(choice)
59-
}
60-
6171
func (sf *binarySnowflake) RecordUnsuccessfulPoll() {
6272
sf.confidence = 0
6373
}

snow/consensus/snowball/binary_snowflake_test.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,37 +15,38 @@ func TestBinarySnowflake(t *testing.T) {
1515
blue := 0
1616
red := 1
1717

18+
alphaPreference, alphaConfidence := 1, 2
1819
beta := 2
1920

20-
sf := newBinarySnowflake(beta, red)
21+
sf := newBinarySnowflake(alphaPreference, alphaConfidence, beta, red)
2122

2223
require.Equal(red, sf.Preference())
2324
require.False(sf.Finalized())
2425

25-
sf.RecordSuccessfulPoll(blue)
26+
sf.RecordPoll(alphaConfidence, blue)
2627

2728
require.Equal(blue, sf.Preference())
2829
require.False(sf.Finalized())
2930

30-
sf.RecordSuccessfulPoll(red)
31+
sf.RecordPoll(alphaConfidence, red)
3132

3233
require.Equal(red, sf.Preference())
3334
require.False(sf.Finalized())
3435

35-
sf.RecordSuccessfulPoll(blue)
36+
sf.RecordPoll(alphaConfidence, blue)
3637

3738
require.Equal(blue, sf.Preference())
3839
require.False(sf.Finalized())
3940

40-
sf.RecordPollPreference(red)
41+
sf.RecordPoll(alphaPreference, red)
4142
require.Equal(red, sf.Preference())
4243
require.False(sf.Finalized())
4344

44-
sf.RecordSuccessfulPoll(blue)
45+
sf.RecordPoll(alphaConfidence, blue)
4546
require.Equal(blue, sf.Preference())
4647
require.False(sf.Finalized())
4748

48-
sf.RecordSuccessfulPoll(blue)
49+
sf.RecordPoll(alphaConfidence, blue)
4950
require.Equal(blue, sf.Preference())
5051
require.True(sf.Finalized())
5152
}

0 commit comments

Comments
 (0)