@@ -36,6 +36,13 @@ type crawler struct {
36
36
revalidateInterval time.Duration
37
37
}
38
38
39
+ const (
40
+ nodeRemoved = iota
41
+ nodeIgnoredRecent
42
+ nodeSkipped
43
+ nodeUpdated
44
+ )
45
+
39
46
type resolver interface {
40
47
RequestENR (* enode.Node ) (* enode.Node , error )
41
48
}
@@ -63,19 +70,36 @@ func (c *crawler) run(timeout time.Duration) nodeSet {
63
70
var (
64
71
timeoutTimer = time .NewTimer (timeout )
65
72
timeoutCh <- chan time.Time
73
+ statusTicker = time .NewTicker (time .Second * 8 )
66
74
doneCh = make (chan enode.Iterator , len (c .iters ))
67
75
liveIters = len (c .iters )
68
76
)
69
77
defer timeoutTimer .Stop ()
78
+ defer statusTicker .Stop ()
70
79
for _ , it := range c .iters {
71
80
go c .runIterator (doneCh , it )
72
81
}
73
82
83
+ var (
84
+ updates int
85
+ ignored int
86
+ skips int
87
+ removals int
88
+ )
74
89
loop:
75
90
for {
76
91
select {
77
92
case n := <- c .ch :
78
- c .updateNode (n )
93
+ switch c .updateNode (n ) {
94
+ case nodeIgnoredRecent :
95
+ ignored ++
96
+ case nodeSkipped :
97
+ skips ++
98
+ case nodeRemoved :
99
+ removals ++
100
+ default :
101
+ updates ++
102
+ }
79
103
case it := <- doneCh :
80
104
if it == c .inputIter {
81
105
// Enable timeout when we're done revalidating the input nodes.
@@ -89,6 +113,10 @@ loop:
89
113
}
90
114
case <- timeoutCh :
91
115
break loop
116
+ case <- statusTicker .C :
117
+ log .Info ("Crawling in progress" ,
118
+ "updated" , updates , "removals" , removals ,
119
+ "ignored (recently checked)" , ignored , "ignored (no EIP-868)" , skips )
92
120
}
93
121
}
94
122
@@ -113,12 +141,14 @@ func (c *crawler) runIterator(done chan<- enode.Iterator, it enode.Iterator) {
113
141
}
114
142
}
115
143
116
- func (c * crawler ) updateNode (n * enode.Node ) {
144
+ // updateNode updates the info about the given node, and returns a status
145
+ // about what changed
146
+ func (c * crawler ) updateNode (n * enode.Node ) int {
117
147
node , ok := c .output [n .ID ()]
118
148
119
149
// Skip validation of recently-seen nodes.
120
150
if ok && time .Since (node .LastCheck ) < c .revalidateInterval {
121
- return
151
+ return nodeIgnoredRecent
122
152
}
123
153
124
154
// Request the node record.
@@ -128,7 +158,7 @@ func (c *crawler) updateNode(n *enode.Node) {
128
158
if node .Score == 0 {
129
159
// Node doesn't implement EIP-868.
130
160
log .Debug ("Skipping node" , "id" , n .ID ())
131
- return
161
+ return nodeSkipped
132
162
}
133
163
node .Score /= 2
134
164
} else {
@@ -143,12 +173,13 @@ func (c *crawler) updateNode(n *enode.Node) {
143
173
144
174
// Store/update node in output set.
145
175
if node .Score <= 0 {
146
- log .Info ("Removing node" , "id" , n .ID ())
176
+ log .Debug ("Removing node" , "id" , n .ID ())
147
177
delete (c .output , n .ID ())
148
- } else {
149
- log .Info ("Updating node" , "id" , n .ID (), "seq" , n .Seq (), "score" , node .Score )
150
- c .output [n .ID ()] = node
178
+ return nodeRemoved
151
179
}
180
+ log .Debug ("Updating node" , "id" , n .ID (), "seq" , n .Seq (), "score" , node .Score )
181
+ c .output [n .ID ()] = node
182
+ return nodeUpdated
152
183
}
153
184
154
185
func truncNow () time.Time {
0 commit comments