41
41
)
42
42
43
43
const (
44
- autoRefreshInterval = 1 * time .Hour
45
- seedCount = 30
46
- seedMaxAge = 5 * 24 * time .Hour
44
+ autoRefreshInterval = 1 * time .Hour
45
+ bucketRefreshInterval = 1 * time .Minute
46
+ seedCount = 30
47
+ seedMaxAge = 5 * 24 * time .Hour
47
48
)
48
49
49
50
const testTopic = "foo"
@@ -82,7 +83,6 @@ type Network struct {
82
83
tableOpResp chan struct {}
83
84
topicRegisterReq chan topicRegisterReq
84
85
topicSearchReq chan topicSearchReq
85
- bucketFillChn chan chan struct {}
86
86
87
87
// State of the main loop.
88
88
tab * Table
@@ -169,7 +169,6 @@ func newNetwork(conn transport, ourPubkey ecdsa.PublicKey, natm nat.Interface, d
169
169
queryReq : make (chan * findnodeQuery ),
170
170
topicRegisterReq : make (chan topicRegisterReq ),
171
171
topicSearchReq : make (chan topicSearchReq ),
172
- bucketFillChn : make (chan chan struct {}, 1 ),
173
172
nodes : make (map [NodeID ]* Node ),
174
173
}
175
174
go net .loop ()
@@ -353,8 +352,9 @@ func (net *Network) reqTableOp(f func()) (called bool) {
353
352
354
353
func (net * Network ) loop () {
355
354
var (
356
- refreshTimer = time .NewTicker (autoRefreshInterval )
357
- refreshDone chan struct {} // closed when the 'refresh' lookup has ended
355
+ refreshTimer = time .NewTicker (autoRefreshInterval )
356
+ bucketRefreshTimer = time .NewTimer (bucketRefreshInterval )
357
+ refreshDone chan struct {} // closed when the 'refresh' lookup has ended
358
358
)
359
359
360
360
// Tracking the next ticket to register.
@@ -389,6 +389,7 @@ func (net *Network) loop() {
389
389
topicRegisterLookupDone chan []* Node
390
390
topicRegisterLookupTick = time .NewTimer (0 )
391
391
topicSearchLookupTarget lookupInfo
392
+ searchReqWhenRefreshDone []topicSearchReq
392
393
)
393
394
topicSearchLookupDone := make (chan []* Node , 1 )
394
395
<- topicRegisterLookupTick .C
@@ -406,6 +407,7 @@ loop:
406
407
407
408
// Ingress packet handling.
408
409
case pkt := <- net .read :
410
+ //fmt.Println("read", pkt.ev)
409
411
debugLog ("<-net.read" )
410
412
n := net .internNode (& pkt )
411
413
prestate := n .state
@@ -503,14 +505,18 @@ loop:
503
505
net .conn .sendTopicRegister (nextTicket .t .node , nextTicket .t .topics , nextTicket .idx , nextTicket .t .pong )
504
506
505
507
case req := <- net .topicSearchReq :
506
- debugLog ("<-net.topicSearchReq" )
507
- if req .found == nil {
508
- net .ticketStore .removeSearchTopic (req .topic )
509
- continue
510
- }
511
- net .ticketStore .addSearchTopic (req .topic , req .found )
512
- if (topicSearchLookupTarget .target == common.Hash {}) {
513
- topicSearchLookupDone <- nil
508
+ if refreshDone == nil {
509
+ debugLog ("<-net.topicSearchReq" )
510
+ if req .found == nil {
511
+ net .ticketStore .removeSearchTopic (req .topic )
512
+ continue
513
+ }
514
+ net .ticketStore .addSearchTopic (req .topic , req .found )
515
+ if (topicSearchLookupTarget .target == common.Hash {}) {
516
+ topicSearchLookupDone <- nil
517
+ }
518
+ } else {
519
+ searchReqWhenRefreshDone = append (searchReqWhenRefreshDone , req )
514
520
}
515
521
516
522
case nodes := <- topicSearchLookupDone :
@@ -519,7 +525,14 @@ loop:
519
525
net .ping (n , n .addr ())
520
526
return n .pingEcho
521
527
}, func (n * Node , topic Topic ) []byte {
522
- return net .conn .send (n , topicQueryPacket , topicQuery {Topic : topic }) // TODO: set expiration
528
+ if n .state == known {
529
+ return net .conn .send (n , topicQueryPacket , topicQuery {Topic : topic }) // TODO: set expiration
530
+ } else {
531
+ if n .state == unknown {
532
+ net .ping (n , n .addr ())
533
+ }
534
+ return nil
535
+ }
523
536
})
524
537
topicSearchLookupTarget = net .ticketStore .nextSearchLookup ()
525
538
target := topicSearchLookupTarget .target
@@ -564,9 +577,12 @@ loop:
564
577
refreshDone = make (chan struct {})
565
578
net .refresh (refreshDone )
566
579
}
567
- case doneChn := <- net .bucketFillChn :
568
- debugLog ("bucketFill" )
569
- net .bucketFill (doneChn )
580
+ case <- bucketRefreshTimer .C :
581
+ target := net .tab .chooseBucketRefreshTarget ()
582
+ go func () {
583
+ net .lookup (target , false )
584
+ bucketRefreshTimer .Reset (bucketRefreshInterval )
585
+ }()
570
586
case newNursery := <- net .refreshReq :
571
587
debugLog ("<-net.refreshReq" )
572
588
if newNursery != nil {
@@ -580,6 +596,13 @@ loop:
580
596
case <- refreshDone :
581
597
debugLog ("<-net.refreshDone" )
582
598
refreshDone = nil
599
+ list := searchReqWhenRefreshDone
600
+ searchReqWhenRefreshDone = nil
601
+ go func () {
602
+ for _ , req := range list {
603
+ net .topicSearchReq <- req
604
+ }
605
+ }()
583
606
}
584
607
}
585
608
debugLog ("loop stopped" )
@@ -643,28 +666,13 @@ func (net *Network) refresh(done chan<- struct{}) {
643
666
}()
644
667
}
645
668
646
- func (net * Network ) bucketFill (done chan <- struct {}) {
647
- target := net .tab .chooseBucketFillTarget ()
648
- go func () {
649
- net .lookup (target , false )
650
- close (done )
651
- }()
652
- }
653
-
654
- func (net * Network ) BucketFill () {
655
- done := make (chan struct {})
656
- select {
657
- case net .bucketFillChn <- done :
658
- <- done
659
- case <- net .closed :
660
- close (done )
661
- }
662
- }
663
-
664
669
// Node Interning.
665
670
666
671
func (net * Network ) internNode (pkt * ingressPacket ) * Node {
667
672
if n := net .nodes [pkt .remoteID ]; n != nil {
673
+ n .IP = pkt .remoteAddr .IP
674
+ n .UDP = uint16 (pkt .remoteAddr .Port )
675
+ n .TCP = uint16 (pkt .remoteAddr .Port )
668
676
return n
669
677
}
670
678
n := NewNode (pkt .remoteID , pkt .remoteAddr .IP , uint16 (pkt .remoteAddr .Port ), uint16 (pkt .remoteAddr .Port ))
@@ -967,8 +975,10 @@ func init() {
967
975
968
976
// handle processes packets sent by n and events related to n.
969
977
func (net * Network ) handle (n * Node , ev nodeEvent , pkt * ingressPacket ) error {
978
+ //fmt.Println("handle", n.addr().String(), n.state, ev)
970
979
if pkt != nil {
971
980
if err := net .checkPacket (n , ev , pkt ); err != nil {
981
+ //fmt.Println("check err:", err)
972
982
return err
973
983
}
974
984
// Start the background expiration goroutine after the first
@@ -985,6 +995,7 @@ func (net *Network) handle(n *Node, ev nodeEvent, pkt *ingressPacket) error {
985
995
}
986
996
next , err := n .state .handle (net , n , ev , pkt )
987
997
net .transition (n , next )
998
+ //fmt.Println("new state:", n.state)
988
999
return err
989
1000
}
990
1001
@@ -1040,6 +1051,11 @@ func (net *Network) abortTimedEvent(n *Node, ev nodeEvent) {
1040
1051
}
1041
1052
1042
1053
func (net * Network ) ping (n * Node , addr * net.UDPAddr ) {
1054
+ //fmt.Println("ping", n.addr().String(), n.ID.String(), n.sha.Hex())
1055
+ if n .pingEcho != nil || n .ID == net .tab .self .ID {
1056
+ //fmt.Println(" not sent")
1057
+ return
1058
+ }
1043
1059
debugLog (fmt .Sprintf ("ping(node = %x)" , n .ID [:8 ]))
1044
1060
n .pingTopics = net .ticketStore .regTopicSet ()
1045
1061
n .pingEcho = net .conn .sendPing (n , addr , n .pingTopics )
0 commit comments