From 928c0e9b912dff4a0882efc985ded0b742b2f115 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Tue, 7 Apr 2020 14:47:18 +0000
Subject: [PATCH] Graphs: Reduce rrd4j sync thread pool size disable pool if
 not persisting stop pool on shutdown

---
 .../net/i2p/router/web/StatSummarizer.java    | 24 +++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java b/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
index 764e8d7995..bac0fb2fd7 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
@@ -11,6 +11,9 @@ import java.util.StringTokenizer;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.Semaphore;
 
+import org.rrd4j.core.RrdBackendFactory;
+import org.rrd4j.core.RrdNioBackendFactory;
+
 import net.i2p.I2PAppContext;
 import net.i2p.app.ClientApp;
 import net.i2p.app.ClientAppState;
@@ -83,15 +86,27 @@ public class StatSummarizer implements Runnable, ClientApp {
         }
         _isRunning = true;
         boolean isPersistent = _context.getBooleanPropertyDefaultTrue(SummaryListener.PROP_PERSISTENT);
-        if (!isPersistent)
+        int syncThreads;
+        if (isPersistent) {
+            String spec = _context.getProperty("stat.summaries", DEFAULT_DATABASES);
+            String[] rates = DataHelper.split(spec, ",");
+            syncThreads = Math.min(rates.length / 2, 4);
+        } else {
+            syncThreads = 0;
             deleteOldRRDs();
+        }
+        RrdNioBackendFactory.setSyncPoolSize(syncThreads);
         _thread = Thread.currentThread();
         _context.clientAppManager().register(this);
         String specs = "";
         try {
             while (_isRunning && _context.router().isAlive()) {
                 specs = adjustDatabases(specs);
-                try { Thread.sleep(60*1000); } catch (InterruptedException ie) {}
+                try {
+                    Thread.sleep(60*1000);
+                } catch (InterruptedException ie) {
+                    break;
+                }
             }
         } finally {
             _isRunning = false;
@@ -463,6 +478,11 @@ public class StatSummarizer implements Runnable, ClientApp {
                 lsnr.stopListening();
             }
             _listeners.clear();
+            // stops the sync thread pool in NIO; noop if not persistent,
+            // we set num threads to zero in run() above
+            try {
+                RrdBackendFactory.getDefaultFactory().close();
+            } catch (IOException ioe) {}
         }
     }
 }
-- 
GitLab