From 791cac2403bb11a73a1a0d9c34df7849323bd1f6 Mon Sep 17 00:00:00 2001 From: Balint Gabor Date: Fri, 12 Jan 2018 20:24:18 +0100 Subject: [PATCH] swarm/network: Streamer.Retrieve allows peer list to skip --- swarm/network/streamer.go | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/swarm/network/streamer.go b/swarm/network/streamer.go index c32039098e..7911161452 100644 --- a/swarm/network/streamer.go +++ b/swarm/network/streamer.go @@ -273,8 +273,8 @@ func (self *StreamerPeer) handleRetrieveRequestMsg(req *RetrieveRequestMsg) erro streamer := s.OutgoingStreamer.(*RetrieveRequestStreamer) if chunk.ReqC != nil { if created { - if err := self.streamer.Retrieve(chunk); err != nil { - return err + if err := self.streamer.Retrieve(chunk, self.ID()); err != nil { + return nil } } go func() { @@ -299,16 +299,27 @@ func (self *StreamerPeer) handleRetrieveRequestMsg(req *RetrieveRequestMsg) erro } // Retrieve sends a chunk retrieve request to -func (self *Streamer) Retrieve(chunk *storage.Chunk) error { +func (self *Streamer) Retrieve(chunk *storage.Chunk, peersToSkip ...discover.NodeID) error { + var success bool self.overlay.EachConn(chunk.Key[:], 255, func(p OverlayConn, po int, nn bool) bool { - sp := p.(*StreamerPeer) + spId := p.(Peer).ID() + for _, p := range peersToSkip { + if p == spId { + return true + } + } + sp := self.getPeer(spId) // TODO: skip light nodes that do not accept retrieve requests sp.SendPriority(&RetrieveRequestMsg{ Key: chunk.Key[:], }, Top) + success = true return false }) - return nil + if success { + return nil + } + return errors.New("no peer found") } func (self *Streamer) getPeer(peerId discover.NodeID) *StreamerPeer { @@ -391,6 +402,7 @@ func (self *StreamerPeer) setOutgoingStreamer(s string, o OutgoingStreamer, prio os := &outgoingStreamer{ OutgoingStreamer: o, priority: priority, + stream: s, } self.outgoing[s] = os return os, nil