diff --git a/history.txt b/history.txt index a1ad60ff9..03abe1c83 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,7 @@ +2015-01-30 zzz + * HTTP Proxy: More error page changes + * NTCP: Throttle event pumper if looping too fast (tickets #551, #1075, #1411) + 2015-01-29 zzz * SSU: - Fix replaceExternalAddress churn when firewalled diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index ea17ad55f..e1f87e077 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 15; + public final static long BUILD = 16; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java index b6f539c96..dd206a6a9 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java +++ b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java @@ -277,7 +277,19 @@ class EventPumper implements Runnable { } catch (ClosedSelectorException cse) { continue; } + } else { + // another 100% CPU workaround + if ((loopCount % 128) == 127) { + if (_log.shouldLog(Log.WARN)) + _log.warn("EventPumper throttle " + loopCount + " loops in " + + (System.currentTimeMillis() - lastFailsafeIteration) + " ms"); + try { + Thread.sleep(25); + } catch (InterruptedException ie) {} + } } + + // Clear the cache if the user changes the setting, // so we can test the effect. boolean newUseDirect = _context.getBooleanProperty(PROP_DIRECT);