From 9eb41e7237bbd66c64d7e4a8f32e9d1fca51f4e4 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet <juan@benet.ai> Date: Tue, 16 Sep 2014 01:09:34 -0700 Subject: [PATCH] ping + find peer --- routing/dht/Message.go | 18 ++++++++++++-- routing/dht/dht.go | 56 +++++++++++++++--------------------------- 2 files changed, 36 insertions(+), 38 deletions(-) diff --git a/routing/dht/Message.go b/routing/dht/Message.go index 210fd696..bf592799 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -3,9 +3,10 @@ package dht import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" ) -func peerInfo(p *peer.Peer) *Message_Peer { +func peerToPBPeer(p *peer.Peer) *Message_Peer { pbp := new(Message_Peer) if len(p.Addresses) == 0 || p.Addresses[0] == nil { pbp.Addr = proto.String("") @@ -22,11 +23,24 @@ func peerInfo(p *peer.Peer) *Message_Peer { return pbp } +func peersToPBPeers(peers []*peer.Peer) []*Message_Peer { + pbpeers = make([]*Message_Peer, len(peers)) + for i, p := range peers { + pbpeers[i] = peerToPBPeer(p) + } + return pbpeers +} + // GetClusterLevel gets and adjusts the cluster level on the message. // a +/- 1 adjustment is needed to distinguish a valid first level (1) and // default "no value" protobuf behavior (0) func (m *Message) GetClusterLevel() int32 { - return m.GetClusterLevelRaw() - 1 + level := m.GetClusterLevelRaw() - 1 + if level < 0 { + u.PErr("handleGetValue: no routing level specified, assuming 0\n") + level = 0 + } + return level } // SetClusterLevel adjusts and sets the cluster level on the message. diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 645ffb23..14484144 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -169,14 +169,14 @@ func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { return dht.handleGetValue // case Message_PUT_VALUE: // return dht.handlePutValue - // case Message_FIND_NODE: - // return dht.handleFindPeer + case Message_FIND_NODE: + return dht.handleFindPeer // case Message_ADD_PROVIDER: // return dht.handleAddProvider // case Message_GET_PROVIDERS: // return dht.handleGetProviders - // case Message_PING: - // return dht.handlePing + case Message_PING: + return dht.handlePing // case Message_DIAGNOSTIC: // return dht.handleDiagnostic default: @@ -240,7 +240,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error provs := dht.providers.GetProviders(u.Key(pmes.GetKey())) if len(provs) > 0 { u.DOut("handleGetValue returning %d provider[s]\n", len(provs)) - resp.ProviderPeers = provs + resp.ProviderPeers = peersToPBPeers(provs) return resp, nil } @@ -249,11 +249,6 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error // stored levels are > 1, to distinguish missing levels. level := pmes.GetClusterLevel() - if level < 0 { - // TODO: maybe return an error? Defaulting isnt a good idea IMO - u.PErr("handleGetValue: no routing level specified, assuming 0\n") - level = 0 - } u.DOut("handleGetValue searching level %d clusters\n", level) ck := kb.ConvertKey(u.Key(pmes.GetKey())) @@ -275,7 +270,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error // we got a closer peer, it seems. return it. u.DOut("handleGetValue returning a closer peer: '%s'\n", closer.ID.Pretty()) - resp.CloserPeers = []*peer.Peer{closer} + resp.CloserPeers = peersToPBPeers([]*peer.Peer{closer}) return resp, nil } @@ -291,48 +286,37 @@ func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *Message) { } } -func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *Message) { +func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *Message) (*Message, error) { u.DOut("[%s] Responding to ping from [%s]!\n", dht.self.ID.Pretty(), p.ID.Pretty()) - resp := Message{ - Type: pmes.GetType(), - Response: true, - ID: pmes.GetId(), - } - - dht.netChan.Outgoing <- swarm.NewMessage(p, resp.ToProtobuf()) + return &Message{Type: pmes.Type}, nil } -func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) { - resp := Message{ - Type: pmes.GetType(), - ID: pmes.GetId(), - Response: true, - } - defer func() { - mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.netChan.Outgoing <- mes - }() - level := pmes.GetValue()[0] +func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) (*Message, error) { + resp := &Message{Type: pmes.Type} + + level := pmes.GetClusterLevel() u.DOut("handleFindPeer: searching for '%s'\n", peer.ID(pmes.GetKey()).Pretty()) - closest := dht.routingTables[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) + + ck := kb.ConvertKey(u.Key(pmes.GetKey())) + closest := dht.routingTables[level].NearestPeer(ck) if closest == nil { u.PErr("handleFindPeer: could not find anything.\n") - return + return resp, nil } if len(closest.Addresses) == 0 { u.PErr("handleFindPeer: no addresses for connected peer...\n") - return + return resp, nil } // If the found peer further away than this peer... if kb.Closer(dht.self.ID, closest.ID, u.Key(pmes.GetKey())) { - return + return resp, nil } u.DOut("handleFindPeer: sending back '%s'\n", closest.ID.Pretty()) - resp.Peers = []*peer.Peer{closest} - resp.Success = true + resp.CloserPeers = peersToPBPeers([]*peer.Peer{closest}) + return resp, nil } func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *Message) { -- GitLab