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