"errors"
"fmt"
"io"
- "math/rand"
"os"
"path/filepath"
"sort"
type store struct {
baseDir string
capacity int64
- completed map[string]struct{}
+ completed map[[20]byte]struct{}
}
func (me *store) OpenTorrent(info *metainfo.Info) dataPkg.Data {
return s
}
+func hexStringPieceHashArray(s string) (ret [20]byte) {
+ if len(s) != 40 {
+ panic(s)
+ }
+ n, err := hex.Decode(ret[:], []byte(s))
+ if err != nil {
+ panic(err)
+ }
+ if n != 20 {
+ panic(n)
+ }
+ return
+}
+
func (me *store) initCompleted() {
fis, err := me.readCompletedDir()
if err != nil {
panic(err)
}
- me.completed = make(map[string]struct{}, len(fis))
+ me.completed = make(map[[20]byte]struct{}, len(fis))
for _, fi := range fis {
- me.completed[fi.Name()] = struct{}{}
+ if len(fi.Name()) != 40 {
+ continue
+ }
+ me.completed[hexStringPieceHashArray(fi.Name())] = struct{}{}
}
}
}(), fmt.Sprintf("%x", p.Hash()))
}
+func sliceToPieceHashArray(b []byte) (ret [20]byte) {
+ n := copy(ret[:], b)
+ if n != 20 {
+ panic(n)
+ }
+ return
+}
+
func (me *store) pieceComplete(p metainfo.Piece) bool {
- _, ok := me.completed[hex.EncodeToString(p.Hash())]
+ _, ok := me.completed[sliceToPieceHashArray(p.Hash())]
return ok
}
if err != nil {
return err
}
- delete(me.completed, name)
+ delete(me.completed, hexStringPieceHashArray(name))
return
}
return
}
os.Remove(incompletePiecePath)
- me.completed[hex.EncodeToString(p.Hash())] = struct{}{}
+ me.completed[sliceToPieceHashArray(p.Hash())] = struct{}{}
return
}
return false
}
p := t.Pieces[index]
- return !t.pieceComplete(index) && p.Priority != piecePriorityNone && !p.QueuedForHash && !p.Hashing
+ // Put piece complete check last, since it's the slowest!
+ return p.Priority != piecePriorityNone && !p.QueuedForHash && !p.Hashing && !t.pieceComplete(index)
}
func (t *torrent) connHasWantedPieces(c *connection) bool {
- for p := range t.Pieces {
- if t.wantPiece(p) && c.PeerHasPiece(p) {
- return true
- }
- }
- return false
+ return c.pieceRequestOrder != nil && c.pieceRequestOrder.First() != nil
}
func (t *torrent) extentPieces(off, _len int64) (pieces []int) {