]> Sergey Matveev's repositories - btrtrc.git/blobdiff - misc.go
Shuffle chunk spec request order for readahead pieces
[btrtrc.git] / misc.go
diff --git a/misc.go b/misc.go
index 2e5f02bb8a24c0c86fb3baae343ba06ea4c8cd5e..c53976fab111780ed960fa0e54e983c2b46c78ed 100644 (file)
--- a/misc.go
+++ b/misc.go
@@ -4,6 +4,7 @@ import (
        "bitbucket.org/anacrolix/go.torrent/mmap_span"
        "crypto"
        "errors"
+       "math/rand"
        "os"
        "path/filepath"
        "time"
@@ -15,7 +16,7 @@ import (
 
 const (
        pieceHash   = crypto.SHA1
-       maxRequests = 250 // Maximum pending requests we allow peers to send us.
+       maxRequests = 250        // Maximum pending requests we allow peers to send us.
        chunkSize   = 0x4000     // 16KiB
        BEP20       = "-GT0000-" // Peer ID client identifier prefix
        dialTimeout = time.Second * 15
@@ -46,6 +47,18 @@ type piece struct {
        EverHashed        bool
 }
 
+func (p *piece) shuffledPendingChunkSpecs() (css []chunkSpec) {
+       css = make([]chunkSpec, 0, len(p.PendingChunkSpecs))
+       for cs := range p.PendingChunkSpecs {
+               css = append(css, cs)
+       }
+       for i := range css {
+               j := rand.Intn(i + 1)
+               css[i], css[j] = css[j], css[i]
+       }
+       return
+}
+
 func (p *piece) Complete() bool {
        return len(p.PendingChunkSpecs) == 0 && p.EverHashed
 }