From 7a8aefaa5848b70638f47da8975838d238338d49 Mon Sep 17 00:00:00 2001 From: David Gerber Date: Fri, 10 May 2024 15:43:27 +0200 Subject: [PATCH] Fix serialization size computation. --- .run/All Tests.run.xml | 2 +- app/src/main/java/io/xeres/app/xrs/item/Item.java | 2 +- .../app/xrs/serialization/SerializationFlags.java | 3 ++- .../app/xrs/serialization/SerializerSizeCache.java | 9 +++++++-- .../xeres/app/xrs/service/turtle/TurtleRsService.java | 11 +++++++---- .../java/io/xeres/common/protocol/dns/DNSTest.java | 11 +++++++++-- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/.run/All Tests.run.xml b/.run/All Tests.run.xml index 17c4bcf73..ca9a1a6a4 100644 --- a/.run/All Tests.run.xml +++ b/.run/All Tests.run.xml @@ -18,7 +18,7 @@ true true false - false + false \ No newline at end of file diff --git a/app/src/main/java/io/xeres/app/xrs/item/Item.java b/app/src/main/java/io/xeres/app/xrs/item/Item.java index 9366e8df0..a219c1aa5 100644 --- a/app/src/main/java/io/xeres/app/xrs/item/Item.java +++ b/app/src/main/java/io/xeres/app/xrs/item/Item.java @@ -109,7 +109,7 @@ else if (RsSerializable.class.isAssignableFrom(getClass())) var rawItem = new RawItem(buf, getPriority()); log.trace("Serialized buffer ==> {}", rawItem); - if (flags.contains(SerializationFlags.SIGNATURE)) + if (flags.contains(SerializationFlags.SIGNATURE) || flags.contains(SerializationFlags.SIZE)) { buf = backupBuf; backupBuf = null; diff --git a/app/src/main/java/io/xeres/app/xrs/serialization/SerializationFlags.java b/app/src/main/java/io/xeres/app/xrs/serialization/SerializationFlags.java index 8d94fb850..7aaa0db63 100644 --- a/app/src/main/java/io/xeres/app/xrs/serialization/SerializationFlags.java +++ b/app/src/main/java/io/xeres/app/xrs/serialization/SerializationFlags.java @@ -21,5 +21,6 @@ public enum SerializationFlags { - SIGNATURE + SIGNATURE, + SIZE } diff --git a/app/src/main/java/io/xeres/app/xrs/serialization/SerializerSizeCache.java b/app/src/main/java/io/xeres/app/xrs/serialization/SerializerSizeCache.java index 5bd4ed7f8..68a3134af 100644 --- a/app/src/main/java/io/xeres/app/xrs/serialization/SerializerSizeCache.java +++ b/app/src/main/java/io/xeres/app/xrs/serialization/SerializerSizeCache.java @@ -19,7 +19,9 @@ package io.xeres.app.xrs.serialization; +import io.netty.buffer.Unpooled; import io.xeres.app.xrs.item.Item; +import io.xeres.app.xrs.service.RsService; import java.util.EnumSet; import java.util.HashMap; @@ -44,8 +46,11 @@ private SerializerSizeCache() * @param item the item * @return the size of the item after serialization, header included */ - public static int getItemSize(Item item) + public static int getItemSize(Item item, RsService service) { - return cache.computeIfAbsent(item.getClass(), aClass -> item.serializeItem(EnumSet.noneOf(SerializationFlags.class)).getSize()); + return cache.computeIfAbsent(item.getClass(), aClass -> { + item.setSerialization(Unpooled.buffer().alloc(), service); + return item.serializeItem(EnumSet.of(SerializationFlags.SIZE)).getSize(); + }); } } diff --git a/app/src/main/java/io/xeres/app/xrs/service/turtle/TurtleRsService.java b/app/src/main/java/io/xeres/app/xrs/service/turtle/TurtleRsService.java index 228ac69f0..f9d0c9859 100644 --- a/app/src/main/java/io/xeres/app/xrs/service/turtle/TurtleRsService.java +++ b/app/src/main/java/io/xeres/app/xrs/service/turtle/TurtleRsService.java @@ -19,6 +19,7 @@ package io.xeres.app.xrs.service.turtle; +import io.netty.buffer.Unpooled; import io.xeres.app.database.DatabaseSession; import io.xeres.app.database.DatabaseSessionManager; import io.xeres.app.database.model.location.Location; @@ -223,7 +224,8 @@ public void sendTurtleData(LocationId virtualPeerId, TurtleGenericTunnelItem ite item.setTunnelId(tunnelId); - var itemSerializedSize = item.serializeItem(EnumSet.noneOf(SerializationFlags.class)).getSize(); // XXX: optimize... we're doing it twice + item.setSerialization(Unpooled.buffer().alloc(), this); + var itemSerializedSize = item.serializeItem(EnumSet.of(SerializationFlags.SIZE)).getSize(); // XXX: optimize... we're doing it twice // XXX: timestamp the tunnel @@ -272,7 +274,8 @@ private void routeGenericTunnel(PeerConnection sender, TurtleGenericTunnelItem i // XXX: add time stamp logic - var serializedSize = item.serializeItem(EnumSet.noneOf(SerializationFlags.class)).getSize(); // XXX: maybe find a flag to do the size serialization only because it's a bit of a CPU waste + item.setSerialization(Unpooled.buffer().alloc(), this); + var serializedSize = item.serializeItem(EnumSet.of(SerializationFlags.SIZE)).getSize(); // XXX: maybe find a flag to do the size serialization only because it's a bit of a CPU waste tunnel.addTransferredBytes(serializedSize); if (sender.getLocation().equals(tunnel.getDestination())) @@ -358,7 +361,7 @@ private void handleTunnelRequest(PeerConnection sender, TurtleTunnelRequestItem return; } - trafficStatisticsBuffer.addToTunnelRequestsDownload(SerializerSizeCache.getItemSize(item)); + trafficStatisticsBuffer.addToTunnelRequestsDownload(SerializerSizeCache.getItemSize(item, this)); if (isBanned(item.getFileHash())) { @@ -403,7 +406,7 @@ private void handleTunnelRequest(PeerConnection sender, TurtleTunnelRequestItem tunnelProbability.incrementDepth(itemToSend); if (SecureRandomUtils.nextDouble() <= probability) { - trafficStatistics.addToTunnelRequestsUpload(SerializerSizeCache.getItemSize(itemToSend)); + trafficStatistics.addToTunnelRequestsUpload(SerializerSizeCache.getItemSize(itemToSend, this)); peerConnectionManager.writeItem(peerConnection, itemToSend, this); } }, diff --git a/common/src/test/java/io/xeres/common/protocol/dns/DNSTest.java b/common/src/test/java/io/xeres/common/protocol/dns/DNSTest.java index d0c3d9d8f..6aab59ea6 100644 --- a/common/src/test/java/io/xeres/common/protocol/dns/DNSTest.java +++ b/common/src/test/java/io/xeres/common/protocol/dns/DNSTest.java @@ -19,8 +19,8 @@ package io.xeres.common.protocol.dns; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import java.io.IOException; import java.net.InetAddress; @@ -29,8 +29,15 @@ class DNSTest { + /** + * This test verifies that myip.opendns.com works for finding one's own IP when UPNP is not working. + * It also tests that akamai works, in case opendns is removed, and we need to fall back to something else. + * It only runs on my machine because of the chicken & egg problem on knowing one's own IP. + * + * @throws IOException + */ @Test - @Disabled + @EnabledIfEnvironmentVariable(named = "COMPUTERNAME", matches = "B650") void DNS_OK() throws IOException { var ip1 = DNS.resolve("myip.opendns.com", "208.67.222.222"); // resolver1.opendns.com