From 8df2a2d00ab2b00026013d98abdc2e8ab30b494f Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sun, 14 Oct 2012 16:38:36 +0000 Subject: [PATCH] * i2psnark: Fix request tracking bug preventing piece requests --- .../src/org/klomp/snark/PeerCoordinator.java | 17 ++++++++++++++--- .../java/src/org/klomp/snark/PeerState.java | 5 +++++ .../java/src/org/klomp/snark/Piece.java | 18 ++++++++++++++++-- history.txt | 5 +++++ .../java/src/net/i2p/router/RouterVersion.java | 2 +- 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java index 2869193a0a..8ffde7363b 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java @@ -215,7 +215,7 @@ class PeerCoordinator implements PeerListener public Storage getStorage() { return storage; } - // for web page detailed stats + /** for web page detailed stats */ public List<Peer> peerList() { return new ArrayList(peers); @@ -446,6 +446,12 @@ class PeerCoordinator implements PeerListener synchronized (downloaded_old) { Arrays.fill(downloaded_old, 0); } + // failsafe + synchronized(wantedPieces) { + for (Piece pc : wantedPieces) { + pc.clear(); + } + } timer.schedule((CHECK_PERIOD / 2) + _random.nextInt((int) CHECK_PERIOD)); } @@ -750,8 +756,12 @@ class PeerCoordinator implements PeerListener // AND if there are almost no wanted pieces left (real end game). // If we do end game all the time, we generate lots of extra traffic // when the seeder is super-slow and all the peers are "caught up" - if (wantedSize > END_GAME_THRESHOLD) + if (wantedSize > END_GAME_THRESHOLD) { + if (_log.shouldLog(Log.INFO)) + _log.info("Nothing to request, " + requested.size() + " being requested and " + + wantedSize + " still wanted"); return null; // nothing to request and not in end game + } // let's not all get on the same piece // Even better would be to sort by number of requests if (record) @@ -1078,10 +1088,11 @@ class PeerCoordinator implements PeerListener /** Called when a peer is removed, to prevent it from being used in * rarest-first calculations. */ - public void removePeerFromPieces(Peer peer) { + private void removePeerFromPieces(Peer peer) { synchronized(wantedPieces) { for (Piece piece : wantedPieces) { piece.removePeer(peer); + piece.setRequested(peer, false); } } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java index 8f80d44964..95bef3c4f9 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java @@ -682,6 +682,7 @@ class PeerState implements DataLoader _log.debug(peer + " addRequest() we are choked, delaying requestNextPiece()"); return; } + // huh? rv unused more_pieces = requestNextPiece(); } else if (more_pieces) // We want something { @@ -711,6 +712,8 @@ class PeerState implements DataLoader } // failsafe + // However this is bad as it thrashes the peer when we change our mind + // Ticket 691 cause here? if (interesting && lastRequest == null && outstandingRequests.isEmpty()) setInteresting(false); @@ -784,6 +787,8 @@ class PeerState implements DataLoader } // failsafe + // However this is bad as it thrashes the peer when we change our mind + // Ticket 691 cause here? if (outstandingRequests.isEmpty()) lastRequest = null; diff --git a/apps/i2psnark/java/src/org/klomp/snark/Piece.java b/apps/i2psnark/java/src/org/klomp/snark/Piece.java index 3ca03ad988..9a2e2e0e75 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Piece.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Piece.java @@ -12,7 +12,7 @@ class Piece implements Comparable { private final int id; private final Set<PeerID> peers; /** @since 0.8.3 */ - private Set<PeerID> requests; + private volatile Set<PeerID> requests; /** @since 0.8.1 */ private int priority; @@ -54,7 +54,10 @@ class Piece implements Comparable { /** caller must synchronize */ public boolean addPeer(Peer peer) { return this.peers.add(peer.getPeerID()); } - /** caller must synchronize */ + /** + * Caller must synchronize. + * @return true if removed + */ public boolean removePeer(Peer peer) { return this.peers.remove(peer.getPeerID()); } /** @@ -104,6 +107,17 @@ class Piece implements Comparable { public int getRequestCount() { return this.requests == null ? 0 : this.requests.size(); } + + /** + * Clear all knowledge of peers + * Caller must synchronize + * @since 0.9.3 + */ + public void clear() { + peers.clear(); + if (requests != null) + requests.clear(); + } /** @return default 0 @since 0.8.1 */ public int getPriority() { return this.priority; } diff --git a/history.txt b/history.txt index 191680e4ba..e10156df61 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,8 @@ +2012-10-14 zzz + * Console: Use non-nio connector for Java 5 and JamVM/gij + (tickets #715 and #743) + * i2psnark: Fix request tracking bug preventing piece requests + 2012-10-11 kytv * Italian translation updates from Transifex * i2prouter: diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 31c35f8c3e..ea17ad55f3 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 14; + public final static long BUILD = 15; /** for example "-test" */ public final static String EXTRA = ""; -- GitLab