From 23e8a558c28a767a3e7db7156b9aac9eeb0e12e9 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 16 Sep 2006 21:07:28 +0000 Subject: [PATCH] (zzz) * i2psnark: Implement retransmission of requests. This eliminates one cause of complete stalls with a peer. This problem is common on torrents with a small number of active peers where there are no choke/unchokes to kickstart things. --- .../java/src/org/klomp/snark/Peer.java | 10 ++++++++++ .../src/org/klomp/snark/PeerCheckerTask.java | 1 + .../org/klomp/snark/PeerConnectionOut.java | 20 +++++++++++++++++++ .../java/src/org/klomp/snark/PeerState.java | 6 ++++++ .../java/src/org/klomp/snark/Request.java | 1 + history.txt | 8 +++++++- .../src/net/i2p/router/RouterVersion.java | 4 ++-- 7 files changed, 47 insertions(+), 3 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/Peer.java b/apps/i2psnark/java/src/org/klomp/snark/Peer.java index 39572fb3a8..7d066b150c 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Peer.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Peer.java @@ -477,4 +477,14 @@ public class Peer implements Comparable s.keepAlive(); } + /** + * Retransmit outstanding requests if necessary + */ + public void retransmitRequests() + { + PeerState s = state; + if (s != null) + s.retransmitRequests(); + } + } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java index 1efb25b4c2..2e0fdf9bae 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java @@ -164,6 +164,7 @@ class PeerCheckerTask extends TimerTask worstDownloader = peer; } } + peer.retransmitRequests(); peer.keepAlive(); } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java index ede9151583..bdebaa53ff 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java @@ -324,6 +324,23 @@ class PeerConnectionOut implements Runnable addMessage(m); } + /** reransmit requests not received in 7m */ + private static final int REQ_TIMEOUT = (2 * SEND_TIMEOUT) + (60 * 1000); + void retransmitRequests(List requests) + { + long now = System.currentTimeMillis(); + Iterator it = requests.iterator(); + while (it.hasNext()) + { + Request req = (Request)it.next(); + if(now > req.sendTime + REQ_TIMEOUT) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Retransmit request " + req + " to peer " + peer); + sendRequest(req); + } + } + } + void sendRequests(List requests) { Iterator it = requests.iterator(); @@ -336,12 +353,15 @@ class PeerConnectionOut implements Runnable void sendRequest(Request req) { + // should we check for duplicate requests to deal with fibrillating i2p-bt?? + // or just send some cancels when we get an unwanted chunk?? Message m = new Message(); m.type = Message.REQUEST; m.piece = req.piece; m.begin = req.off; m.length = req.len; addMessage(m); + req.sendTime = System.currentTimeMillis(); } void sendPiece(int piece, int begin, int length, byte[] bytes) diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java index e37dfb1a3c..ae4828d8d3 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java @@ -596,4 +596,10 @@ class PeerState { out.sendAlive(); } + + synchronized void retransmitRequests() + { + if (interesting && !choked) + out.retransmitRequests(outstandingRequests); + } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/Request.java b/apps/i2psnark/java/src/org/klomp/snark/Request.java index 2a07a42893..2560b761d6 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Request.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Request.java @@ -29,6 +29,7 @@ class Request final byte[] bs; final int off; final int len; + long sendTime; /** * Creates a new Request. diff --git a/history.txt b/history.txt index 0775aea60c..5279202b90 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,10 @@ -$Id: history.txt,v 1.520 2006-09-13 18:24:14 zzz Exp $ +$Id: history.txt,v 1.521 2006-09-13 21:37:33 zzz Exp $ + +2006-09-16 zzz + * i2psnark: Implement retransmission of requests. This + eliminates one cause of complete stalls with a peer. + This problem is common on torrents with a small number of + active peers where there are no choke/unchokes to kickstart things. 2006-09-13 zzz * i2psnark: Fix restoral of partial pieces broken by last patch diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 6e3147286c..9d495afeb0 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.457 $ $Date: 2006-09-13 18:02:07 $"; + public final static String ID = "$Revision: 1.458 $ $Date: 2006-09-13 21:37:32 $"; public final static String VERSION = "0.6.1.25"; - public final static long BUILD = 4; + public final static long BUILD = 5; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("Router ID: " + RouterVersion.ID);