From 56116ad8c29ca2188699aa182bb6cbfd4a5769dc Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Tue, 26 Nov 2013 15:51:00 +0000
Subject: [PATCH] PeerManager: Thread the periodic reorg so it doesn't clog the
 timer queue

---
 .../i2p/router/peermanager/PeerManager.java   | 21 ++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/router/java/src/net/i2p/router/peermanager/PeerManager.java b/router/java/src/net/i2p/router/peermanager/PeerManager.java
index 904ca8bdb3..ef7b1de349 100644
--- a/router/java/src/net/i2p/router/peermanager/PeerManager.java
+++ b/router/java/src/net/i2p/router/peermanager/PeerManager.java
@@ -25,6 +25,7 @@ import net.i2p.router.Router;
 import net.i2p.router.RouterContext;
 import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
 import net.i2p.util.ConcurrentHashSet;
+import net.i2p.util.I2PThread;
 import net.i2p.util.Log;
 import net.i2p.util.SimpleTimer2;
 
@@ -89,6 +90,24 @@ class PeerManager {
             super(_context.simpleTimer2(), REORGANIZE_TIME);
         }
         public void timeReached() {
+            (new ReorgThread(this)).start();
+        }
+    }
+
+    /**
+     *  This takes too long to run on the SimpleTimer2 queue
+     *  @since 0.9.10
+     */
+    private class ReorgThread extends I2PThread {
+        private SimpleTimer2.TimedEvent _event;
+
+        public ReorgThread(SimpleTimer2.TimedEvent event) {
+            super("PeerManager Reorg");
+            setDaemon(true);
+            _event = event;
+        }
+
+        public void run() {
             long start = System.currentTimeMillis();
             try {
                 _organizer.reorganize(true);
@@ -104,7 +123,7 @@ class PeerManager {
                 delay = REORGANIZE_TIME_MEDIUM;
             else
                 delay = REORGANIZE_TIME;
-            schedule(delay);
+            _event.schedule(delay);
         }
     }
     
-- 
GitLab