52
52
leafMinSize = flag .Int ("leaf_min_size" , 0 , "Minimum size in bytes of individual leaves" )
53
53
dupChance = flag .Float64 ("dup_chance" , 0.1 , "The probability of a generated leaf being a duplicate of a previous value" )
54
54
55
+ leafWriteGoal = flag .Int64 ("leaf_write_goal" , 0 , "Exit after writing this number of leaves, or 0 to keep going indefinitely" )
56
+ maxRunTime = flag .Duration ("max_runtime" , 0 , "Fail after this amount of time has passed, or 0 to keep going indefinitely" )
57
+
55
58
showUI = flag .Bool ("show_ui" , true , "Set to false to disable the text-based UI" )
56
59
57
60
hc = & http.Client {
@@ -68,7 +71,7 @@ func main() {
68
71
klog .InitFlags (nil )
69
72
flag .Parse ()
70
73
71
- ctx := context .Background ()
74
+ ctx , cancel := context .WithCancel ( context . Background () )
72
75
73
76
logSigV , err := note .NewVerifier (* logPubKey )
74
77
if err != nil {
@@ -95,6 +98,45 @@ func main() {
95
98
96
99
gen := newLeafGenerator (tracker .LatestConsistent .Size , * leafMinSize , * dupChance )
97
100
hammer := NewHammer (& tracker , f .Fetch , w .Write , gen , ha .seqLeafChan , ha .errChan )
101
+
102
+ exitCode := 0
103
+ if * leafWriteGoal > 0 {
104
+ go func () {
105
+ startTime := time .Now ()
106
+ goal := tracker .LatestConsistent .Size + uint64 (* leafWriteGoal )
107
+ klog .Infof ("Will exit once tree size is at least %d" , goal )
108
+ tick := time .NewTicker (1 * time .Second )
109
+ for {
110
+ select {
111
+ case <- ctx .Done ():
112
+ return
113
+ case <- tick .C :
114
+ if tracker .LatestConsistent .Size >= goal {
115
+ elapsed := time .Since (startTime )
116
+ klog .Infof ("Reached tree size goal of %d after %s; exiting" , goal , elapsed )
117
+ cancel ()
118
+ return
119
+ }
120
+ }
121
+ }
122
+ }()
123
+ }
124
+ if * maxRunTime > 0 {
125
+ go func () {
126
+ klog .Infof ("Will fail after %s" , * maxRunTime )
127
+ for {
128
+ select {
129
+ case <- ctx .Done ():
130
+ return
131
+ case <- time .After (* maxRunTime ):
132
+ klog .Infof ("Max runtime reached; exiting" )
133
+ exitCode = 1
134
+ cancel ()
135
+ return
136
+ }
137
+ }
138
+ }()
139
+ }
98
140
hammer .Run (ctx )
99
141
100
142
if * showUI {
@@ -103,6 +145,7 @@ func main() {
103
145
} else {
104
146
<- ctx .Done ()
105
147
}
148
+ os .Exit (exitCode )
106
149
}
107
150
108
151
func NewHammer (tracker * client.LogStateTracker , f client.Fetcher , w LeafWriter , gen func () []byte , seqLeafChan chan <- leafTime , errChan chan <- error ) * Hammer {
0 commit comments