Author: toad Date: 2007-02-10 14:06:56 +0000 (Sat, 10 Feb 2007) New Revision: 11736
Modified: trunk/freenet/src/freenet/node/Node.java Log: Warn the user, if relevant, about spurious OOMs in JVMs prior to 1.4.2_13 and 1.5.0_10. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4855795 Modified: trunk/freenet/src/freenet/node/Node.java =================================================================== --- trunk/freenet/src/freenet/node/Node.java 2007-02-10 01:14:09 UTC (rev 11735) +++ trunk/freenet/src/freenet/node/Node.java 2007-02-10 14:06:56 UTC (rev 11736) @@ -1545,46 +1545,66 @@ if(logMINOR) Logger.minor(this, "JVM vendor: "+jvmVendor+", JVM version: "+jvmVersion+", OS name: "+osName+", OS version: "+osVersion); - // If we are using the wrapper, we ignore: - // Any problem should be detected by the watchdog and the node will be restarted - if(osName.equals("Linux") && jvmVendor.startsWith("Sun ") && - ((osVersion.indexOf("nptl")!=-1) || osVersion.startsWith("2.6") || - osVersion.startsWith("2.7") || osVersion.startsWith("3.")) - && !isUsingWrapper()) { - // Hopefully we won't still have to deal with this **** when THAT comes out! - // Check the environment. - String assumeKernel; - try { - // It is essential to check the environment. - // Make an alternative way to do it if you like. - assumeKernel = System.getenv("LD_ASSUME_KERNEL"); - } catch (Error e) { - assumeKernel = null; - assumeKernel = WrapperManager.getProperties().getProperty("set.LD_ASSUME_KERNEL"); + if(jvmVendor.startsWith("Sun ")) { + // Sun bugs + + // Spurious OOMs + // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4855795 + // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=2138757 + // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=2138759 + // Fixed in 1.5.0_10 and 1.4.2_13 + + boolean is142 = jvmVersion.startsWith("1.4.2_"); + boolean is150 = jvmVersion.startsWith("1.5.0_"); + + boolean spuriousOOMs = false; + + if(is142 || is150) { + String[] split = jvmVersion.split("_"); + String secondPart = split[1]; + if(secondPart.indexOf("-") != -1) { + split = secondPart.split("-"); + secondPart = split[0]; + } + int subver = Integer.parseInt(secondPart); + + if(is142) { + if(subver < 13) + spuriousOOMs = true; + } else /*if(is150)*/ { + if(subver < 10) + spuriousOOMs = true; + } } - if((assumeKernel == null) || (assumeKernel.length() == 0) || (!(assumeKernel.startsWith("2.2") || assumeKernel.startsWith("2.4")))) { - System.err.println(ERROR_SUN_NPTL); - Logger.error(this, ERROR_SUN_NPTL); + + if(spuriousOOMs) { + System.err.println("Please upgrade to at least sun jvm 1.4.2_13 or 1.5.0_10. This version is buggy and may cause spurious OutOfMemoryErrors."); clientCore.alerts.register(new UserAlert() { - public boolean userCanDismiss() { - return false; + public String dismissButtonText() { + // Not dismissable + return null; } - public String getTitle() { - return "Deadlocking likely due to buggy JVM/kernel combination"; + public HTMLNode getHTMLText() { + HTMLNode n = new HTMLNode("div"); + n.addChild("#", "The JVM you are using ("+System.getProperty("java.vm.version")+") is known to be "); + n.addChild("a", "href", "/?_CHECKED_HTTP_=http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4855795").addChild("#", "buggy"); + n.addChild("#", ". It may produce OutOfMemoryError's when there is plenty of memory available. Please upgrade to at least Sun JVM 1.4.2_13 or 1.5.0_10."); + return n; } - public String getText() { - return ERROR_SUN_NPTL; + public short getPriorityClass() { + return UserAlert.ERROR; } - public HTMLNode getHTMLText() { - return new HTMLNode("div", ERROR_SUN_NPTL); + public String getText() { + return "The JVM you are using ("+System.getProperty("java.vm.version")+") is known to be " + + "buggy. It may produce OutOfMemoryError's when there is plenty of memory available. Please upgrade to at least Sun JVM 1.4.2_13 or 1.5.0_10. See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4855795 ."; } - public short getPriorityClass() { - return UserAlert.CRITICAL_ERROR; + public String getTitle() { + return "Buggy JVM Warning"; } public boolean isValid() { @@ -1592,25 +1612,93 @@ } public void isValid(boolean validity) { - // Not clearable. + // Ignore } - public String dismissButtonText() { - // Not dismissable. - return null; + public void onDismiss() { + // Ignore } public boolean shouldUnregisterOnDismiss() { - // Not dismissable. return false; } - public void onDismiss() { - // Not dismissable. + public boolean userCanDismiss() { + // Cannot be dismissed + return false; } + }); } + + // If we are using the wrapper, we ignore: + // Any problem should be detected by the watchdog and the node will be restarted + if(osName.equals("Linux") && jvmVendor.startsWith("Sun ") && + ((osVersion.indexOf("nptl")!=-1) || osVersion.startsWith("2.6") || + osVersion.startsWith("2.7") || osVersion.startsWith("3.")) + && !isUsingWrapper()) { + // Hopefully we won't still have to deal with this **** when THAT comes out! + // Check the environment. + String assumeKernel; + try { + // It is essential to check the environment. + // Make an alternative way to do it if you like. + assumeKernel = System.getenv("LD_ASSUME_KERNEL"); + } catch (Error e) { + assumeKernel = null; + assumeKernel = WrapperManager.getProperties().getProperty("set.LD_ASSUME_KERNEL"); + } + if((assumeKernel == null) || (assumeKernel.length() == 0) || (!(assumeKernel.startsWith("2.2") || assumeKernel.startsWith("2.4")))) { + System.err.println(ERROR_SUN_NPTL); + Logger.error(this, ERROR_SUN_NPTL); + clientCore.alerts.register(new UserAlert() { + + public boolean userCanDismiss() { + return false; + } + + public String getTitle() { + return "Deadlocking likely due to buggy JVM/kernel combination"; + } + + public String getText() { + return ERROR_SUN_NPTL; + } + + public HTMLNode getHTMLText() { + return new HTMLNode("div", ERROR_SUN_NPTL); + } + + public short getPriorityClass() { + return UserAlert.CRITICAL_ERROR; + } + + public boolean isValid() { + return true; + } + + public void isValid(boolean validity) { + // Not clearable. + } + + public String dismissButtonText() { + // Not dismissable. + return null; + } + + public boolean shouldUnregisterOnDismiss() { + // Not dismissable. + return false; + } + + public void onDismiss() { + // Not dismissable. + } + }); + } + } } + } private long lastAcceptedRequest = -1;
