From 76c1f47b20cf98f81bef75f17caa8be78a12a2dc Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Tue, 26 Jan 2010 19:52:06 +0000
Subject: [PATCH]     * Profiles: Fix lack of profiles at router startup,
 especially for new routers

---
 router/java/src/net/i2p/router/ProfileManager.java    |  1 +
 .../networkdb/kademlia/PersistentDataStore.java       |  4 ++++
 .../i2p/router/peermanager/ProfileManagerImpl.java    | 11 +++++++++++
 3 files changed, 16 insertions(+)

diff --git a/router/java/src/net/i2p/router/ProfileManager.java b/router/java/src/net/i2p/router/ProfileManager.java
index f829bdaeb4..f861ab1861 100644
--- a/router/java/src/net/i2p/router/ProfileManager.java
+++ b/router/java/src/net/i2p/router/ProfileManager.java
@@ -155,6 +155,7 @@ public interface ProfileManager {
      * through an explicit dbStore or in a dbLookupReply
      */
     void heardAbout(Hash peer);
+    void heardAbout(Hash peer, long when);
     
     /**
      * Note that the router received a message from the given peer on the specified
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java
index 16aa7dfb65..abc78b8554 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java
@@ -411,6 +411,10 @@ class PersistentDataStore extends TransientDataStore {
                         try {
                             // persist = false so we don't write what we just read
                             _facade.store(ri.getIdentity().getHash(), ri, false);
+                            // when heardAbout() was removed from TransientDataStore, it broke
+                            // profile bootstrapping for new routers,
+                            // so add it here.
+                            getContext().profileManager().heardAbout(ri.getIdentity().getHash(), ri.getPublished());
                         } catch (IllegalArgumentException iae) {
                             _log.info("Refused locally loaded routerInfo - deleting");
                             corrupt = true;
diff --git a/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java b/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java
index 69088caaa7..712a3cba65 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java
@@ -311,6 +311,17 @@ public class ProfileManagerImpl implements ProfileManager {
         if (data == null) return;
         data.setLastHeardAbout(_context.clock().now());
     }
+
+    /**
+     * Note that the local router received a reference to the given peer
+     * at a certain time. Only update the time if newer.
+     */
+    public void heardAbout(Hash peer, long when) {
+        PeerProfile data = getProfile(peer);
+        if (data == null) return;
+        if (when > data.getLastHeardAbout())
+            data.setLastHeardAbout(when);
+    }
     
     /**
      * Note that the router received a message from the given peer on the specified
-- 
GitLab