client.go | 22 +--------------------- connection.go | 21 +++++++++++++++++++++ torrent.go | 2 +- diff --git a/client.go b/client.go index dfa375dcc5cd27626131ddf305a4429f3077ed28..4b0d0ac43627e71b576ebe6f229b9cc1ed066a58 100644 --- a/client.go +++ b/client.go @@ -1009,26 +1009,6 @@ delete(cn.Requests, r) return true } -func (cl *Client) requestPendingMetadata(t *Torrent, c *connection) { - if t.haveInfo() { - return - } - if c.PeerExtensionIDs["ut_metadata"] == 0 { - // Peer doesn't support this. - return - } - // Request metadata pieces that we don't have in a random order. - var pending []int - for index := 0; index < t.metadataPieceCount(); index++ { - if !t.haveMetadataPiece(index) && !c.requestedMetadataPiece(index) { - pending = append(pending, index) - } - } - for _, i := range mathRand.Perm(len(pending)) { - c.requestMetadataPiece(pending[i]) - } -} - // Process incoming ut_metadata message. func (cl *Client) gotMetadataExtensionMsg(payload []byte, t *Torrent, c *connection) (err error) { var d map[string]int @@ -1268,7 +1248,7 @@ t.setMetadataSize(metadata_size, cl) } } if _, ok := c.PeerExtensionIDs["ut_metadata"]; ok { - cl.requestPendingMetadata(t, c) + c.requestPendingMetadata() } case metadataExtendedId: err = cl.gotMetadataExtensionMsg(msg.ExtendedPayload, t, c) diff --git a/connection.go b/connection.go index 6e0edf2b62e5fd72f1b4678d97dd67c28dc8ad93..9264c3f7c98b847d3db14aa619b4bc7804ed4379 100644 --- a/connection.go +++ b/connection.go @@ -8,6 +8,7 @@ "errors" "expvar" "fmt" "io" + "math/rand" "net" "strconv" "sync" @@ -617,3 +618,23 @@ cn.peerHasAll = false cn.peerPiecesChanged() return nil } + +func (c *connection) requestPendingMetadata() { + if c.t.haveInfo() { + return + } + if c.PeerExtensionIDs["ut_metadata"] == 0 { + // Peer doesn't support this. + return + } + // Request metadata pieces that we don't have in a random order. + var pending []int + for index := 0; index < c.t.metadataPieceCount(); index++ { + if !c.t.haveMetadataPiece(index) && !c.requestedMetadataPiece(index) { + pending = append(pending, index) + } + } + for _, i := range rand.Perm(len(pending)) { + c.requestMetadataPiece(pending[i]) + } +} diff --git a/torrent.go b/torrent.go index 68937544f9740a8d0233cf06c248a82933ab7853..2f76ab9356eb914db75f41236582460bd088662e 100644 --- a/torrent.go +++ b/torrent.go @@ -290,7 +290,7 @@ } t.metadataBytes = make([]byte, bytes) t.metadataCompletedChunks = make([]bool, (bytes+(1<<14)-1)/(1<<14)) for _, c := range t.conns { - cl.requestPendingMetadata(t, c) + c.requestPendingMetadata() } }