]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Ban peers for dirtying pieces if they are solely responsible
authorMatt Joiner <anacrolix@gmail.com>
Thu, 27 Jan 2022 04:09:05 +0000 (15:09 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 27 Jan 2022 04:09:05 +0000 (15:09 +1100)
torrent.go

index 22b4bb57dfe2e3d03560830042132ade17c71eae..d6ff2dbcd04d3f2f42ed05a69596d0b7f18d99aa 100644 (file)
@@ -2042,8 +2042,14 @@ func (t *Torrent) pieceHashed(piece pieceIndex, passed bool, hashIoErr error) {
 
                        if len(bannableTouchers) >= 1 {
                                c := bannableTouchers[0]
-                               log.Printf("would have banned %v for touching piece %v after failed piece check", c.remoteIp(), piece)
-                               if false {
+                               if len(bannableTouchers) != 1 {
+                                       t.logger.Levelf(log.Warning, "would have banned %v for touching piece %v after failed piece check", c.remoteIp(), piece)
+                               } else {
+                                       // Turns out it's still useful to ban peers like this because if there's only a
+                                       // single peer for a piece, and we never progress that piece to completion, we
+                                       // will never smart-ban them. Discovered in
+                                       // https://github.com/anacrolix/torrent/issues/715.
+                                       t.logger.Levelf(log.Warning, "banning %v for being sole dirtier of piece %v after failed piece check", c.remoteIp(), piece)
                                        t.cl.banPeerIP(c.remoteIp())
                                        c.drop()
                                }