if n != len(b) {
panic("didn't write all bytes")
}
- log.Printf("wrote %#v", string(b))
}
}
return len(t.MetaInfo.Pieces) / PieceHash.Size()
}
+func (t *Torrent) NumPiecesCompleted() (num int) {
+ for _, p := range t.Pieces {
+ if p.Complete() {
+ num++
+ }
+ }
+ return
+}
+
func (t *Torrent) Length() int64 {
return int64(t.PieceLength(peer_protocol.Integer(len(t.Pieces)-1))) + int64(len(t.Pieces)-1)*int64(t.PieceLength(0))
}
if len(newPriorities) == 0 {
return
}
- log.Print(newPriorities)
if t.Priorities == nil {
t.Priorities = list.New()
}
Begin: 0,
}
cs := piece.PendingChunkSpecs
- log.Print(index, t.PieceLength(index))
for left := peer_protocol.Integer(t.PieceLength(index)); left != 0; left -= c.Length {
c.Length = left
if c.Length > chunkSize {
}
var b [28]byte
_, err = io.ReadFull(conn.Socket, b[:])
+ if err == io.EOF {
+ return nil
+ }
if err != nil {
err = fmt.Errorf("when reading protocol and extensions: %s", err)
return
if 8 != copy(conn.PeerExtensions[:], b[20:]) {
panic("wtf")
}
- log.Printf("peer extensions: %#v", string(conn.PeerExtensions[:]))
+ // log.Printf("peer extensions: %#v", string(conn.PeerExtensions[:]))
var infoHash [20]byte
_, err = io.ReadFull(conn.Socket, infoHash[:])
if err != nil {
err := decoder.Decode(msg)
me.mu.Lock()
if err != nil {
- if me.stopped() {
+ if me.stopped() || err == io.EOF {
return nil
}
return err
if err != nil {
return err
}
- log.Print("replenishing from loop")
me.replenishConnRequests(torrent, conn)
}
}
piece := torrent.Pieces[req.Index]
if piece.Hashing {
// We can't be sure we want this.
- log.Print("piece is hashing")
return true
}
if piece.Complete() {
- log.Print("piece is complete")
// We already have this.
return true
}
if requestHeatMap[req] > 0 {
- log.Print("piece is hot")
// We've already requested this.
return true
}
// First request prioritized chunks.
if torrent.Priorities != nil {
for e := torrent.Priorities.Front(); e != nil; e = e.Next() {
- log.Print(e.Value.(Request))
if !addRequest(e.Value.(Request)) {
return
}
log.Printf("got unnecessary chunk: %s", request)
return
}
- log.Printf("got chunk %s", request)
err = torrent.WriteChunk(int(msg.Index), int64(msg.Begin), msg.Piece)
if err != nil {
return
p := t.Pieces[piece]
p.EverHashed = true
if correct {
- log.Print("piece passed hash")
p.PendingChunkSpecs = nil
+ log.Printf("got piece %d, (%d/%d)", piece, t.NumPiecesCompleted(), t.NumPieces())
var next *list.Element
if t.Priorities != nil {
for e := t.Priorities.Front(); e != nil; e = next {
},
})
} else {
- log.Print("piece failed hash")
if len(p.PendingChunkSpecs) == 0 {
t.pendAllChunkSpecs(piece)
}