From 1fc6d0ad54eb257bc7723200216d90816ace2e9a Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Tue, 25 Oct 2011 21:31:23 +0000
Subject: [PATCH]   * UDP: Mark only first fragment as a duplicate

---
 .../udp/InboundMessageFragments.java          | 20 +++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java b/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java
index f927d26796..6bb24c225f 100644
--- a/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java
+++ b/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java
@@ -103,14 +103,18 @@ class InboundMessageFragments /*implements UDPTransport.PartialACKSource */{
             Long messageId = Long.valueOf(mid);
 
             if (_recentlyCompletedMessages.isKnown(mid)) {
-                _context.statManager().addRateData("udp.ignoreRecentDuplicate", 1, 0);
-                from.messageFullyReceived(messageId, -1);
-                _ackSender.ackPeer(from);
-                if (_log.shouldLog(Log.INFO))
-                    _log.info("Message received is a dup: " + mid + " dups: " 
-                              + _recentlyCompletedMessages.getCurrentDuplicateCount() + " out of " 
-                              + _recentlyCompletedMessages.getInsertedCount());
-                _context.messageHistory().droppedInboundMessage(mid, from.getRemotePeer(), "dup");
+                // Only update stats for the first fragment,
+                // otherwise it wildly overstates things
+                if (data.readMessageFragmentNum(i) == 0) {
+                    _context.statManager().addRateData("udp.ignoreRecentDuplicate", 1);
+                    from.messageFullyReceived(messageId, -1);
+                    _ackSender.ackPeer(from);
+                    if (_log.shouldLog(Log.INFO))
+                        _log.info("Message received is a dup: " + mid + " dups: " 
+                                  + _recentlyCompletedMessages.getCurrentDuplicateCount() + " out of " 
+                                  + _recentlyCompletedMessages.getInsertedCount());
+                    _context.messageHistory().droppedInboundMessage(mid, from.getRemotePeer(), "dup");
+                }
                 continue;
             }
             
-- 
GitLab