* i2psnark:

- Send numwant=0 if we don't need peers
      - Report returned complete and incomplete counts
        if higher than peer count
      - Allow missing peer list
      - Log tweaks
This commit is contained in:
zzz
2010-03-25 19:05:45 +00:00
parent d3f1fe1c30
commit c8f97d9c73
2 changed files with 35 additions and 4 deletions

View File

@ -150,7 +150,7 @@ public class TrackerClient extends I2PAppThread
continue; continue;
String dest = _util.lookup(url.substring(7, slash)); String dest = _util.lookup(url.substring(7, slash));
if (dest == null) { if (dest == null) {
_log.error("Announce host unknown: [" + url + "]"); _log.error("Announce host unknown: [" + url.substring(7, slash) + "]");
continue; continue;
} }
if (primary.startsWith("http://" + dest)) if (primary.startsWith("http://" + dest))
@ -258,7 +258,7 @@ public class TrackerClient extends I2PAppThread
tr.started = true; tr.started = true;
Set peers = info.getPeers(); Set peers = info.getPeers();
tr.seenPeers = peers.size(); tr.seenPeers = info.getPeerCount();
if (coordinator.trackerSeenPeers < tr.seenPeers) // update rising number quickly if (coordinator.trackerSeenPeers < tr.seenPeers) // update rising number quickly
coordinator.trackerSeenPeers = tr.seenPeers; coordinator.trackerSeenPeers = tr.seenPeers;
if ( (left > 0) && (!completed) ) { if ( (left > 0) && (!completed) ) {
@ -269,6 +269,7 @@ public class TrackerClient extends I2PAppThread
Iterator it = ordered.iterator(); Iterator it = ordered.iterator();
while (it.hasNext()) { while (it.hasNext()) {
Peer cur = (Peer)it.next(); Peer cur = (Peer)it.next();
// FIXME if id == us || dest == us continue;
// only delay if we actually make an attempt to add peer // only delay if we actually make an attempt to add peer
if(coordinator.addPeer(cur)) { if(coordinator.addPeer(cur)) {
int delay = DELAY_MUL; int delay = DELAY_MUL;
@ -356,6 +357,10 @@ public class TrackerClient extends I2PAppThread
+ "&downloaded=" + downloaded + "&downloaded=" + downloaded
+ "&left=" + left + "&left=" + left
+ ((! event.equals(NO_EVENT)) ? ("&event=" + event) : ""); + ((! event.equals(NO_EVENT)) ? ("&event=" + event) : "");
if (left <= 0 || event.equals(STOPPED_EVENT) || !coordinator.needPeers())
s += "&numwant=0";
else
s += "&numwant=" + _util.getMaxConnections();
_util.debug("Sending TrackerClient request: " + s, Snark.INFO); _util.debug("Sending TrackerClient request: " + s, Snark.INFO);
tr.lastRequestTime = System.currentTimeMillis(); tr.lastRequestTime = System.currentTimeMillis();
@ -430,7 +435,7 @@ public class TrackerClient extends I2PAppThread
url.getPort() < 0; url.getPort() < 0;
} }
private class Tracker private static class Tracker
{ {
String announce; String announce;
boolean isPrimary; boolean isPrimary;

View File

@ -23,6 +23,7 @@ package org.klomp.snark;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.HashSet; import java.util.HashSet;
import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -37,6 +38,8 @@ public class TrackerInfo
private final String failure_reason; private final String failure_reason;
private final int interval; private final int interval;
private final Set peers; private final Set peers;
private int complete;
private int incomplete;
public TrackerInfo(InputStream in, byte[] my_id, MetaInfo metainfo) public TrackerInfo(InputStream in, byte[] my_id, MetaInfo metainfo)
throws IOException throws IOException
@ -68,11 +71,26 @@ public class TrackerInfo
throw new InvalidBEncodingException("No interval given"); throw new InvalidBEncodingException("No interval given");
else else
interval = beInterval.getInt(); interval = beInterval.getInt();
BEValue bePeers = (BEValue)m.get("peers"); BEValue bePeers = (BEValue)m.get("peers");
if (bePeers == null) if (bePeers == null)
throw new InvalidBEncodingException("No peer list"); peers = Collections.EMPTY_SET;
else else
peers = getPeers(bePeers.getList(), my_id, metainfo); peers = getPeers(bePeers.getList(), my_id, metainfo);
BEValue bev = (BEValue)m.get("complete");
if (bev != null) try {
complete = bev.getInt();
if (complete < 0)
complete = 0;
} catch (InvalidBEncodingException ibe) {}
bev = (BEValue)m.get("incomplete");
if (bev != null) try {
incomplete = bev.getInt();
if (incomplete < 0)
incomplete = 0;
} catch (InvalidBEncodingException ibe) {}
} }
} }
@ -115,6 +133,12 @@ public class TrackerInfo
return peers; return peers;
} }
public int getPeerCount()
{
int pc = peers == null ? 0 : peers.size();
return Math.max(pc, complete + incomplete - 1);
}
public String getFailureReason() public String getFailureReason()
{ {
return failure_reason; return failure_reason;
@ -132,6 +156,8 @@ public class TrackerInfo
return "TrackerInfo[FAILED: " + failure_reason + "]"; return "TrackerInfo[FAILED: " + failure_reason + "]";
else else
return "TrackerInfo[interval=" + interval return "TrackerInfo[interval=" + interval
+ (complete > 0 ? (", complete=" + complete) : "" )
+ (incomplete > 0 ? (", incomplete=" + incomplete) : "" )
+ ", peers=" + peers + "]"; + ", peers=" + peers + "]";
} }
} }