]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Miscellaneous changes
authorMatt Joiner <anacrolix@gmail.com>
Tue, 2 Jun 2015 14:03:43 +0000 (00:03 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Tue, 2 Jun 2015 14:03:43 +0000 (00:03 +1000)
client.go
connection.go
torrent.go

index 7e743b8f711519e723e45377642977395a3e5412..9f7051a5c29963e0980a5c707ac64b91094d31e1 100644 (file)
--- a/client.go
+++ b/client.go
@@ -1444,7 +1444,7 @@ func (me *Client) connectionLoop(t *torrent, c *connection) error {
                case pp.Have:
                        me.peerGotPiece(t, c, int(msg.Index))
                case pp.Request:
-                       if me.config.NoUpload {
+                       if c.Choked {
                                break
                        }
                        request := newRequest(msg.Index, msg.Begin, msg.Length)
@@ -1456,6 +1456,7 @@ func (me *Client) connectionLoop(t *torrent, c *connection) error {
                        // }
                        p := make([]byte, msg.Length)
                        n, err := dataReadAt(t.data, p, int64(t.pieceLength(0))*int64(msg.Index)+int64(msg.Begin))
+                       // TODO: Failing to read for a request should not be fatal to the connection.
                        if err != nil {
                                return fmt.Errorf("reading t data to serve request %q: %s", request, err)
                        }
@@ -1771,6 +1772,10 @@ func (me *Client) addPeers(t *torrent, peers []Peer) {
                if me.ipBlockRange(p.IP) != nil {
                        continue
                }
+               if p.Port == 0 {
+                       log.Printf("got bad peer: %v", p)
+                       continue
+               }
                t.addPeer(p)
        }
        me.openNewConns(t)
@@ -2498,7 +2503,8 @@ func (me *Client) downloadedChunk(t *torrent, c *connection, msg *pp.Message) er
        // Write the chunk out.
        err := t.writeChunk(int(msg.Index), int64(msg.Begin), msg.Piece)
        if err != nil {
-               return fmt.Errorf("error writing chunk: %s", err)
+               log.Printf("error writing chunk: %s", err)
+               return nil
        }
 
        // log.Println("got chunk", req)
@@ -2531,12 +2537,10 @@ func (me *Client) pieceHashed(t *torrent, piece pp.Integer, correct bool) {
        }
        p.EverHashed = true
        if correct {
-               if sd, ok := t.data.(StatefulData); ok {
-                       err := sd.PieceCompleted(int(piece))
-                       if err != nil {
-                               log.Printf("error completing piece: %s", err)
-                               correct = false
-                       }
+               err := t.data.PieceCompleted(int(piece))
+               if err != nil {
+                       log.Printf("error completing piece: %s", err)
+                       correct = false
                }
        }
        me.pieceChanged(t, int(piece))
index 51034e9319927cf5cb33eb6dcdd81d94e22dd971..943e1a7cfcc29271dd99c499739678bedeedee54 100644 (file)
@@ -385,6 +385,7 @@ func (c *connection) Choke() {
        c.Post(pp.Message{
                Type: pp.Choke,
        })
+       c.PeerRequests = nil
        c.Choked = true
 }
 
index 2fa69be3b545610a64a4fbdd40292578e4049fcb..ef82e992f604f7f0f6e08221ecd5e7b1a987427d 100644 (file)
@@ -545,7 +545,10 @@ func (t *torrent) offsetRequest(off int64) (req request, ok bool) {
 }
 
 func (t *torrent) writeChunk(piece int, begin int64, data []byte) (err error) {
-       _, err = t.data.WriteAt(data, int64(piece)*t.Info.PieceLength+begin)
+       n, err := t.data.WriteAt(data, int64(piece)*t.Info.PieceLength+begin)
+       if err == nil && n != len(data) {
+               err = io.ErrShortWrite
+       }
        return
 }