]> Sergey Matveev's repositories - btrtrc.git/commitdiff
dht: Include the sender of peers in the peer stream
authorMatt Joiner <anacrolix@gmail.com>
Mon, 17 Nov 2014 23:47:36 +0000 (17:47 -0600)
committerMatt Joiner <anacrolix@gmail.com>
Mon, 17 Nov 2014 23:47:36 +0000 (17:47 -0600)
client.go
cmd/dht-get-peers/main.go
dht/dht.go

index eff77f3e025086881ba4e09cb9137715dcc743a0..c3e99d0c511b934d255707980be8f3e6ad21c0de 100644 (file)
--- a/client.go
+++ b/client.go
@@ -1310,13 +1310,13 @@ func (cl *Client) announceTorrentDHT(t *torrent, impliedPort bool) {
                        select {
                        case <-nextScrape:
                                break getPeers
-                       case cps, ok := <-ps.Values:
+                       case v, ok := <-ps.Values:
                                if !ok {
                                        break getPeers
                                }
-                               peersFoundByDHT.Add(int64(len(cps)))
+                               peersFoundByDHT.Add(int64(len(v.Peers)))
                                err = cl.AddPeers(t.InfoHash, func() (ret []Peer) {
-                                       for _, cp := range cps {
+                                       for _, cp := range v.Peers {
                                                ret = append(ret, Peer{
                                                        IP:     cp.IP[:],
                                                        Port:   int(cp.Port),
index 550f958d65b65af7717b495dd73cfdf415fa9026..6fd582a169b9d6261e8647a89a3192175e68e961 100644 (file)
@@ -87,7 +87,7 @@ func init() {
        if err != nil {
                log.Fatalf("error loading table: %s", err)
        }
-       log.Printf("dht server on %s, ID is %q", s.LocalAddr(), s.IDString())
+       log.Printf("dht server on %s, ID is %x", s.LocalAddr(), s.IDString())
        setupSignals()
 }
 
@@ -138,8 +138,9 @@ getPeers:
                        log.Fatal(err)
                }
                go func() {
-                       for sl := range ps.Values {
-                               for _, p := range sl {
+                       for v := range ps.Values {
+                               log.Printf("received %d peers from %x", len(v.Peers), v.NodeInfo.ID)
+                               for _, p := range v.Peers {
                                        if _, ok := seen[p]; ok {
                                                continue
                                        }
index 094a6bc63cfeb757ea99ead0265f02375b810976..b8acae4b8fe857d132e31f19806c0d9e2c67c530 100644 (file)
@@ -691,9 +691,14 @@ func (s *Server) findNode(addr dHTAddr, targetID string) (t *transaction, err er
        return
 }
 
+type peerStreamValue struct {
+       Peers    []util.CompactPeer // Peers given in get_peers response.
+       NodeInfo                    // The node that gave the response.
+}
+
 type peerStream struct {
        mu     sync.Mutex
-       Values chan []util.CompactPeer
+       Values chan peerStreamValue
        stop   chan struct{}
 }
 
@@ -743,7 +748,7 @@ func extractValues(m Msg) (vs []util.CompactPeer) {
 
 func (s *Server) GetPeers(infoHash string) (ps *peerStream, err error) {
        ps = &peerStream{
-               Values: make(chan []util.CompactPeer),
+               Values: make(chan peerStreamValue),
                stop:   make(chan struct{}),
        }
        done := make(chan struct{})
@@ -761,8 +766,21 @@ func (s *Server) GetPeers(infoHash string) (ps *peerStream, err error) {
                        case m := <-t.Response:
                                vs := extractValues(m)
                                if vs != nil {
+                                       nodeInfo := NodeInfo{
+                                               Addr: t.remoteAddr,
+                                       }
+                                       id := func() string {
+                                               defer func() {
+                                                       recover()
+                                               }()
+                                               return m["r"].(map[string]interface{})["id"].(string)
+                                       }()
+                                       copy(nodeInfo.ID[:], id)
                                        select {
-                                       case ps.Values <- vs:
+                                       case ps.Values <- peerStreamValue{
+                                               Peers:    vs,
+                                               NodeInfo: nodeInfo,
+                                       }:
                                        case <-ps.stop:
                                        }
                                }