From 83b67b86b94ddca7e4f3e7e32d5ec77b4ff94c58 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Tue, 28 Jan 2025 17:10:32 +0000 Subject: [PATCH] NetDB: RI Publish improvements part 2 --- router/java/src/net/i2p/router/Router.java | 6 +++++ .../networkdb/PublishLocalRouterInfoJob.java | 23 ++++++++----------- .../KademliaNetworkDatabaseFacade.java | 20 +++------------- 3 files changed, 19 insertions(+), 30 deletions(-) diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index 959e99d15f..bed09fff93 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -47,6 +47,7 @@ import net.i2p.data.router.RouterInfo; import net.i2p.router.CommSystemFacade.Status; import net.i2p.router.crypto.FamilyKeyCrypto; import net.i2p.router.message.GarlicMessageHandler; +import net.i2p.router.networkdb.PublishLocalRouterInfoJob; import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; import net.i2p.router.startup.CreateRouterInfoJob; import net.i2p.router.startup.PortableWorkingDir; @@ -936,6 +937,11 @@ public class Router implements RouterClock.ClockShiftListener { // so we probably don't need to throw it to the timer queue, // but just to be safe _context.simpleTimer2().addEvent(r, 0); + + // periodically update our RI and republish it to the flooodfills + PublishLocalRouterInfoJob plrij = new PublishLocalRouterInfoJob(_context); + plrij.getTiming().setStartAfter(_context.clock().now() + plrij.getDelay()); + _context.jobQueue().addJob(plrij); } if (changed) { _context.commSystem().initGeoIP(); diff --git a/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java b/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java index ca1e285da8..78979a9ebc 100644 --- a/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java +++ b/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java @@ -58,7 +58,6 @@ public class PublishLocalRouterInfoJob extends JobImpl { * in Router.setNetDbReady(), so we probably don't need this anymore */ private static final long FIRST_TIME_DELAY = 90*1000; - private volatile boolean _notFirstTime; private final AtomicInteger _runCount = new AtomicInteger(); public PublishLocalRouterInfoJob(RouterContext ctx) { @@ -92,7 +91,9 @@ public class PublishLocalRouterInfoJob extends JobImpl { List<RouterAddress> newAddrs = getContext().commSystem().createAddresses(); int count = _runCount.incrementAndGet(); RouterInfo ri = new RouterInfo(oldRI); - if (_notFirstTime && (count % 4) != 0 && oldAddrs.size() == newAddrs.size()) { + if ((count % 4) != 0 && + oldAddrs.size() == newAddrs.size() && + getContext().random().nextInt(32) != 0) { // 3 times out of 4, we don't republish if everything is the same... // If something changed, including the cost, then publish, // otherwise don't. @@ -149,19 +150,15 @@ public class PublishLocalRouterInfoJob extends JobImpl { } catch (DataFormatException dfe) { _log.error("Error signing the updated local router info!", dfe); } - if (_notFirstTime) { - requeue(getDelay()); - } else { - // First publish after netdb ready is now done via state machine - // in Router.setNetDbReady(), so we probably don't need this anymore - // but leave it in for now, a router may have trouble publishing right away - requeue(FIRST_TIME_DELAY); - _notFirstTime = true; - } + _runCount.set(0); + requeue(getDelay()); } - private long getDelay() { - long rv = (PUBLISH_DELAY * 3 / 4) + getContext().random().nextLong(PUBLISH_DELAY / 4); + /** + * @since public since 0.9.65 for use by Router + */ + public long getDelay() { + long rv = (PUBLISH_DELAY * 2 / 3) + getContext().random().nextLong(PUBLISH_DELAY / 3); // run 4x as often as usual publish time (see above) rv /= 4; return rv; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java index 3a8da28c1f..76ded768d6 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java @@ -429,23 +429,9 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad _log.warn("Operating in quiet mode - not exploring or pushing data proactively, simply reactively"); _log.warn("This should NOT be used in production"); } - if (!isClientDb()) { - // periodically update and resign the router's 'published date', which basically - // serves as a version - Job plrij = new PublishLocalRouterInfoJob(_context); - // do not delay this, as this creates the RI too, and we need a good local routerinfo right away - //plrij.getTiming().setStartAfter(_context.clock().now() + PUBLISH_JOB_DELAY); - _context.jobQueue().addJob(plrij); - - // plrij calls publish() for us - //try { - // publish(ri); - //} catch (IllegalArgumentException iae) { - // _context.router().rebuildRouterInfo(true); - // //_log.log(Log.CRIT, "Our local router info is b0rked, clearing from scratch", iae); - // //_context.router().rebuildNewIdentity(); - //} - } + // + // PublishLocalRouterInfoJob is now started from Router.setNetDbReady() + // } /** unused, see override */ -- GitLab