forked from I2P_Developers/i2p.i2p
Tunnels: FragmentHandler cleanup (ticket #2699)
This commit is contained in:
@ -2,6 +2,7 @@ package net.i2p.router.tunnel;
|
|||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
import net.i2p.data.Base64;
|
import net.i2p.data.Base64;
|
||||||
import net.i2p.data.ByteArray;
|
import net.i2p.data.ByteArray;
|
||||||
@ -95,8 +96,8 @@ class FragmentHandler {
|
|||||||
protected final Log _log;
|
protected final Log _log;
|
||||||
private final Map<Long, FragmentedMessage> _fragmentedMessages;
|
private final Map<Long, FragmentedMessage> _fragmentedMessages;
|
||||||
private final DefragmentedReceiver _receiver;
|
private final DefragmentedReceiver _receiver;
|
||||||
private int _completed;
|
private final AtomicInteger _completed = new AtomicInteger();
|
||||||
private int _failed;
|
private final AtomicInteger _failed = new AtomicInteger();
|
||||||
|
|
||||||
/** don't wait more than 60s to defragment the partial message */
|
/** don't wait more than 60s to defragment the partial message */
|
||||||
static long MAX_DEFRAGMENT_TIME = 60*1000;
|
static long MAX_DEFRAGMENT_TIME = 60*1000;
|
||||||
@ -187,8 +188,8 @@ class FragmentHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getCompleteCount() { return _completed; }
|
public int getCompleteCount() { return _completed.get(); }
|
||||||
public int getFailedCount() { return _failed; }
|
public int getFailedCount() { return _failed.get(); }
|
||||||
|
|
||||||
private static final ByteCache _validateCache = ByteCache.getInstance(512, TrivialPreprocessor.PREPROCESSED_SIZE);
|
private static final ByteCache _validateCache = ByteCache.getInstance(512, TrivialPreprocessor.PREPROCESSED_SIZE);
|
||||||
|
|
||||||
@ -468,7 +469,7 @@ class FragmentHandler {
|
|||||||
private void receiveComplete(FragmentedMessage msg) {
|
private void receiveComplete(FragmentedMessage msg) {
|
||||||
if (msg == null)
|
if (msg == null)
|
||||||
return;
|
return;
|
||||||
_completed++;
|
_completed.incrementAndGet();
|
||||||
String stringified = null;
|
String stringified = null;
|
||||||
if (_log.shouldLog(Log.DEBUG))
|
if (_log.shouldLog(Log.DEBUG))
|
||||||
stringified = msg.toString();
|
stringified = msg.toString();
|
||||||
@ -490,8 +491,9 @@ class FragmentHandler {
|
|||||||
// The unencrypted messages at the OBEP are (V)TBMs
|
// The unencrypted messages at the OBEP are (V)TBMs
|
||||||
// and perhaps an occasional DatabaseLookupMessage
|
// and perhaps an occasional DatabaseLookupMessage
|
||||||
I2NPMessage m = new I2NPMessageHandler(_context).readMessage(data);
|
I2NPMessage m = new I2NPMessageHandler(_context).readMessage(data);
|
||||||
noteReception(m.getUniqueId(), fragmentCount-1, "complete: ");// + msg.toString());
|
long id = m.getUniqueId();
|
||||||
noteCompletion(m.getUniqueId());
|
noteReception(id, fragmentCount-1, "complete");
|
||||||
|
noteCompletion(id);
|
||||||
_receiver.receiveComplete(m, msg.getTargetRouter(), msg.getTargetTunnel());
|
_receiver.receiveComplete(m, msg.getTargetRouter(), msg.getTargetTunnel());
|
||||||
} catch (I2NPMessageException ime) {
|
} catch (I2NPMessageException ime) {
|
||||||
if (stringified == null) stringified = msg.toString();
|
if (stringified == null) stringified = msg.toString();
|
||||||
@ -508,7 +510,7 @@ class FragmentHandler {
|
|||||||
* @since 0.9
|
* @since 0.9
|
||||||
*/
|
*/
|
||||||
private void receiveComplete(byte[] data, int offset, int len, Hash router, TunnelId tunnelId) {
|
private void receiveComplete(byte[] data, int offset, int len, Hash router, TunnelId tunnelId) {
|
||||||
_completed++;
|
_completed.incrementAndGet();
|
||||||
try {
|
try {
|
||||||
if (_log.shouldLog(Log.DEBUG))
|
if (_log.shouldLog(Log.DEBUG))
|
||||||
_log.debug("RECV unfrag(" + len + ')');
|
_log.debug("RECV unfrag(" + len + ')');
|
||||||
@ -522,8 +524,9 @@ class FragmentHandler {
|
|||||||
I2NPMessageHandler h = new I2NPMessageHandler(_context);
|
I2NPMessageHandler h = new I2NPMessageHandler(_context);
|
||||||
h.readMessage(data, offset, len);
|
h.readMessage(data, offset, len);
|
||||||
I2NPMessage m = h.lastRead();
|
I2NPMessage m = h.lastRead();
|
||||||
noteReception(m.getUniqueId(), 0, "complete: ");// + msg.toString());
|
long id = m.getUniqueId();
|
||||||
noteCompletion(m.getUniqueId());
|
noteReception(id, 0, "complete");
|
||||||
|
noteCompletion(id);
|
||||||
_receiver.receiveComplete(m, router, tunnelId);
|
_receiver.receiveComplete(m, router, tunnelId);
|
||||||
} catch (I2NPMessageException ime) {
|
} catch (I2NPMessageException ime) {
|
||||||
if (_log.shouldLog(Log.WARN)) {
|
if (_log.shouldLog(Log.WARN)) {
|
||||||
@ -565,13 +568,13 @@ class FragmentHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void timeReached() {
|
public void timeReached() {
|
||||||
boolean removed = false;
|
boolean removed;
|
||||||
synchronized (_fragmentedMessages) {
|
synchronized (_fragmentedMessages) {
|
||||||
removed = (null != _fragmentedMessages.remove(Long.valueOf(_msg.getMessageId())));
|
removed = (null != _fragmentedMessages.remove(Long.valueOf(_msg.getMessageId())));
|
||||||
}
|
}
|
||||||
synchronized (_msg) {
|
synchronized (_msg) {
|
||||||
if (removed && !_msg.getReleased()) {
|
if (removed && !_msg.getReleased()) {
|
||||||
_failed++;
|
_failed.incrementAndGet();
|
||||||
noteFailure(_msg.getMessageId(), _msg.toString());
|
noteFailure(_msg.getMessageId(), _msg.toString());
|
||||||
if (_log.shouldLog(Log.WARN))
|
if (_log.shouldLog(Log.WARN))
|
||||||
_log.warn("Dropped incomplete fragmented message: " + _msg);
|
_log.warn("Dropped incomplete fragmented message: " + _msg);
|
||||||
|
Reference in New Issue
Block a user