[ https://issues.apache.org/jira/browse/DERBY-6114?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Knut Anders Hatlen updated DERBY-6114: -------------------------------------- Attachment: derby-6114-1a-purge.diff I'm currently running tests on the attached derby-6114-1a-purge.diff patch. This patch makes the timer factory invoke purge() on the timer on every 1000th cancellation. The number 1000 was picked arbitrarily. It didn't feel right to do it every time a task was cancelled (as that's the path taken on normal execution when a transaction timeout is in effect). 1000 sounded like a reasonable trade-off. 1000 cancelled tasks won't take up very much memory, and traversing the timer's queue once per 1000 successful transaction doesn't sound like a very high cost. A new implementation of TimerFactory is added, Java5SingletonTimerFactory, which extends the existing SingletonTimerFactory. A new factory is not necessary on trunk, since Java 6 is the base level, but it eases back-porting to older branches where the purge() method is not available on the base level. I plan to collapse Java5SingletonTimerFactory and SingletonTimerFactory on trunk once the fix has been back-ported. I do *not* plan to implement a specific fix for Java 1.4 and/or CDC on older branches. They will still have the old behaviour. Note that "ant junit-lowmem" only runs if the JVM is at least at level 1.5, so the test problems don't affect the old platforms. The patch changes the TimerFactory interface so that it doesn't return a reference to the actual java.util.Timer instance. This makes it easier to hide the logic inside the factory, rather than duplicating logic for purging tasks at the callers. The patch removes the comment in memory._Suite that says the test has to run as the last test (DERBY-5394), as it is no longer the case that the test holds on to a lot of garbage when it's done. I ran XAMemTest with 12MB heap with and without the patch. The patch reduced the time to complete the test from 15 minutes to 1 minute due to earlier release of the task instances and lower GC overhead. > OOME in XAMemTest.testDerby4137_TransactionTimeoutSpecifiedNotExceeded > ---------------------------------------------------------------------- > > Key: DERBY-6114 > URL: https://issues.apache.org/jira/browse/DERBY-6114 > Project: Derby > Issue Type: Bug > Components: Test > Affects Versions: 10.9.2.2, 10.10.1.1 > Environment: Derby head of 10.10 branch. ubuntu3 slave on > builds.apache.org. Java SE 7u4, 64-bit. > java.vendor=Oracle Corporation > java.runtime.version=1.7.0_04-b20 > os.name=Linux > os.arch=amd64 > os.version=3.2.0-38-generic > Reporter: Knut Anders Hatlen > Assignee: Knut Anders Hatlen > Priority: Minor > Attachments: derby-6114-1a-purge.diff, derby.log, error-stacktrace.out > > > Seen twice in a row in https://builds.apache.org/job/Derby-10.10-suites.All/ : > junit-lowmem: > [junit] Running org.apache.derbyTesting.functionTests.tests.memory._Suite > [junit] Exception in thread "DRDAConnThread_11" > java.lang.OutOfMemoryError: GC overhead limit exceeded > [junit] at java.util.Properties$LineReader.<init>(Properties.java:405) > [junit] at java.util.Properties.load(Properties.java:341) > [junit] at > java.util.PropertyResourceBundle.<init>(PropertyResourceBundle.java:130) > [junit] at > java.util.ResourceBundle$Control.newBundle(ResourceBundle.java:2610) > [junit] at java.util.ResourceBundle.loadBundle(ResourceBundle.java:1436) > [junit] at java.util.ResourceBundle.findBundle(ResourceBundle.java:1400) > [junit] at java.util.ResourceBundle.findBundle(ResourceBundle.java:1354) > [junit] at > java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1296) > [junit] at java.util.ResourceBundle.getBundle(ResourceBundle.java:796) > [junit] at > org.apache.derby.iapi.services.i18n.MessageService.getBundleWithEnDefault(MessageService.java:318) > [junit] at > org.apache.derby.iapi.services.i18n.MessageService.getBundleForLocale(MessageService.java:53) > [junit] at > org.apache.derby.iapi.services.i18n.MessageService.getBundle(MessageService.java:302) > [junit] at > org.apache.derby.iapi.services.i18n.MessageService.getCompleteMessage(MessageService.java:97) > [junit] at > org.apache.derby.iapi.error.SQLWarningFactory.newSQLWarning(SQLWarningFactory.java:97) > [junit] at > org.apache.derby.iapi.error.SQLWarningFactory.newSQLWarning(SQLWarningFactory.java:50) > [junit] at > org.apache.derby.iapi.jdbc.BrokeredConnection.statementHoldabilityCheck(BrokeredConnection.java:736) > [junit] at > org.apache.derby.iapi.jdbc.BrokeredConnection.prepareStatement(BrokeredConnection.java:690) > [junit] at > org.apache.derby.impl.drda.DRDAStatement.prepare(DRDAStatement.java:669) > [junit] at > org.apache.derby.impl.drda.DRDAStatement.explicitPrepare(DRDAStatement.java:630) > [junit] at > org.apache.derby.impl.drda.DRDAConnThread.parsePRPSQLSTT(DRDAConnThread.java:3912) > [junit] at > org.apache.derby.impl.drda.DRDAConnThread.processCommands(DRDAConnThread.java:811) > [junit] at > org.apache.derby.impl.drda.DRDAConnThread.run(DRDAConnThread.java:295) > [junit] Tests run: 67, Failures: 0, Errors: 1, Time elapsed: 1,571.059 sec > [junit] Test org.apache.derbyTesting.functionTests.tests.memory._Suite > FAILED -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira