From 7202ea33407d4116d3c4b03f4d325d77f35834b2 Mon Sep 17 00:00:00 2001 From: jrandom Date: Fri, 30 Apr 2004 07:11:41 +0000 Subject: [PATCH] dont dieFatal() if the first leaseSet lookup fails (this was the cause of those "fast fail" errors [bugId=69]) try up to 6 times to search (or until the expiration, etc) logging --- .../message/OutboundClientMessageJob.java | 76 +++++++++++++------ 1 file changed, 54 insertions(+), 22 deletions(-) diff --git a/router/java/src/net/i2p/router/message/OutboundClientMessageJob.java b/router/java/src/net/i2p/router/message/OutboundClientMessageJob.java index 4828abd06..378833ee7 100644 --- a/router/java/src/net/i2p/router/message/OutboundClientMessageJob.java +++ b/router/java/src/net/i2p/router/message/OutboundClientMessageJob.java @@ -74,8 +74,8 @@ public class OutboundClientMessageJob extends JobImpl { /** priority of messages, that might get honored some day... */ private final static int SEND_PRIORITY = 500; - /** dont search for the lease more than 3 times */ - private final static int MAX_LEASE_LOOKUPS = 3; + /** dont search for the lease more than 6 times */ + private final static int MAX_LEASE_LOOKUPS = 6; /** * Send the sucker @@ -98,7 +98,8 @@ public class OutboundClientMessageJob extends JobImpl { timeoutMs = Long.parseLong(param); } catch (NumberFormatException nfe) { if (_log.shouldLog(Log.WARN)) - _log.warn("Invalid client message timeout specified [" + param + "], defaulting to " + OVERALL_TIMEOUT_MS_DEFAULT, nfe); + _log.warn("Invalid client message timeout specified [" + param + + "], defaulting to " + OVERALL_TIMEOUT_MS_DEFAULT, nfe); timeoutMs = OVERALL_TIMEOUT_MS_DEFAULT; } } @@ -155,11 +156,14 @@ public class OutboundClientMessageJob extends JobImpl { Lease nextLease = getNextLease(); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Send outbound client message - next lease found for [" + _status.getTo().calculateHash().toBase64() + "] - " + nextLease); + _log.debug("Send outbound client message - next lease found for [" + + _status.getTo().calculateHash().toBase64() + "] - " + + nextLease); if (nextLease == null) { if (_log.shouldLog(Log.WARN)) - _log.warn("No more leases, and we still haven't heard back from the peer, refetching the leaseSet to try again"); + _log.warn("No more leases, and we still haven't heard back from the peer" + + ", refetching the leaseSet to try again"); _status.setLeaseSet(null); long remainingMs = _overallExpiration - _context.clock().now(); if (_status.getNumLookups() < MAX_LEASE_LOOKUPS) { @@ -171,7 +175,8 @@ public class OutboundClientMessageJob extends JobImpl { return; } else { if (_log.shouldLog(Log.WARN)) - _log.warn("sendNext() - max # lease lookups exceeded! " + _status.getNumLookups()); + _log.warn("sendNext() - max # lease lookups exceeded! " + + _status.getNumLookups()); dieFatal(); return; } @@ -218,7 +223,8 @@ public class OutboundClientMessageJob extends JobImpl { leases.add(lease); } else { if (_log.shouldLog(Log.DEBUG)) - _log.debug("getNextLease() - skipping lease we've already sent it down - " + lease); + _log.debug("getNextLease() - skipping lease we've already sent it down - " + + lease); } } @@ -260,7 +266,11 @@ public class OutboundClientMessageJob extends JobImpl { PublicKey key = _status.getLeaseSet().getEncryptionKey(); SessionKey sessKey = new SessionKey(); Set tags = new HashSet(); - GarlicMessage msg = OutboundClientMessageJobHelper.createGarlicMessage(_context, token, _overallExpiration, key, _status.getClove(), _status.getTo(), sessKey, tags, true); + GarlicMessage msg = OutboundClientMessageJobHelper.createGarlicMessage(_context, token, + _overallExpiration, key, + _status.getClove(), + _status.getTo(), sessKey, + tags, true); if (_log.shouldLog(Log.DEBUG)) _log.debug("send(lease) - token expected " + token); @@ -272,13 +282,21 @@ public class OutboundClientMessageJob extends JobImpl { ReplySelector selector = new ReplySelector(token); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Placing GarlicMessage into the new tunnel message bound for " + lease.getTunnelId() + " on " + lease.getRouterIdentity().getHash().toBase64()); + _log.debug("Placing GarlicMessage into the new tunnel message bound for " + + lease.getTunnelId() + " on " + + lease.getRouterIdentity().getHash().toBase64()); TunnelId outTunnelId = selectOutboundTunnel(); if (outTunnelId != null) { if (_log.shouldLog(Log.DEBUG)) - _log.debug("Sending tunnel message out " + outTunnelId + " to " + lease.getTunnelId() + " on " + lease.getRouterIdentity().getHash().toBase64()); - SendTunnelMessageJob j = new SendTunnelMessageJob(_context, msg, outTunnelId, lease.getRouterIdentity().getHash(), lease.getTunnelId(), null, onReply, onFail, selector, SEND_TIMEOUT_MS, SEND_PRIORITY); + _log.debug("Sending tunnel message out " + outTunnelId + " to " + + lease.getTunnelId() + " on " + + lease.getRouterIdentity().getHash().toBase64()); + SendTunnelMessageJob j = new SendTunnelMessageJob(_context, msg, outTunnelId, + lease.getRouterIdentity().getHash(), + lease.getTunnelId(), null, onReply, + onFail, selector, SEND_TIMEOUT_MS, + SEND_PRIORITY); _context.jobQueue().addJob(j); } else { if (_log.shouldLog(Log.ERROR)) @@ -315,11 +333,15 @@ public class OutboundClientMessageJob extends JobImpl { ClientMessage msg = _status.getMessage(); if (alreadyFailed) { if (_log.shouldLog(Log.DEBUG)) - _log.debug("dieFatal() - already failed sending " + msg.getMessageId()+ ", no need to do it again", new Exception("Duplicate death?")); + _log.debug("dieFatal() - already failed sending " + msg.getMessageId() + + ", no need to do it again", new Exception("Duplicate death?")); return; } else { if (_log.shouldLog(Log.ERROR)) - _log.error("Failed to send the message " + msg.getMessageId() + " after " + _status.getNumSent() + " sends and " + _status.getNumLookups() + " lookups (and " + sendTime + "ms)", new Exception("Message send failure")); + _log.error("Failed to send the message " + msg.getMessageId() + " after " + + _status.getNumSent() + " sends and " + _status.getNumLookups() + + " lookups (and " + sendTime + "ms)", + new Exception("Message send failure")); } _context.messageHistory().sendPayloadMessage(msg.getMessageId().getMessageId(), false, sendTime); @@ -510,13 +532,19 @@ public class OutboundClientMessageJob extends JobImpl { public void runJob() { sendNext(); } } - /** we couldn't even find the leaseSet, fuck off */ + /** + * we couldn't even find the leaseSet, but try again (or die + * if we've already tried too hard) + * + */ private class LookupLeaseSetFailedJob extends JobImpl { public LookupLeaseSetFailedJob() { super(OutboundClientMessageJob.this._context); } public String getName() { return "Lookup for outbound client message failed"; } - public void runJob() { dieFatal(); } + public void runJob() { + sendNext(); + } } /** send a message to a lease */ @@ -558,24 +586,28 @@ public class OutboundClientMessageJob extends JobImpl { boolean alreadySuccessful = _status.success(); MessageId msgId = _status.getMessage().getMessageId(); if (_log.shouldLog(Log.DEBUG)) - _log.debug("SUCCESS! Message delivered completely for message " + msgId + " after " + sendTime + "ms [for " + _status.getMessage().getMessageId() + "]"); + _log.debug("SUCCESS! Message delivered completely for message " + msgId + + " after " + sendTime + "ms [for " + + _status.getMessage().getMessageId() + "]"); if ( (_key != null) && (_tags != null) && (_tags.size() > 0) ) { - SendSuccessJob.this._context.sessionKeyManager().tagsDelivered(_status.getLeaseSet().getEncryptionKey(), _key, _tags); + _context.sessionKeyManager().tagsDelivered(_status.getLeaseSet().getEncryptionKey(), + _key, _tags); } if (alreadySuccessful) { if (_log.shouldLog(Log.DEBUG)) - _log.debug("Success is a duplicate for " + _status.getMessage().getMessageId() + ", dont notify again..."); + _log.debug("Success is a duplicate for " + _status.getMessage().getMessageId() + + ", dont notify again..."); return; } long dataMsgId = _status.getClove().getId(); - SendSuccessJob.this._context.messageHistory().sendPayloadMessage(dataMsgId, true, sendTime); - SendSuccessJob.this._context.clientManager().messageDeliveryStatusUpdate(_status.getFrom(), msgId, true); + _context.messageHistory().sendPayloadMessage(dataMsgId, true, sendTime); + _context.clientManager().messageDeliveryStatusUpdate(_status.getFrom(), msgId, true); _lease.setNumSuccess(_lease.getNumSuccess()+1); - SendSuccessJob.this._context.statManager().addRateData("client.sendMessageSize", _status.getMessage().getPayload().getSize(), sendTime); - SendSuccessJob.this._context.statManager().addRateData("client.sendAttemptAverage", _status.getNumSent(), sendTime); + _context.statManager().addRateData("client.sendMessageSize", _status.getMessage().getPayload().getSize(), sendTime); + _context.statManager().addRateData("client.sendAttemptAverage", _status.getNumSent(), sendTime); } public void setMessage(I2NPMessage msg) {}