2004-10-04 jrandom
* Update the shitlist to reject a peer for an exponentially increasing period of time (with an upper bounds of an hour). * Various minor stat and debugging fixes
This commit is contained in:
@ -68,7 +68,7 @@ public class BufferedStatLog implements StatLog {
|
||||
|
||||
private boolean shouldLog(String stat) {
|
||||
synchronized (_statFilters) {
|
||||
return _statFilters.contains(stat);
|
||||
return _statFilters.contains(stat) || _statFilters.contains("*");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,9 @@
|
||||
$Id: history.txt,v 1.30 2004/10/02 14:05:24 jrandom Exp $
|
||||
$Id: history.txt,v 1.31 2004/10/03 15:48:43 jrandom Exp $
|
||||
|
||||
2004-10-04 jrandom
|
||||
* Update the shitlist to reject a peer for an exponentially increasing
|
||||
period of time (with an upper bounds of an hour).
|
||||
* Various minor stat and debugging fixes
|
||||
|
||||
2004-10-03 jrandom
|
||||
* Add a new stat logging component to optionally dump the raw stats to
|
||||
|
@ -15,9 +15,9 @@ import net.i2p.CoreVersion;
|
||||
*
|
||||
*/
|
||||
public class RouterVersion {
|
||||
public final static String ID = "$Revision: 1.40 $ $Date: 2004/10/02 14:05:24 $";
|
||||
public final static String ID = "$Revision: 1.41 $ $Date: 2004/10/03 15:48:43 $";
|
||||
public final static String VERSION = "0.4.1.1";
|
||||
public final static long BUILD = 6;
|
||||
public final static long BUILD = 7;
|
||||
public static void main(String args[]) {
|
||||
System.out.println("I2P Router version: " + VERSION);
|
||||
System.out.println("Router ID: " + RouterVersion.ID);
|
||||
|
@ -16,6 +16,7 @@ import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import net.i2p.data.Hash;
|
||||
import net.i2p.router.peermanager.PeerProfile;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
@ -62,8 +63,16 @@ public class Shitlist {
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("Shitlisting router " + peer.toBase64(), new Exception("Shitlist cause"));
|
||||
|
||||
long period = SHITLIST_DURATION_MS;
|
||||
PeerProfile prof = _context.profileOrganizer().getProfile(peer);
|
||||
if (prof != null)
|
||||
period = SHITLIST_DURATION_MS << prof.incrementShitlists();
|
||||
|
||||
if (period > 60*60*1000)
|
||||
period = 60*60*1000;
|
||||
|
||||
synchronized (_shitlist) {
|
||||
Date oldDate = (Date)_shitlist.put(peer, new Date(_context.clock().now()));
|
||||
Date oldDate = (Date)_shitlist.put(peer, new Date(_context.clock().now() + period));
|
||||
wasAlready = (null == oldDate);
|
||||
if (reason != null) {
|
||||
_shitlistCause.put(peer, reason);
|
||||
@ -85,6 +94,9 @@ public class Shitlist {
|
||||
_shitlist.remove(peer);
|
||||
_shitlistCause.remove(peer);
|
||||
}
|
||||
PeerProfile prof = _context.profileOrganizer().getProfile(peer);
|
||||
if (prof != null)
|
||||
prof.unshitlist();
|
||||
}
|
||||
|
||||
public boolean isShitlisted(Hash peer) {
|
||||
@ -95,7 +107,7 @@ public class Shitlist {
|
||||
if (shitlistDate == null) return false;
|
||||
|
||||
// check validity
|
||||
if (shitlistDate.getTime() > _context.clock().now() - SHITLIST_DURATION_MS) {
|
||||
if (shitlistDate.getTime() > _context.clock().now()) {
|
||||
return true;
|
||||
} else {
|
||||
unshitlistRouter(peer);
|
||||
@ -115,7 +127,7 @@ public class Shitlist {
|
||||
shitlist = new HashMap(_shitlist);
|
||||
}
|
||||
|
||||
long limit = _context.clock().now() - SHITLIST_DURATION_MS;
|
||||
long limit = _context.clock().now();
|
||||
|
||||
for (Iterator iter = shitlist.keySet().iterator(); iter.hasNext(); ) {
|
||||
Hash key = (Hash)iter.next();
|
||||
@ -146,7 +158,7 @@ public class Shitlist {
|
||||
Date shitDate = (Date)shitlist.get(key);
|
||||
buf.append("<li><b>").append(key.toBase64()).append("</b>");
|
||||
buf.append(" <a href=\"netdb.jsp#").append(key.toBase64().substring(0, 6)).append("\">(?)</a>");
|
||||
buf.append(" was shitlisted on ");
|
||||
buf.append(" expiring on ");
|
||||
buf.append(shitDate);
|
||||
String cause = (String)causes.get(key);
|
||||
if (cause != null) {
|
||||
|
@ -44,6 +44,7 @@ public class PeerProfile {
|
||||
private DBHistory _dbHistory;
|
||||
// does this peer profile contain expanded data, or just the basics?
|
||||
private boolean _expanded;
|
||||
private int _consecutiveShitlists;
|
||||
|
||||
public PeerProfile(RouterContext context, Hash peer) {
|
||||
this(context, peer, true);
|
||||
@ -57,6 +58,7 @@ public class PeerProfile {
|
||||
_capacityValue = 0;
|
||||
_integrationValue = 0;
|
||||
_isFailing = false;
|
||||
_consecutiveShitlists = 0;
|
||||
_peer = peer;
|
||||
if (expand)
|
||||
expandProfile();
|
||||
@ -74,6 +76,9 @@ public class PeerProfile {
|
||||
*/
|
||||
public boolean getIsExpanded() { return _expanded; }
|
||||
|
||||
public int incrementShitlists() { return _consecutiveShitlists++; }
|
||||
public void unshitlist() { _consecutiveShitlists = 0; }
|
||||
|
||||
/**
|
||||
* Is this peer active at the moment (sending/receiving messages within the last
|
||||
* 5 minutes)
|
||||
|
@ -226,9 +226,9 @@ public abstract class TransportImpl implements Transport {
|
||||
}
|
||||
}
|
||||
|
||||
_context.statManager().addRateData("transport.sendProcessingTime", msg.getLifetime(), msg.getLifetime());
|
||||
|
||||
|
||||
if (sendSuccessful) {
|
||||
_context.statManager().addRateData("transport.sendProcessingTime", lifetime, lifetime);
|
||||
_context.profileManager().messageSent(msg.getTarget().getIdentity().getHash(), getStyle(), sendTime, msg.getMessageSize());
|
||||
_context.statManager().addRateData("transport.sendMessageSize", msg.getMessageSize(), sendTime);
|
||||
} else {
|
||||
|
@ -59,9 +59,13 @@ class ConnectionRunner implements Runnable {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("message " + msg.getMessageType() + "/" + msg.getMessageId()
|
||||
+ " expired before it could be sent");
|
||||
|
||||
msg.timestamp("ConnectionRunner.sendMessage noData");
|
||||
_con.sent(msg, false, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
msg.timestamp("ConnectionRunner.sendMessage data");
|
||||
|
||||
OutputStream out = _con.getOutputStream();
|
||||
boolean ok = false;
|
||||
|
@ -139,6 +139,7 @@ public class TCPConnection {
|
||||
*
|
||||
*/
|
||||
public void addMessage(OutNetMessage msg) {
|
||||
msg.timestamp("TCPConnection.addMessage");
|
||||
synchronized (_pendingMessages) {
|
||||
_pendingMessages.add(msg);
|
||||
_pendingMessages.notifyAll();
|
||||
@ -157,7 +158,9 @@ public class TCPConnection {
|
||||
while ( (msg == null) && (!_closed) ) {
|
||||
List expired = null;
|
||||
long now = _context.clock().now();
|
||||
int queueSize = 0;
|
||||
synchronized (_pendingMessages) {
|
||||
queueSize = _pendingMessages.size();
|
||||
for (int i = 0; i < _pendingMessages.size(); i++) {
|
||||
OutNetMessage cur = (OutNetMessage)_pendingMessages.get(i);
|
||||
if (cur.getExpiration() < now) {
|
||||
@ -182,10 +185,19 @@ public class TCPConnection {
|
||||
if (expired != null) {
|
||||
for (int i = 0; i < expired.size(); i++) {
|
||||
OutNetMessage cur = (OutNetMessage)expired.get(i);
|
||||
cur.timestamp("TCPConnection.getNextMessage expired");
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Message " + cur.getMessageId() + " expired on the queue to "
|
||||
+ _ident.getHash().toBase64().substring(0,6)
|
||||
+ " (queue size " + queueSize + ") with lifetime "
|
||||
+ cur.getLifetime());
|
||||
sent(cur, false, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (msg != null)
|
||||
msg.timestamp("TCPConnection.getNextMessage retrieved");
|
||||
return msg;
|
||||
}
|
||||
|
||||
|
@ -171,6 +171,8 @@ public class TCPTransport extends TransportImpl {
|
||||
if (msg.getTarget() == null)
|
||||
throw new IllegalStateException("Null target for a ready message?");
|
||||
|
||||
msg.timestamp("TCPTransport.outboundMessageReady");
|
||||
|
||||
TCPConnection con = null;
|
||||
boolean newPeer = false;
|
||||
synchronized (_connectionLock) {
|
||||
|
Reference in New Issue
Block a user