-
Notifications
You must be signed in to change notification settings - Fork 669
/
binary_snowflake.go
61 lines (47 loc) · 1.5 KB
/
binary_snowflake.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Copyright (C) 2019-2021, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package snowball
import (
"fmt"
)
var _ BinarySnowflake = &binarySnowflake{}
// binarySnowflake is the implementation of a binary snowflake instance
type binarySnowflake struct {
// wrap the binary slush logic
binarySlush
// confidence tracks the number of successful polls in a row that have
// returned the preference
confidence int
// beta is the number of consecutive successful queries required for
// finalization.
beta int
// finalized prevents the state from changing after the required number of
// consecutive polls has been reached
finalized bool
}
func (sf *binarySnowflake) Initialize(beta, choice int) {
sf.binarySlush.Initialize(choice)
sf.beta = beta
}
func (sf *binarySnowflake) RecordSuccessfulPoll(choice int) {
if sf.finalized {
return // This instace is already decided.
}
if preference := sf.Preference(); preference == choice {
sf.confidence++
} else {
// confidence is set to 1 because there has already been 1 successful
// poll, namely this poll.
sf.confidence = 1
}
sf.finalized = sf.confidence >= sf.beta
sf.binarySlush.RecordSuccessfulPoll(choice)
}
func (sf *binarySnowflake) RecordUnsuccessfulPoll() { sf.confidence = 0 }
func (sf *binarySnowflake) Finalized() bool { return sf.finalized }
func (sf *binarySnowflake) String() string {
return fmt.Sprintf("SF(Confidence = %d, Finalized = %v, %s)",
sf.confidence,
sf.finalized,
&sf.binarySlush)
}