Skip to content

Commit 5002b82

Browse files
Error driven snowflake multi counter (#3092)
1 parent 41e46d1 commit 5002b82

17 files changed

+503
-233
lines changed

snow/consensus/snowball/binary_snowball.go

Lines changed: 2 additions & 2 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(alphaPreference int, alphaConfidence int, beta int, choice int) binarySnowball {
10+
func newBinarySnowball(alphaPreference int, terminationConditions []terminationCondition, choice int) binarySnowball {
1111
return binarySnowball{
12-
binarySnowflake: newBinarySnowflake(alphaPreference, alphaConfidence, beta, choice),
12+
binarySnowflake: newBinarySnowflake(alphaPreference, terminationConditions, choice),
1313
preference: choice,
1414
}
1515
}

snow/consensus/snowball/binary_snowball_test.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ func TestBinarySnowball(t *testing.T) {
1717

1818
alphaPreference, alphaConfidence := 2, 3
1919
beta := 2
20+
terminationConditions := newSingleTerminationCondition(alphaConfidence, beta)
2021

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

@@ -47,8 +48,9 @@ func TestBinarySnowballRecordPollPreference(t *testing.T) {
4748

4849
alphaPreference, alphaConfidence := 1, 2
4950
beta := 2
51+
terminationConditions := newSingleTerminationCondition(alphaConfidence, beta)
5052

51-
sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
53+
sb := newBinarySnowball(alphaPreference, terminationConditions, red)
5254
require.Equal(red, sb.Preference())
5355
require.False(sb.Finalized())
5456

@@ -72,7 +74,7 @@ func TestBinarySnowballRecordPollPreference(t *testing.T) {
7274
require.Equal(red, sb.Preference())
7375
require.True(sb.Finalized())
7476

75-
expected := "SB(Preference = 0, PreferenceStrength[0] = 4, PreferenceStrength[1] = 1, SF(Confidence = 2, Finalized = true, SL(Preference = 0)))"
77+
expected := "SB(Preference = 0, PreferenceStrength[0] = 4, PreferenceStrength[1] = 1, SF(Confidence = [2], Finalized = true, SL(Preference = 0)))"
7678
require.Equal(expected, sb.String())
7779
}
7880

@@ -84,8 +86,9 @@ func TestBinarySnowballRecordUnsuccessfulPoll(t *testing.T) {
8486

8587
alphaPreference, alphaConfidence := 1, 2
8688
beta := 2
89+
terminationConditions := newSingleTerminationCondition(alphaConfidence, beta)
8790

88-
sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
91+
sb := newBinarySnowball(alphaPreference, terminationConditions, red)
8992
require.Equal(red, sb.Preference())
9093
require.False(sb.Finalized())
9194

@@ -103,7 +106,7 @@ func TestBinarySnowballRecordUnsuccessfulPoll(t *testing.T) {
103106
require.Equal(blue, sb.Preference())
104107
require.True(sb.Finalized())
105108

106-
expected := "SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 3, SF(Confidence = 2, Finalized = true, SL(Preference = 1)))"
109+
expected := "SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 3, SF(Confidence = [2], Finalized = true, SL(Preference = 1)))"
107110
require.Equal(expected, sb.String())
108111
}
109112

@@ -115,8 +118,9 @@ func TestBinarySnowballAcceptWeirdColor(t *testing.T) {
115118

116119
alphaPreference, alphaConfidence := 1, 2
117120
beta := 2
121+
terminationConditions := newSingleTerminationCondition(alphaConfidence, beta)
118122

119-
sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
123+
sb := newBinarySnowball(alphaPreference, terminationConditions, red)
120124

121125
require.Equal(red, sb.Preference())
122126
require.False(sb.Finalized())
@@ -144,7 +148,7 @@ func TestBinarySnowballAcceptWeirdColor(t *testing.T) {
144148
require.Equal(blue, sb.Preference())
145149
require.True(sb.Finalized())
146150

147-
expected := "SB(Preference = 1, PreferenceStrength[0] = 2, PreferenceStrength[1] = 2, SF(Confidence = 2, Finalized = true, SL(Preference = 0)))"
151+
expected := "SB(Preference = 1, PreferenceStrength[0] = 2, PreferenceStrength[1] = 2, SF(Confidence = [2], Finalized = true, SL(Preference = 0)))"
148152
require.Equal(expected, sb.String())
149153
}
150154

@@ -156,8 +160,9 @@ func TestBinarySnowballLockColor(t *testing.T) {
156160

157161
alphaPreference, alphaConfidence := 1, 2
158162
beta := 1
163+
terminationConditions := newSingleTerminationCondition(alphaConfidence, beta)
159164

160-
sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
165+
sb := newBinarySnowball(alphaPreference, terminationConditions, red)
161166

162167
sb.RecordPoll(alphaConfidence, red)
163168

@@ -175,6 +180,6 @@ func TestBinarySnowballLockColor(t *testing.T) {
175180
require.Equal(red, sb.Preference())
176181
require.True(sb.Finalized())
177182

178-
expected := "SB(Preference = 1, PreferenceStrength[0] = 1, PreferenceStrength[1] = 3, SF(Confidence = 1, Finalized = true, SL(Preference = 0)))"
183+
expected := "SB(Preference = 1, PreferenceStrength[0] = 1, PreferenceStrength[1] = 3, SF(Confidence = [1], Finalized = true, SL(Preference = 0)))"
179184
require.Equal(expected, sb.String())
180185
}

snow/consensus/snowball/binary_snowflake.go

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

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

10-
func newBinarySnowflake(alphaPreference, alphaConfidence, beta, choice int) binarySnowflake {
10+
func newBinarySnowflake(alphaPreference int, terminationConditions []terminationCondition, choice int) binarySnowflake {
1111
return binarySnowflake{
12-
binarySlush: newBinarySlush(choice),
13-
alphaPreference: alphaPreference,
14-
terminationConditions: []terminationCondition{
15-
{
16-
alphaConfidence: alphaConfidence,
17-
beta: beta,
18-
},
19-
},
20-
confidence: make([]int, 1),
12+
binarySlush: newBinarySlush(choice),
13+
alphaPreference: alphaPreference,
14+
terminationConditions: terminationConditions,
15+
confidence: make([]int, len(terminationConditions)),
2116
}
2217
}
2318

@@ -94,8 +89,8 @@ func (sf *binarySnowflake) Finalized() bool {
9489
}
9590

9691
func (sf *binarySnowflake) String() string {
97-
return fmt.Sprintf("SF(Confidence = %d, Finalized = %v, %s)",
98-
sf.confidence[0],
92+
return fmt.Sprintf("SF(Confidence = %v, Finalized = %v, %s)",
93+
sf.confidence,
9994
sf.finalized,
10095
&sf.binarySlush)
10196
}

snow/consensus/snowball/binary_snowflake_test.go

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ func TestBinarySnowflake(t *testing.T) {
1717

1818
alphaPreference, alphaConfidence := 1, 2
1919
beta := 2
20+
terminationConditions := newSingleTerminationCondition(alphaConfidence, beta)
2021

21-
sf := newBinarySnowflake(alphaPreference, alphaConfidence, beta, red)
22+
sf := newBinarySnowflake(alphaPreference, terminationConditions, red)
2223

2324
require.Equal(red, sf.Preference())
2425
require.False(sf.Finalized())
@@ -50,3 +51,44 @@ func TestBinarySnowflake(t *testing.T) {
5051
require.Equal(blue, sf.Preference())
5152
require.True(sf.Finalized())
5253
}
54+
55+
type binarySnowflakeTest struct {
56+
require *require.Assertions
57+
58+
binarySnowflake
59+
}
60+
61+
func newBinarySnowflakeTest(t *testing.T, alphaPreference int, terminationConditions []terminationCondition) snowflakeTest[int] {
62+
require := require.New(t)
63+
64+
return &binarySnowflakeTest{
65+
require: require,
66+
binarySnowflake: newBinarySnowflake(alphaPreference, terminationConditions, 0),
67+
}
68+
}
69+
70+
func (sf *binarySnowflakeTest) RecordPoll(count int, choice int) {
71+
sf.binarySnowflake.RecordPoll(count, choice)
72+
}
73+
74+
func (sf *binarySnowflakeTest) AssertEqual(expectedConfidences []int, expectedFinalized bool, expectedPreference int) {
75+
sf.require.Equal(expectedPreference, sf.Preference())
76+
sf.require.Equal(expectedConfidences, sf.binarySnowflake.confidence)
77+
sf.require.Equal(expectedFinalized, sf.Finalized())
78+
}
79+
80+
func TestBinarySnowflakeErrorDrivenSingleChoice(t *testing.T) {
81+
for _, test := range getErrorDrivenSnowflakeSingleChoiceSuite[int]() {
82+
t.Run(test.name, func(t *testing.T) {
83+
test.f(t, newBinarySnowflakeTest, 0)
84+
})
85+
}
86+
}
87+
88+
func TestBinarySnowflakeErrorDrivenMultiChoice(t *testing.T) {
89+
for _, test := range getErrorDrivenSnowflakeMultiChoiceSuite[int]() {
90+
t.Run(test.name, func(t *testing.T) {
91+
test.f(t, newBinarySnowflakeTest, 0, 1)
92+
})
93+
}
94+
}

snow/consensus/snowball/factory.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,23 @@ var (
1313
type snowballFactory struct{}
1414

1515
func (snowballFactory) NewNnary(params Parameters, choice ids.ID) Nnary {
16-
sb := newNnarySnowball(params.AlphaPreference, params.AlphaConfidence, params.Beta, choice)
16+
sb := newNnarySnowball(params.AlphaPreference, newSingleTerminationCondition(params.AlphaConfidence, params.Beta), choice)
1717
return &sb
1818
}
1919

2020
func (snowballFactory) NewUnary(params Parameters) Unary {
21-
sb := newUnarySnowball(params.AlphaPreference, params.AlphaConfidence, params.Beta)
21+
sb := newUnarySnowball(params.AlphaPreference, newSingleTerminationCondition(params.AlphaConfidence, params.Beta))
2222
return &sb
2323
}
2424

2525
type snowflakeFactory struct{}
2626

2727
func (snowflakeFactory) NewNnary(params Parameters, choice ids.ID) Nnary {
28-
sf := newNnarySnowflake(params.AlphaPreference, params.AlphaConfidence, params.Beta, choice)
28+
sf := newNnarySnowflake(params.AlphaPreference, newSingleTerminationCondition(params.AlphaConfidence, params.Beta), choice)
2929
return &sf
3030
}
3131

3232
func (snowflakeFactory) NewUnary(params Parameters) Unary {
33-
sf := newUnarySnowflake(params.AlphaPreference, params.AlphaConfidence, params.Beta)
33+
sf := newUnarySnowflake(params.AlphaPreference, newSingleTerminationCondition(params.AlphaConfidence, params.Beta))
3434
return &sf
3535
}

snow/consensus/snowball/flat_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,6 @@ func TestFlat(t *testing.T) {
5656
require.Equal(Green, f.Preference())
5757
require.True(f.Finalized())
5858

59-
expected := "SB(Preference = 2mcwQKiD8VEspmMJpL1dc7okQQ5dDVAWeCBZ7FWBFAbxpv3t7w, PreferenceStrength = 4, SF(Confidence = 2, Finalized = true, SL(Preference = 2mcwQKiD8VEspmMJpL1dc7okQQ5dDVAWeCBZ7FWBFAbxpv3t7w)))"
59+
expected := "SB(Preference = 2mcwQKiD8VEspmMJpL1dc7okQQ5dDVAWeCBZ7FWBFAbxpv3t7w, PreferenceStrength = 4, SF(Confidence = [2], Finalized = true, SL(Preference = 2mcwQKiD8VEspmMJpL1dc7okQQ5dDVAWeCBZ7FWBFAbxpv3t7w)))"
6060
require.Equal(expected, f.String())
6161
}

snow/consensus/snowball/nnary_snowball.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import (
1111

1212
var _ Nnary = (*nnarySnowball)(nil)
1313

14-
func newNnarySnowball(alphaPreference, alphaConfidence, beta int, choice ids.ID) nnarySnowball {
14+
func newNnarySnowball(alphaPreference int, terminationConditions []terminationCondition, choice ids.ID) nnarySnowball {
1515
return nnarySnowball{
16-
nnarySnowflake: newNnarySnowflake(alphaPreference, alphaConfidence, beta, choice),
16+
nnarySnowflake: newNnarySnowflake(alphaPreference, terminationConditions, choice),
1717
preference: choice,
1818
preferenceStrength: make(map[ids.ID]int),
1919
}

snow/consensus/snowball/nnary_snowball_test.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ func TestNnarySnowball(t *testing.T) {
1414

1515
alphaPreference, alphaConfidence := 1, 2
1616
beta := 2
17+
terminationConditions := newSingleTerminationCondition(alphaConfidence, beta)
1718

18-
sb := newNnarySnowball(alphaPreference, alphaConfidence, beta, Red)
19+
sb := newNnarySnowball(alphaPreference, terminationConditions, Red)
1920
sb.Add(Blue)
2021
sb.Add(Green)
2122

@@ -56,8 +57,9 @@ func TestVirtuousNnarySnowball(t *testing.T) {
5657

5758
alphaPreference, alphaConfidence := 1, 2
5859
beta := 1
60+
terminationConditions := newSingleTerminationCondition(alphaConfidence, beta)
5961

60-
sb := newNnarySnowball(alphaPreference, alphaConfidence, beta, Red)
62+
sb := newNnarySnowball(alphaPreference, terminationConditions, Red)
6163

6264
require.Equal(Red, sb.Preference())
6365
require.False(sb.Finalized())
@@ -72,8 +74,9 @@ func TestNarySnowballRecordUnsuccessfulPoll(t *testing.T) {
7274

7375
alphaPreference, alphaConfidence := 1, 2
7476
beta := 2
77+
terminationConditions := newSingleTerminationCondition(alphaConfidence, beta)
7578

76-
sb := newNnarySnowball(alphaPreference, alphaConfidence, beta, Red)
79+
sb := newNnarySnowball(alphaPreference, terminationConditions, Red)
7780
sb.Add(Blue)
7881

7982
require.Equal(Red, sb.Preference())
@@ -95,7 +98,7 @@ func TestNarySnowballRecordUnsuccessfulPoll(t *testing.T) {
9598
require.Equal(Blue, sb.Preference())
9699
require.True(sb.Finalized())
97100

98-
expected := "SB(Preference = TtF4d2QWbk5vzQGTEPrN48x6vwgAoAmKQ9cbp79inpQmcRKES, PreferenceStrength = 3, SF(Confidence = 2, Finalized = true, SL(Preference = TtF4d2QWbk5vzQGTEPrN48x6vwgAoAmKQ9cbp79inpQmcRKES)))"
101+
expected := "SB(Preference = TtF4d2QWbk5vzQGTEPrN48x6vwgAoAmKQ9cbp79inpQmcRKES, PreferenceStrength = 3, SF(Confidence = [2], Finalized = true, SL(Preference = TtF4d2QWbk5vzQGTEPrN48x6vwgAoAmKQ9cbp79inpQmcRKES)))"
99102
require.Equal(expected, sb.String())
100103

101104
for i := 0; i < 4; i++ {
@@ -111,8 +114,9 @@ func TestNarySnowballDifferentSnowflakeColor(t *testing.T) {
111114

112115
alphaPreference, alphaConfidence := 1, 2
113116
beta := 2
117+
terminationConditions := newSingleTerminationCondition(alphaConfidence, beta)
114118

115-
sb := newNnarySnowball(alphaPreference, alphaConfidence, beta, Red)
119+
sb := newNnarySnowball(alphaPreference, terminationConditions, Red)
116120
sb.Add(Blue)
117121

118122
require.Equal(Red, sb.Preference())

snow/consensus/snowball/nnary_snowflake.go

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,12 @@ import (
1111

1212
var _ Nnary = (*nnarySnowflake)(nil)
1313

14-
func newNnarySnowflake(alphaPreference, alphaConfidence, beta int, choice ids.ID) nnarySnowflake {
14+
func newNnarySnowflake(alphaPreference int, terminationConditions []terminationCondition, choice ids.ID) nnarySnowflake {
1515
return nnarySnowflake{
16-
nnarySlush: newNnarySlush(choice),
17-
alphaPreference: alphaPreference,
18-
terminationConditions: []terminationCondition{
19-
{
20-
alphaConfidence: alphaConfidence,
21-
beta: beta,
22-
},
23-
},
24-
confidence: make([]int, 1),
16+
nnarySlush: newNnarySlush(choice),
17+
alphaPreference: alphaPreference,
18+
terminationConditions: terminationConditions,
19+
confidence: make([]int, len(terminationConditions)),
2520
}
2621
}
2722

@@ -101,8 +96,8 @@ func (sf *nnarySnowflake) Finalized() bool {
10196
}
10297

10398
func (sf *nnarySnowflake) String() string {
104-
return fmt.Sprintf("SF(Confidence = %d, Finalized = %v, %s)",
105-
sf.confidence[0],
99+
return fmt.Sprintf("SF(Confidence = %v, Finalized = %v, %s)",
100+
sf.confidence,
106101
sf.finalized,
107102
&sf.nnarySlush)
108103
}

0 commit comments

Comments
 (0)