2004-10-02 jrandom

* Assure that we quickly fail messages bound for shitlisted peers.
    * Address a race on startup where the first peer contacted could hang the
      router (thanks Romster!)
    * Only whine about an intermittent inability to query the time server once
This commit is contained in:
jrandom
2004-10-02 19:05:24 +00:00
committed by zzz
parent ce186e1872
commit d20d043e0f
10 changed files with 43 additions and 45 deletions

View File

@ -115,7 +115,7 @@ public class NtpClient {
//System.out.println("host: " + serverName + " rtt: " + roundTripDelay + " offset: " + localClockOffset + " seconds");
return (long)(System.currentTimeMillis() + localClockOffset*1000);
} catch (IOException ioe) {
ioe.printStackTrace();
//ioe.printStackTrace();
return -1;
}
}

View File

@ -100,6 +100,7 @@ public class Timestamper implements Runnable {
if (_log.shouldLog(Log.INFO))
_log.info("Starting up timestamper");
boolean alreadyBitched = false;
try {
while (true) {
updateConfig();
@ -118,7 +119,9 @@ public class Timestamper implements Runnable {
_log.debug("Stamp time");
stampTime(now);
} catch (IllegalArgumentException iae) {
_log.log(Log.CRIT, "Unable to reach any of the NTP servers - network disconnected?");
if (!alreadyBitched)
_log.log(Log.CRIT, "Unable to reach any of the NTP servers - network disconnected?");
alreadyBitched = true;
}
}
try { Thread.sleep(_queryFrequency); } catch (InterruptedException ie) {}

View File

@ -1,4 +1,10 @@
$Id: history.txt,v 1.28 2004/10/01 12:23:00 jrandom Exp $
$Id: history.txt,v 1.29 2004/10/02 07:31:16 jrandom Exp $
2004-10-02 jrandom
* Assure that we quickly fail messages bound for shitlisted peers.
* Address a race on startup where the first peer contacted could hang the
router (thanks Romster!)
* Only whine about an intermittent inability to query the time server once
2004-10-02 jrandom
* Command line utility to verify a peer's reachability - simply run

View File

@ -21,7 +21,6 @@ import java.util.Set;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataHelper;
import net.i2p.data.Hash;
import net.i2p.data.RouterInfo;
import net.i2p.data.i2np.I2NPMessage;
import net.i2p.util.Log;
@ -35,7 +34,6 @@ public class OutNetMessage {
private Log _log;
private RouterContext _context;
private RouterInfo _target;
private Hash _targetHash;
private I2NPMessage _message;
/** cached message class name, for use after we discard the message */
private String _messageType;
@ -123,8 +121,6 @@ public class OutNetMessage {
*/
public RouterInfo getTarget() { return _target; }
public void setTarget(RouterInfo target) { _target = target; }
public Hash getTargetHash() { return _targetHash; }
public void setTargetHash(Hash target) { _targetHash = target; }
/**
* Specifies the message to be sent
*

View File

@ -15,9 +15,9 @@ import net.i2p.CoreVersion;
*
*/
public class RouterVersion {
public final static String ID = "$Revision: 1.38 $ $Date: 2004/10/01 12:23:00 $";
public final static String ID = "$Revision: 1.39 $ $Date: 2004/10/02 07:31:15 $";
public final static String VERSION = "0.4.1.1";
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);
System.out.println("Router ID: " + RouterVersion.ID);

View File

@ -559,31 +559,11 @@ public class SendTunnelMessageJob extends JobImpl {
outM.setOnSendJob(_onSend);
outM.setPriority(_priority);
outM.setReplySelector(_selector);
if (_destRouter != null)
outM.setTargetHash(_destRouter);
else
outM.setTargetHash(getContext().routerHash());
outM.setTarget(getContext().netDb().lookupRouterInfoLocally(_destRouter));
getContext().messageRegistry().registerPending(outM);
_onFailure = new FakeOnFailJob(getContext(), outM, _onFailure);
// we dont really need the data
outM.discardData();
}
private class FakeOnFailJob extends JobImpl {
private OutNetMessage _fakeMessage;
private Job _realOnFailJob;
public FakeOnFailJob(RouterContext ctx, OutNetMessage msg, Job realOnFailJob) {
super(ctx);
_fakeMessage = msg;
_realOnFailJob = realOnFailJob;
}
public String getName() { return "Fake message failure job"; }
public void runJob() {
getContext().messageRegistry().unregisterPending(_fakeMessage);
if (_realOnFailJob != null)
getContext().jobQueue().addJob(_realOnFailJob);
}
}
public String getName() { return "Send Tunnel Message"; }
}

View File

@ -38,14 +38,16 @@ public class GetBidsJob extends JobImpl {
public String getName() { return "Fetch bids for a message to be delivered"; }
public void runJob() {
Hash to = _msg.getTarget().getIdentity().getHash();
if (getContext().shitlist().isShitlisted(to)) {
_log.warn("Attempt to send a message to a shitlisted peer - " + to);
getContext().messageRegistry().peerFailed(to);
fail();
return;
}
Hash us = getContext().routerHash();
if (_msg.getTarget().getIdentity().getHash().equals(us)) {
if (to.equals(us)) {
_log.error("wtf, send a message to ourselves? nuh uh. msg = " + _msg, getAddedBy());
fail();
return;
@ -54,11 +56,8 @@ public class GetBidsJob extends JobImpl {
List bids = _facade.getBids(_msg);
if (bids.size() <= 0) {
_log.warn("No bids available for the message " + _msg);
Hash target = _msg.getTargetHash();
if (target == null)
target = _msg.getTarget().getIdentity().getHash();
getContext().shitlist().shitlistRouter(target, "No bids");
getContext().netDb().fail(target);
getContext().shitlist().shitlistRouter(to, "No bids");
getContext().netDb().fail(to);
fail();
} else {
TransportBid bid = (TransportBid)bids.get(0);
@ -79,10 +78,7 @@ public class GetBidsJob extends JobImpl {
getContext().messageRegistry().unregisterPending(_msg);
}
if (_msg.getTargetHash() != null)
getContext().profileManager().messageFailed(_msg.getTargetHash());
else
getContext().profileManager().messageFailed(_msg.getTarget().getIdentity().getHash());
getContext().profileManager().messageFailed(_msg.getTarget().getIdentity().getHash());
_msg.discardData();
}

View File

@ -279,14 +279,24 @@ public class OutboundMessageRegistry {
public void peerFailed(Hash peer) {
List failed = null;
int numFailed = 0;
synchronized (_pendingMessages) {
for (Iterator iter = _pendingMessages.values().iterator(); iter.hasNext(); ) {
OutNetMessage msg = (OutNetMessage)iter.next();
if ( (msg.getTargetHash() != null) && (msg.getTargetHash().equals(peer)) ) {
if (failed == null)
failed = new ArrayList(4);
failed.add(msg);
iter.remove();
if (msg.getTarget() != null) {
Hash to = msg.getTarget().getIdentity().calculateHash();
if (to.equals(peer)) {
if (failed == null)
failed = new ArrayList(4);
failed.add(msg);
iter.remove();
numFailed++;
} else {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Peer failed: " + peer.toBase64().substring(0,6)
+ " but not killing a message to "
+ to.toBase64().substring(0,6));
}
}
}
}
@ -299,6 +309,8 @@ public class OutboundMessageRegistry {
}
}
if (_log.shouldLog(Log.WARN))
_log.warn("Peer failed: " + peer.toBase64().substring(0,6) + " killing " + numFailed);
}
public void renderStatusHTML(Writer out) throws IOException {
@ -314,6 +326,7 @@ public class OutboundMessageRegistry {
OutNetMessage msg = (OutNetMessage)msgs.get(exp);
buf.append("<li>").append(msg.getMessageType());
buf.append(": expiring on ").append(new Date(exp.longValue()));
buf.append(" targetting ").append(msg.getTarget().getIdentity().getHash());
if (msg.getReplySelector() != null)
buf.append(" with reply selector ").append(msg.getReplySelector().toString());
else

View File

@ -168,6 +168,9 @@ public class TCPTransport extends TransportImpl {
// _log.debug("Outbound message ready: " + msg);
if (msg != null) {
if (msg.getTarget() == null)
throw new IllegalStateException("Null target for a ready message?");
TCPConnection con = null;
boolean newPeer = false;
synchronized (_connectionLock) {

View File

@ -149,6 +149,7 @@ public class PoolingTunnelManagerFacade implements TunnelManagerFacade {
*
*/
public void peerFailed(Hash peer) {
if (_pool == null) return; // just initialized
int numFailed = 0;
boolean shouldKill = false;
for (Iterator iter = _pool.getManagedTunnelIds().iterator(); iter.hasNext(); ) {