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