diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java index 041387937def4805f64f966f4fb63b2ae3e4e1ad..90d772f68ce4c32c2bf9d34935f01a075f822a7b 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java @@ -69,6 +69,7 @@ class PeerCheckerTask extends TimerTask if (!peer.isConnected()) { it.remove(); + coordinator.removePeerFromPieces(peer); continue; } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java index 83c3329b6b796a6eb3feca590788a3562d211df3..51ea8ff028f187d4a4d063fefb8d56b363d3677e 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java @@ -153,6 +153,7 @@ public class PeerCoordinator implements PeerListener Peer peer = (Peer)it.next(); peer.disconnect(); it.remove(); + removePeerFromPieces(peer); } } } @@ -511,17 +512,23 @@ public class PeerCoordinator implements PeerListener { // Unchoke some random other peer unchokePeer(); - synchronized(wantedPieces) { - // Don't count disconnected peers for the rarest-first calculations - for(Iterator iter = wantedPieces.iterator(); iter.hasNext(); ) { - Piece piece = (Piece)iter.next(); - piece.removePeer(peer); - } - } + removePeerFromPieces(peer); } } if (listener != null) listener.peerChange(this, peer); } + + /** Called when a peer is removed, to prevent it from being used in + * rarest-first calculations. + */ + public void removePeerFromPieces(Peer peer) { + synchronized(wantedPieces) { + for(Iterator iter = wantedPieces.iterator(); iter.hasNext(); ) { + Piece piece = (Piece)iter.next(); + piece.removePeer(peer); + } + } + } }