diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java index d4bc3b346..66399aa34 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java @@ -229,12 +229,9 @@ class PeerConnectionOut implements Runnable /** * Adds a message to the sendQueue and notifies the method waiting * on the sendQueue to change. - * If a PIECE message only, add a timeout. */ private void addMessage(Message m) { - if (m.type == Message.PIECE) - SimpleScheduler.getInstance().addEvent(new RemoveTooSlow(m), SEND_TIMEOUT); synchronized(sendQueue) { sendQueue.add(m); @@ -430,7 +427,11 @@ class PeerConnectionOut implements Runnable return total; } - /** @since 0.8.2 */ + /** + * Queue a piece message with a callback to load the data + * from disk when required. + * @since 0.8.2 + */ void sendPiece(int piece, int begin, int length, DataLoader loader) { boolean sendNow = false; @@ -457,6 +458,11 @@ class PeerConnectionOut implements Runnable addMessage(m); } + /** + * Queue a piece message with the data already loaded from disk + * Also add a timeout. + * We don't use this anymore. + */ void sendPiece(int piece, int begin, int length, byte[] bytes) { Message m = new Message(); @@ -467,6 +473,8 @@ class PeerConnectionOut implements Runnable m.data = bytes; m.off = 0; m.len = length; + // since we have the data already loaded, queue a timeout to remove it + SimpleScheduler.getInstance().addEvent(new RemoveTooSlow(m), SEND_TIMEOUT); addMessage(m); } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java index 0967f2461..bcff20a9d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java @@ -75,7 +75,9 @@ public class PeerCoordinator implements PeerListener private final byte[] id; - // Some random wanted pieces + /** The wanted pieces. We could use a TreeSet but we'd have to clear and re-add everything + * when priorities change. + */ private final List wantedPieces; /** partial pieces - lock by synching on wantedPieces */ diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java index 38ed62029..4db84ad68 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java @@ -110,6 +110,9 @@ class PeerState implements DataLoader if (choked) { out.cancelRequestMessages(); // old Roberts thrash us here, choke+unchoke right together + // The only problem with returning the partials to the coordinator + // is that chunks above a missing request are lost. + // Future enhancements to PartialPiece could keep track of the holes. List pcs = returnPartialPieces(); if (!pcs.isEmpty()) { if (_log.shouldLog(Log.DEBUG))