forked from I2P_Developers/i2p.i2p
* I2CP:
- Prep for delivery of detailed failure codes to the client (ticket #788) - Store session ID as an int instead of a long - Clean up some duplicate createRateStat calls (ticket #787 comment 2) - Other optimizations, cleanups, final
This commit is contained in:
@@ -68,7 +68,11 @@ public abstract class ClientManagerFacade implements Service {
|
||||
* @param destHash Hash of Destination to be checked
|
||||
*/
|
||||
public abstract boolean isLocal(Hash destHash);
|
||||
public abstract void messageDeliveryStatusUpdate(Destination fromDest, MessageId id, boolean delivered);
|
||||
|
||||
/**
|
||||
* @param status see I2CP MessageStatusMessage for success/failure codes
|
||||
*/
|
||||
public abstract void messageDeliveryStatusUpdate(Destination fromDest, MessageId id, int status);
|
||||
|
||||
public abstract void messageReceived(ClientMessage msg);
|
||||
|
||||
|
@@ -18,7 +18,7 @@ public class RouterVersion {
|
||||
/** deprecated */
|
||||
public final static String ID = "Monotone";
|
||||
public final static String VERSION = CoreVersion.VERSION;
|
||||
public final static long BUILD = 1;
|
||||
public final static long BUILD = 2;
|
||||
|
||||
/** for example "-test" */
|
||||
public final static String EXTRA = "";
|
||||
|
@@ -269,11 +269,13 @@ class ClientConnectionRunner {
|
||||
* delivered (or failed delivery)
|
||||
* Note that this sends the Guaranteed status codes, even though we only support best effort.
|
||||
* Doesn't do anything if i2cp.messageReliability = "none"
|
||||
*
|
||||
* @param status see I2CP MessageStatusMessage for success/failure codes
|
||||
*/
|
||||
void updateMessageDeliveryStatus(MessageId id, boolean delivered) {
|
||||
void updateMessageDeliveryStatus(MessageId id, int status) {
|
||||
if (_dead || _dontSendMSM)
|
||||
return;
|
||||
_context.jobQueue().addJob(new MessageDeliveryStatusUpdate(id, delivered));
|
||||
_context.jobQueue().addJob(new MessageDeliveryStatusUpdate(id, status));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -624,13 +626,16 @@ class ClientConnectionRunner {
|
||||
|
||||
private class MessageDeliveryStatusUpdate extends JobImpl {
|
||||
private final MessageId _messageId;
|
||||
private final boolean _success;
|
||||
private final int _status;
|
||||
private long _lastTried;
|
||||
|
||||
public MessageDeliveryStatusUpdate(MessageId id, boolean success) {
|
||||
/**
|
||||
* @param status see I2CP MessageStatusMessage for success/failure codes
|
||||
*/
|
||||
public MessageDeliveryStatusUpdate(MessageId id, int status) {
|
||||
super(ClientConnectionRunner.this._context);
|
||||
_messageId = id;
|
||||
_success = success;
|
||||
_status = status;
|
||||
}
|
||||
|
||||
public String getName() { return "Update Delivery Status"; }
|
||||
@@ -647,10 +652,7 @@ class ClientConnectionRunner {
|
||||
// has to be >= 0, it is initialized to -1
|
||||
msg.setNonce(2);
|
||||
msg.setSize(0);
|
||||
if (_success)
|
||||
msg.setStatus(MessageStatusMessage.STATUS_SEND_GUARANTEED_SUCCESS);
|
||||
else
|
||||
msg.setStatus(MessageStatusMessage.STATUS_SEND_GUARANTEED_FAILURE);
|
||||
msg.setStatus(_status);
|
||||
|
||||
if (!alreadyAccepted(_messageId)) {
|
||||
_log.warn("Almost send an update for message " + _messageId + " to "
|
||||
|
@@ -26,6 +26,7 @@ import net.i2p.data.LeaseSet;
|
||||
import net.i2p.data.Payload;
|
||||
import net.i2p.data.i2cp.I2CPMessage;
|
||||
import net.i2p.data.i2cp.MessageId;
|
||||
import net.i2p.data.i2cp.MessageStatusMessage;
|
||||
import net.i2p.data.i2cp.SessionConfig;
|
||||
import net.i2p.internal.I2CPMessageQueue;
|
||||
import net.i2p.router.ClientManagerFacade;
|
||||
@@ -75,6 +76,10 @@ class ClientManager {
|
||||
_runnersByHash = new ConcurrentHashMap();
|
||||
_pendingRunners = new HashSet();
|
||||
startListeners(port);
|
||||
// following are for RequestLeaseSetJob
|
||||
_ctx.statManager().createRateStat("client.requestLeaseSetSuccess", "How frequently the router requests successfully a new leaseSet?", "ClientMessages", new long[] { 60*60*1000 });
|
||||
_ctx.statManager().createRateStat("client.requestLeaseSetTimeout", "How frequently the router requests a new leaseSet but gets no reply?", "ClientMessages", new long[] { 60*60*1000 });
|
||||
_ctx.statManager().createRateStat("client.requestLeaseSetDropped", "How frequently the router requests a new leaseSet but the client drops?", "ClientMessages", new long[] { 60*60*1000 });
|
||||
}
|
||||
|
||||
/** Todo: Start a 3rd listener for IPV6? */
|
||||
@@ -265,7 +270,7 @@ class ClientManager {
|
||||
public void runJob() {
|
||||
_to.receiveMessage(_toDest, _fromDest, _payload);
|
||||
if (_from != null) {
|
||||
_from.updateMessageDeliveryStatus(_msgId, true);
|
||||
_from.updateMessageDeliveryStatus(_msgId, MessageStatusMessage.STATUS_SEND_SUCCESS_LOCAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -382,17 +387,20 @@ class ClientManager {
|
||||
return _runnersByHash.get(destHash);
|
||||
}
|
||||
|
||||
public void messageDeliveryStatusUpdate(Destination fromDest, MessageId id, boolean delivered) {
|
||||
/**
|
||||
* @param status see I2CP MessageStatusMessage for success/failure codes
|
||||
*/
|
||||
public void messageDeliveryStatusUpdate(Destination fromDest, MessageId id, int status) {
|
||||
ClientConnectionRunner runner = getRunner(fromDest);
|
||||
if (runner != null) {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("Delivering status [" + (delivered?"success":"failure") + "] to "
|
||||
+ fromDest.calculateHash().toBase64() + " for message " + id);
|
||||
runner.updateMessageDeliveryStatus(id, delivered);
|
||||
_log.debug("Delivering status " + status + " to "
|
||||
+ fromDest.calculateHash() + " for message " + id);
|
||||
runner.updateMessageDeliveryStatus(id, status);
|
||||
} else {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Cannot deliver status [" + (delivered?"success":"failure") + "] to "
|
||||
+ fromDest.calculateHash().toBase64() + " for message " + id);
|
||||
_log.warn("Cannot deliver status " + status + " to "
|
||||
+ fromDest.calculateHash() + " for message " + id);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -178,9 +178,12 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade implements Inte
|
||||
@Override
|
||||
public boolean shouldPublishLeaseSet(Hash destinationHash) { return _manager.shouldPublishLeaseSet(destinationHash); }
|
||||
|
||||
public void messageDeliveryStatusUpdate(Destination fromDest, MessageId id, boolean delivered) {
|
||||
/**
|
||||
* @param status see I2CP MessageStatusMessage for success/failure codes
|
||||
*/
|
||||
public void messageDeliveryStatusUpdate(Destination fromDest, MessageId id, int status) {
|
||||
if (_manager != null)
|
||||
_manager.messageDeliveryStatusUpdate(fromDest, id, delivered);
|
||||
_manager.messageDeliveryStatusUpdate(fromDest, id, status);
|
||||
else
|
||||
_log.error("Null manager on messageDeliveryStatusUpdate!");
|
||||
}
|
||||
|
@@ -36,9 +36,7 @@ class RequestLeaseSetJob extends JobImpl {
|
||||
_log = ctx.logManager().getLog(RequestLeaseSetJob.class);
|
||||
_runner = runner;
|
||||
_requestState = state;
|
||||
ctx.statManager().createRateStat("client.requestLeaseSetSuccess", "How frequently the router requests successfully a new leaseSet?", "ClientMessages", new long[] { 60*60*1000 });
|
||||
ctx.statManager().createRateStat("client.requestLeaseSetTimeout", "How frequently the router requests a new leaseSet but gets no reply?", "ClientMessages", new long[] { 60*60*1000 });
|
||||
ctx.statManager().createRateStat("client.requestLeaseSetDropped", "How frequently the router requests a new leaseSet but the client drops?", "ClientMessages", new long[] { 60*60*1000 });
|
||||
// all createRateStat in ClientManager
|
||||
}
|
||||
|
||||
public String getName() { return "Request Lease Set"; }
|
||||
|
@@ -43,7 +43,7 @@ public class DummyClientManagerFacade extends ClientManagerFacade {
|
||||
public void shutdown(String msg) {}
|
||||
public void restart() {}
|
||||
|
||||
public void messageDeliveryStatusUpdate(Destination fromDest, MessageId id, boolean delivered) {}
|
||||
public void messageDeliveryStatusUpdate(Destination fromDest, MessageId id, int status) {}
|
||||
|
||||
public SessionConfig getClientSessionConfig(Destination _dest) { return null; }
|
||||
public SessionKeyManager getClientSessionKeyManager(Hash _dest) { return null; }
|
||||
|
@@ -49,11 +49,11 @@ public class GarlicMessageReceiver {
|
||||
public GarlicMessageReceiver(RouterContext context, CloveReceiver receiver, Hash clientDestination) {
|
||||
_context = context;
|
||||
_log = context.logManager().getLog(GarlicMessageReceiver.class);
|
||||
_context.statManager().createRateStat("crypto.garlic.decryptFail", "How often garlic messages are undecryptable", "Encryption", new long[] { 60*60*1000, 24*60*60*1000 });
|
||||
_clientDestination = clientDestination;
|
||||
_parser = new GarlicMessageParser(context);
|
||||
_receiver = receiver;
|
||||
//_log.error("New GMR dest = " + clientDestination);
|
||||
// all createRateStat in OCMOSJ.init()
|
||||
}
|
||||
|
||||
public void receive(GarlicMessage message) {
|
||||
|
@@ -50,7 +50,6 @@ class HandleGarlicMessageJob extends JobImpl implements GarlicMessageReceiver.Cl
|
||||
public HandleGarlicMessageJob(RouterContext context, GarlicMessage msg, RouterIdentity from, Hash fromHash) {
|
||||
super(context);
|
||||
_log = context.logManager().getLog(HandleGarlicMessageJob.class);
|
||||
getContext().statManager().createRateStat("crypto.garlic.decryptFail", "How often garlic messages are undecryptable", "Encryption", new long[] { 5*60*1000, 60*60*1000, 24*60*60*1000 });
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("Garlic Message not down a tunnel from [" + from + "]");
|
||||
_message = msg;
|
||||
@@ -59,6 +58,7 @@ class HandleGarlicMessageJob extends JobImpl implements GarlicMessageReceiver.Cl
|
||||
//_cloves = new HashMap();
|
||||
//_handler = new MessageHandler(context);
|
||||
//_parser = new GarlicMessageParser(context);
|
||||
// all createRateStat in OCMOSJ.init()
|
||||
}
|
||||
|
||||
public String getName() { return "Handle Inbound Garlic Message"; }
|
||||
|
@@ -21,6 +21,7 @@ import net.i2p.data.RouterInfo;
|
||||
import net.i2p.data.SessionKey;
|
||||
import net.i2p.data.SessionTag;
|
||||
import net.i2p.data.i2cp.MessageId;
|
||||
import net.i2p.data.i2cp.MessageStatusMessage;
|
||||
import net.i2p.data.i2np.DataMessage;
|
||||
import net.i2p.data.i2np.DeliveryInstructions;
|
||||
import net.i2p.data.i2np.DeliveryStatusMessage;
|
||||
@@ -189,6 +190,8 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
|
||||
ctx.statManager().createRateStat("client.dispatchSendTime", "How long the actual dispatching takes?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
|
||||
ctx.statManager().createRateStat("client.dispatchNoTunnels", "How long after start do we run out of tunnels to send/receive with?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
|
||||
ctx.statManager().createRateStat("client.dispatchNoACK", "Repeated message sends to a peer (no ack required)", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l });
|
||||
// for HandleGarlicMessageJob / GarlicMessageReceiver
|
||||
ctx.statManager().createRateStat("crypto.garlic.decryptFail", "How often garlic messages are undecryptable", "Encryption", new long[] { 5*60*1000, 60*60*1000, 24*60*60*1000 });
|
||||
}
|
||||
|
||||
public String getName() { return "Outbound client message"; }
|
||||
@@ -674,6 +677,10 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
|
||||
* this is safe to call multiple times (only tells the client once)
|
||||
*/
|
||||
private void dieFatal() {
|
||||
dieFatal(MessageStatusMessage.STATUS_SEND_GUARANTEED_FAILURE);
|
||||
}
|
||||
|
||||
private void dieFatal(int status) {
|
||||
if (_finished) return;
|
||||
_finished = true;
|
||||
|
||||
@@ -693,7 +700,7 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
|
||||
|
||||
clearCaches();
|
||||
getContext().messageHistory().sendPayloadMessage(_clientMessageId.getMessageId(), false, sendTime);
|
||||
getContext().clientManager().messageDeliveryStatusUpdate(_from, _clientMessageId, false);
|
||||
getContext().clientManager().messageDeliveryStatusUpdate(_from, _clientMessageId, status);
|
||||
getContext().statManager().updateFrequency("client.sendMessageFailFrequency");
|
||||
_clove = null;
|
||||
}
|
||||
@@ -820,7 +827,8 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
|
||||
|
||||
long dataMsgId = _cloveId;
|
||||
getContext().messageHistory().sendPayloadMessage(dataMsgId, true, sendTime);
|
||||
getContext().clientManager().messageDeliveryStatusUpdate(_from, _clientMessageId, true);
|
||||
getContext().clientManager().messageDeliveryStatusUpdate(_from, _clientMessageId,
|
||||
MessageStatusMessage.STATUS_SEND_GUARANTEED_SUCCESS);
|
||||
// unused
|
||||
//_lease.setNumSuccess(_lease.getNumSuccess()+1);
|
||||
|
||||
|
Reference in New Issue
Block a user