Return-Path: X-Original-To: apmail-db-derby-commits-archive@www.apache.org Delivered-To: apmail-db-derby-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 0656C106CE for ; Wed, 12 Jun 2013 07:36:04 +0000 (UTC) Received: (qmail 2047 invoked by uid 500); 12 Jun 2013 07:36:03 -0000 Delivered-To: apmail-db-derby-commits-archive@db.apache.org Received: (qmail 2025 invoked by uid 500); 12 Jun 2013 07:36:03 -0000 Mailing-List: contact derby-commits-help@db.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: "Derby Development" List-Id: Delivered-To: mailing list derby-commits@db.apache.org Received: (qmail 2013 invoked by uid 99); 12 Jun 2013 07:36:02 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 12 Jun 2013 07:36:02 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 12 Jun 2013 07:36:00 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 4216E23889BB; Wed, 12 Jun 2013 07:35:41 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1492094 - in /db/derby/code/trunk/java: engine/org/apache/derby/ engine/org/apache/derby/iapi/services/timer/ engine/org/apache/derby/impl/services/timer/ engine/org/apache/derby/impl/sql/conn/ engine/org/apache/derby/jdbc/ testing/org/apa... Date: Wed, 12 Jun 2013 07:35:40 -0000 To: derby-commits@db.apache.org From: kahatlen@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20130612073541.4216E23889BB@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: kahatlen Date: Wed Jun 12 07:35:40 2013 New Revision: 1492094 URL: http://svn.apache.org/r1492094 Log: DERBY-6114: OOME in XAMemTest.testDerby4137_TransactionTimeoutSpecifiedNotExceeded Periodically run purge() on the cancellation timer to reclaim the space occupied by cancelled tasks. Added: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/timer/Java5SingletonTimerFactory.java (with props) Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/timer/TimerFactory.java db/derby/code/trunk/java/engine/org/apache/derby/impl/services/timer/SingletonTimerFactory.java db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/conn/GenericStatementContext.java db/derby/code/trunk/java/engine/org/apache/derby/jdbc/XATransactionState.java db/derby/code/trunk/java/engine/org/apache/derby/modules.properties db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/memory/_Suite.java Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/timer/TimerFactory.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/timer/TimerFactory.java?rev=1492094&r1=1492093&r2=1492094&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/timer/TimerFactory.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/timer/TimerFactory.java Wed Jun 12 07:35:40 2013 @@ -21,7 +21,7 @@ package org.apache.derby.iapi.services.timer; -import java.util.Timer; +import java.util.TimerTask; /** * This class provides access to Timer objects for various purposes. @@ -30,10 +30,17 @@ import java.util.Timer; public interface TimerFactory { /** - * Returns a Timer object that can be used for adding TimerTasks - * that cancel executing statements. + * Schedule a task. * - * @return a Timer object for cancelling statements. + * @param task the task to schedule + * @param delay how many milliseconds to wait before executing the task */ - public Timer getCancellationTimer(); + void schedule(TimerTask task, long delay); + + /** + * Cancel a task. + * + * @param task the task to cancel + */ + void cancel(TimerTask task); } Added: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/timer/Java5SingletonTimerFactory.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/services/timer/Java5SingletonTimerFactory.java?rev=1492094&view=auto ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/impl/services/timer/Java5SingletonTimerFactory.java (added) +++ db/derby/code/trunk/java/engine/org/apache/derby/impl/services/timer/Java5SingletonTimerFactory.java Wed Jun 12 07:35:40 2013 @@ -0,0 +1,54 @@ +/* + + Derby - Class org.apache.derby.impl.services.timer.Java5SingletonTimerFactory + + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to you under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + */ + +package org.apache.derby.impl.services.timer; + +import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Extension of {@code SingletonTimerFactory} that takes advantage of the + * new {@code Timer.purge()} method in Java 5. + */ +public class Java5SingletonTimerFactory extends SingletonTimerFactory { + /** + * The number of times {@link #cancel(TimerTask)} has been called. + * Used for determining whether it's time to purge cancelled tasks from + * the timer. + */ + private final AtomicInteger cancelCount = new AtomicInteger(); + + @Override public void cancel(TimerTask task) { + super.cancel(task); + + // DERBY-6114: Cancelled tasks stay in the timer's queue until they + // are scheduled to run, unless we call the purge() method. This + // prevents garbage collection of the tasks. Even though the tasks + // are small objects, there could be many of them, especially when + // both the transaction throughput and tasks' delays are high, it + // could lead to OutOfMemoryErrors. Since purge() could be a heavy + // operation if the queue is big, we don't call it every time a task + // is cancelled. + if (cancelCount.incrementAndGet() % 1000 == 0) { + getCancellationTimer().purge(); + } + } +} Propchange: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/timer/Java5SingletonTimerFactory.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/timer/SingletonTimerFactory.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/services/timer/SingletonTimerFactory.java?rev=1492094&r1=1492093&r2=1492094&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/impl/services/timer/SingletonTimerFactory.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/impl/services/timer/SingletonTimerFactory.java Wed Jun 12 07:35:40 2013 @@ -29,6 +29,7 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Timer; import java.util.Properties; +import java.util.TimerTask; /** @@ -119,17 +120,27 @@ public class SingletonTimerFactory * Returns a Timer object that can be used for adding TimerTasks * that cancel executing statements. * - * Implements the TimerFactory interface. - * * @return a Timer object for cancelling statements. - * - * @see TimerFactory */ - public Timer getCancellationTimer() + Timer getCancellationTimer() { return singletonTimer; } + // TimerFactory interface methods + + /** {@inheritDoc} */ + public void schedule(TimerTask task, long delay) { + singletonTimer.schedule(task, delay); + } + + /** {@inheritDoc} */ + public void cancel(TimerTask task) { + task.cancel(); + } + + // ModuleControl interface methods + /** * Currently does nothing, singleton Timer instance is initialized * in the constructor. Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/conn/GenericStatementContext.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/conn/GenericStatementContext.java?rev=1492094&r1=1492093&r2=1492094&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/conn/GenericStatementContext.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/conn/GenericStatementContext.java Wed Jun 12 07:35:40 2013 @@ -50,7 +50,6 @@ import org.apache.derby.iapi.error.Excep import org.apache.derby.iapi.reference.SQLState; import java.util.ArrayList; import java.util.Iterator; -import java.util.Timer; import java.util.TimerTask; /** @@ -184,10 +183,14 @@ final class GenericStatementContext synchronized (this) { statementContext = null; } - cancel(); + getTimerFactory().cancel(this); } } + private static TimerFactory getTimerFactory() { + return Monitor.getMonitor().getTimerFactory(); + } + // StatementContext Interface public void setInUse @@ -209,10 +212,8 @@ final class GenericStatementContext this.pvs = pvs; rollbackParentContext = false; if (timeoutMillis > 0) { - TimerFactory factory = Monitor.getMonitor().getTimerFactory(); - Timer timer = factory.getCancellationTimer(); cancelTask = new CancelQueryTask(this); - timer.schedule(cancelTask, timeoutMillis); + getTimerFactory().schedule(cancelTask, timeoutMillis); } } Modified: db/derby/code/trunk/java/engine/org/apache/derby/jdbc/XATransactionState.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/jdbc/XATransactionState.java?rev=1492094&r1=1492093&r2=1492094&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/jdbc/XATransactionState.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/jdbc/XATransactionState.java Wed Jun 12 07:35:40 2013 @@ -23,7 +23,6 @@ package org.apache.derby.jdbc; import java.sql.SQLException; -import java.util.Timer; import java.util.TimerTask; import org.apache.derby.iapi.services.monitor.Monitor; import org.apache.derby.iapi.services.timer.TimerFactory; @@ -120,7 +119,9 @@ final class XATransactionState extends C } } - + private static TimerFactory getTimerFactory() { + return Monitor.getMonitor().getTimerFactory(); + } XATransactionState(ContextManager cm, EmbedConnection conn, EmbedXAResource resource, XAXactId xid) { @@ -317,7 +318,7 @@ final class XATransactionState extends C } /** - * Schedule a timeout task wich will rollback the global transaction + * Schedule a timeout task which will rollback the global transaction * after the specified time will elapse. * * @param timeoutMillis The number of milliseconds to be elapsed before @@ -329,10 +330,8 @@ final class XATransactionState extends C // schedule a time out task if the timeout was specified if (timeoutMillis > 0) { // take care of the transaction timeout - TimerFactory timerFactory = Monitor.getMonitor().getTimerFactory(); - Timer timer = timerFactory.getCancellationTimer(); timeoutTask = new CancelXATransactionTask(this); - timer.schedule(timeoutTask, timeoutMillis); + getTimerFactory().schedule(timeoutTask, timeoutMillis); } else { timeoutTask = null; } @@ -377,7 +376,7 @@ final class XATransactionState extends C */ private void xa_finalize() { if (timeoutTask != null) { - timeoutTask.cancel(); + getTimerFactory().cancel(timeoutTask); timeoutTask = null; } performTimeoutRollback = false; Modified: db/derby/code/trunk/java/engine/org/apache/derby/modules.properties URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/modules.properties?rev=1492094&r1=1492093&r2=1492094&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/modules.properties (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/modules.properties Wed Jun 12 07:35:40 2013 @@ -129,8 +129,13 @@ derby.module.uuidJ1=org.apache.derby.impl.services.uuid.BasicUUIDFactory cloudscape.config.uuidJ1=all -derby.module.timer=org.apache.derby.impl.services.timer.SingletonTimerFactory -cloudscape.config.timer=all +derby.module.timerJ1=org.apache.derby.impl.services.timer.SingletonTimerFactory +cloudscape.config.timerJ1=all + +# Use a different TimerFactory on Java 5 to take advantage of Timer.purge(). +derby.module.timerJ6=org.apache.derby.impl.services.timer.Java5SingletonTimerFactory +derby.env.jdk.timerJ6=6 +cloudscape.config.timerJ6=all # ConcurrentCache requires JDK 1.5 (constant 6) derby.module.cacheManagerJ6=org.apache.derby.impl.services.cache.ConcurrentCacheFactory Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/memory/_Suite.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/memory/_Suite.java?rev=1492094&r1=1492093&r2=1492094&view=diff ============================================================================== --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/memory/_Suite.java (original) +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/memory/_Suite.java Wed Jun 12 07:35:40 2013 @@ -43,8 +43,6 @@ public class _Suite extends BaseJDBCTest suite.addTest(Derby3009Test.suite()); suite.addTest(Derby5730Test.suite()); suite.addTest(MemoryLeakFixesTest.suite()); - - // DERBY-5394: Let this test run as the last test - it eats up memory. suite.addTest(XAMemTest.suite()); return suite; }