Issue Details (XML | Word | Printable)

Key: DERBY-1947
Type: Bug Bug
Status: Closed Closed
Resolution: Fixed
Priority: Major Major
Assignee: Dag H. Wanvik
Reporter: Rajesh Kartha
Votes: 1
Watchers: 3
Operations

If you were logged in you would be able to see more operations.
Derby

OutOfMemoryError after repeated calls to boot and shutdown a database

Created: 10/Oct/06 03:43 AM   Updated: 16/Nov/07 03:13 PM
Return to search
Component/s: Services
Affects Version/s: 10.0.2.0, 10.0.2.1, 10.1.1.0, 10.1.2.1, 10.1.3.1, 10.2.1.6
Fix Version/s: 10.3.1.4

Time Tracking:
Not Specified

File Attachments:
  Size
File Licensed for inclusion in ASF works DERBY-1947-1.diff 2007-03-24 04:32 PM Dag H. Wanvik 2 kB
File Licensed for inclusion in ASF works DERBY-1947-1.stat 2007-03-24 04:32 PM Dag H. Wanvik 0.1 kB
File Licensed for inclusion in ASF works DERBY-1947-2.diff 2007-03-27 10:00 PM Dag H. Wanvik 3 kB
File Licensed for inclusion in ASF works DERBY-1947-2.stat 2007-03-27 10:00 PM Dag H. Wanvik 0.1 kB
File Licensed for inclusion in ASF works DERBY-1947-3.diff 2007-04-18 05:06 PM Dag H. Wanvik 4 kB
File Licensed for inclusion in ASF works DERBY-1947-3.stat 2007-04-18 05:06 PM Dag H. Wanvik 0.2 kB
File Licensed for inclusion in ASF works DERBY-1947-4.diff 2007-04-20 01:52 PM Dag H. Wanvik 3 kB
File Licensed for inclusion in ASF works DERBY-1947-4.stat 2007-04-20 01:52 PM Dag H. Wanvik 0.1 kB
Text File Licensed for inclusion in ASF works ProcedureInTriggerTest-threadstacks.txt 2007-04-18 12:04 AM Dag H. Wanvik 5 kB
Java Source File Licensed for inclusion in ASF works testEmbedAndClient.java 2006-10-10 03:45 AM Rajesh Kartha 1 kB
Image Attachments:

1. HeapAnalysis_op.jpg
(140 kB)
Environment: Any
Issue Links:
Reference
 

Urgency: Normal
Resolution Date: 23/Apr/07 10:47 PM


 Description  « Hide
I came across this OOM issue while running some system tests involving
backup and restore against Derby. The test is expected to run forever but
using the default heap space it runs into OOM within 2 days. I earlier mentioned about this
in my reply to the 10.2.1.6 vote - http://www.nabble.com/Re%3A--VOTE--10.2.1.6-release-p6650528.html


Also there has been some discussions on the list on the related topic:
http://issues.apache.org/jira/browse/DERBY-23 and
http://www.nabble.com/question-about-shutdown-tf2300504.html


Basic Analysis:
--------------------

Wrote a simple Java app (attached to this issue) that booted and shutdown the same
database multiple times. Depending on the heapsize the program ran into the
OOM at some point, as expected. Some heap dump analysis using the IBM HeapAnalyzer
and revealed that the HashSet (allContexts) within org.apache.derby.iapi.services.context.ContextService
class seemed to be location of the leak (snapshot of the heapanalysis attached).

A little bit of debugging shows that:
 - for every:connection two ContextManager objects (say, cm1, cm2) are added to the HashSet
 - for every shutdown a new ContextManager object (say, cm3) is added and two objects are removed
 - the object removed are cm2 and cm3 - in that sequence
 - but the object cm1 gets left behind

This happens for every connect/shutdown sequence and since one of the ContextManager objects added to the
HashSet is not removed as a part of the cleanup, it contributes to growth in memory usage, hence
an OOM eventually.

For example:
============
A 64M heap could allow about 1107 iterations of connect/shutdown only before running into OOM and
created 1108 un-used ContextManager objects in the memory.

java -Xmx64M testEmbedAndClient
++++Debug: add() Size of allContexts HashSet obj= 1
----Debug: remove() Size of allContexts HashSet obj= 0
++++Debug: add() Size of allContexts HashSet obj= 1
----Debug: remove() Size of allContexts HashSet obj= 0
++++Debug: add() Size of allContexts HashSet obj= 1
++++Debug: add() Size of allContexts HashSet obj= 2

==== Database booted in embedded ====

++++Debug: add() Size of allContexts HashSet obj= 3
----Debug: remove() Size of allContexts HashSet obj= 2
----Debug: remove() Size of allContexts HashSet obj= 1

==== Shutdown complete in embedded ====

++++Debug: add() Size of allContexts HashSet obj= 2
++++Debug: add() Size of allContexts HashSet obj= 3

==== Database booted in embedded ====

++++Debug: add() Size of allContexts HashSet obj= 4
----Debug: remove() Size of allContexts HashSet obj= 3
----Debug: remove() Size of allContexts HashSet obj= 2
..
..
..
==== Database booted in embedded ====

++++Debug: add() Size of allContexts HashSet obj= 1109
----Debug: remove() Size of allContexts HashSet obj= 1108
----Debug: remove() Size of allContexts HashSet obj= 1107

==== Shutdown complete in embedded ====

++++Debug: add() Size of allContexts HashSet obj= 1108
++++Debug: add() Size of allContexts HashSet obj= 1109
----Debug: remove() Size of allContexts HashSet obj= 1108
java.sql.SQLException: Failed to start database 'testdb', see the next exception
 for details.
        at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:45)
        at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:89)
        at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:95)
        at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Util.java:174)

        at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(EmbedConnection.java:1985)
        at org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(EmbedConnection.java:1649)
        at org.apache.derby.impl.jdbc.EmbedConnection.<init>(EmbedConnection.java:223)
        at org.apache.derby.impl.jdbc.EmbedConnection30.<init>(EmbedConnection30.java:73)
        at org.apache.derby.jdbc.Driver30.getNewEmbedConnection(Driver30.java:74)
        at org.apache.derby.jdbc.InternalDriver.connect(InternalDriver.java:210)

----Debug: remove() Size of allContexts HashSet obj= 1107
        at org.apache.derby.jdbc.AutoloadedDriver.connect(AutoloadedDriver.java:117)
        at java.sql.DriverManager.getConnection(DriverManager.java:525)
        at java.sql.DriverManager.getConnection(DriverManager.java:193)
        at testEmbedAndClient.testInEmbedded(testEmbedAndClient.java:40)
        at testEmbedAndClient.main(testEmbedAndClient.java:19)
java.lang.OutOfMemoryError: Java heap space

OOM happened after 1107 iterations



 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Rajesh Kartha added a comment - 10/Oct/06 03:45 AM
Attaching the files I mentioned in the description of this issue.

Rajesh Kartha made changes - 10/Oct/06 03:45 AM
Field Original Value New Value
Attachment testEmbedAndClient.java [ 12342609 ]
Attachment HeapAnalysis_op.jpg [ 12342610 ]
Dag H. Wanvik made changes - 23/Mar/07 04:44 PM
Assignee Dag H. Wanvik [ dagw ]
Dag H. Wanvik added a comment - 24/Mar/07 04:32 PM
My analysis of this problem:

* When EmbedConnection#close is called from testEmbedAndClient.java:50, the
  call fails to clean up the connection properly, since the call to the
  private EmbedConnection#close(StandardException) never happens.

  This is due to the fact that the public close method first checks if
  the connection is already closed via a call to
  EmbedConnection#isClosed(). If so, close just returns,

  EmbedConnection#isClosed() returns true even though the connection is still
  marked as active, because the underlying database has been shut down. This
  fact makes TransactionResourceImpl#isActive() return false.

  Now, the connection objects and the TransactionResourceImpl will eventually
  be garbage collected, but the ContextManager object owned by
  TransactionResourceImpl, will not, leading to the memory leak. This is
  because the ContextManager object is referenced from the HashSet
  'allContexts' of the ContextService.

  Normally, the context manager object is removed from 'allContexts' when the
  EmbedConnection#close(exceptionclose) calls
  TransactionResourceImpl#cleanupOnError. However, it does not happen here
  since isClosed returns true, so EmbedConnection#close() never gets
  to call EmbedConnection#close(exceptionclose).

  Modifying the repro to never close the connection object, I also see
  the leak, since EmbedConnection#finalize similarly fails to call
  EmbedConnection#close(exceptionclose) when isClosed() returns true.

  More detail (feel free to skip ;)

  TransactionResourceImpl#cleanupOnError, in turn, calls
  ContextManager#cleanupOnError which, when popping its stack of contexts
  finally calls the stack's bottom SystemContext#cleanupOnError, which again
  makes this call on line 62:

      :
      getContextManager().owningCsf.removeContext(getContextManager());
      :

  which releases the context manager from 'allContexts' so it can be garbage
  collected.


* I have made a patch which makes the repro (and the modified repro I
  mentioned) work without running out of space: DERBY-1947-1.{diff,stat}.

  It modifies EmbedConnection#close to clean up in the case described
  above.

  It also adds a finalizer method to TransactionResourceImpl which
  calls ContextManager#cleanupOnError with an argument of
  StandardException.closeException(), if not done already. This
  catches the case when no close is called on the connection. This
  change would make the leak go away on its own for both repro cases,
  but I added the change to EmbedConnection#close also, since it
  purports to release database resources in its Javadoc.

  So, when the connection is closed or garbage collected, the
  ContextManager will be cleaned up as well, and the leak is plugged.

  suites.All and derbyall ran without incident on Sun JDK 1.6, Solaris
  10/x86.

* There is a related issue, DERBY-2480, for which Jeff Clary has
  produced a patch. They overlap, in that that both patches makes a
  changes to EmbedConnection#close, so we need to reconcile them for
  that method.

Dag H. Wanvik made changes - 24/Mar/07 04:32 PM
Attachment DERBY-1947-1.diff [ 12354147 ]
Attachment DERBY-1947-1.stat [ 12354148 ]
Dag H. Wanvik made changes - 24/Mar/07 04:32 PM
Derby Info [Patch Available]
Dag H. Wanvik added a comment - 24/Mar/07 04:41 PM
Please disregard the paragraph quoted below in my previous comment, the
correct version is given below (the original text reflects my first attempt
at the patch :)

> It also adds a finalizer method to TransactionResourceImpl which
> calls ContextManager#cleanupOnError with an argument of
> StandardException.closeException(), if not done already.

It also adds a finalizer method to EmbedConnection which
calls TransactionResourceImpl#cleanupOnError with an argument of
StandardException.closeException(), if not done already.

Bryan Pendleton added a comment - 25/Mar/07 03:32 PM
It seems like it would be nice if, instead of adding more code to
EmbedConnection.close(), we could instead just have EmbedConnection.close()
call EmbedConnection.close(StandardException), and have all the
EmbedConnection closing logic in one place. Right now there seems to
be logic in two EmbedConnection.close() methods, and also in the
finalize() method. Can it all be moved to the one close(exception) method
and have the other two be 1-line wrappers?


Dag H. Wanvik added a comment - 27/Mar/07 10:00 PM
Thanks for looking at this, Bryan!

Uploading a modified patch DERBY-1947-2 (supercedes DERBY-1947-1)
which addresses Bryan's comment, although I did not *quite* manage to
make it a one-liner ;)

I also noticed that the isClosed() method changes the internal state
variable 'active', thwarting the logic needed to get the cleanup done,
so I removed the call to setInactive() from isClosed(). I believe this
is safe. [Alterately, one call do all the cleanup needed from inside
isClosed() if the underlying transaction is not active.]

I further simplified the finalizer by removing the test for rootConnection
since this is done inside close(StandardException) anyway.

I verified the patch against the repro again, including the modified one
I described for the previous patch. I did not add a new test for this issue.

I ran derbyall and suites.All again with the patch against svn 521401
with successfully (modulo the often seen dblook error in derbyall),
Solaris 10/x86, Sun JDK1.6.

Dag H. Wanvik made changes - 27/Mar/07 10:00 PM
Attachment DERBY-1947-2.stat [ 12354370 ]
Attachment DERBY-1947-2.diff [ 12354369 ]
Bryan Pendleton added a comment - 28/Mar/07 01:15 AM
Hi Dag, the new patch looks very good to me. This sort of close
logic always seems to be a bit finicky, but I think you've got it
nicely packaged now.

John H. Embretsen made changes - 28/Mar/07 08:08 AM
Link This issue relates to DERBY-2480 [ DERBY-2480 ]
Dag H. Wanvik added a comment - 18/Apr/07 12:04 AM
I was getting ready to commit the patch for this issue, but then I
updated my trunk and found that the following newly
introduced/converted JUnit test makes Derby deadlock when the patch
(DERBY-1947-2) is active:

  ProcedureInTriggerTest

It looks like a deadlock in the VM (see also enclosed stacks of
involved threads) caused by the patch's use of finalizer code which
leads to synchronization, and I am at a loss presently for how to
resolve this best.

What seems to happen is this:
 
* In ProcedureInTriggerTest:388, a call to Stement#execute is performed:
   > s.execute("create trigger select_from_trig_table no cascade before " +
                               "delete on t1 for each STATEMENT call proc_reads_sql(1)");

  This call synchronizes on the current (root) connection object.

* At this time I believe there are still two nested connection objects
  from previous statements (the test uses triggers and stored
  procedures called from them), which are no longer referenced but for
  whom the finalizer has yet to run (not yet garbage collected).

* Now, the CreateTriggerConstantAction#executeConstantAction in line
  275 uses the Dependency manager to send an invalidate to the trigger
  table so that DML statements on this table will be recompiled. (see
  stack of thread "main" in attachment
  ProcedureInTriggerTest-threadstacks.txt).

* As a result of this, GenericPreparedStatement#prepareToInvalidate is
  called which again calls
  GenericLanguageConnectionContext#verifyNoOpenResultSets

* verifyNoOpenResultSets contains this sequence of calls:

   // There may be open ResultSet's that are yet to be garbage collected
        // let's try and force these out rather than throw an error
        System.gc();
        System.runFinalization();

* This last call causes deadlock. This seems to happens because the
  said nested connection's finalizers are attempted executed. With
  the patch, the finalizer of EmbedConnection contains a call to
  EmbedConnection#close which synchronizes on the root connection
  object (already locked by the "main" thread as part of the execute).
  The execution of the finalizer happens in a thread forked by the
  call to System.runFinalization(), which hangs waiting for the
  finalizer thread to complete (see Finalizer#forkSecondaryFinalizer's
  call to sft.join() ca line 115 in Sun JDK 1.6). Now, the finalizers
  are stuck waiting for the lock held my "main", so deadlock ensues.

* Now, without the call to System.runFinalization(); the test runs
  successfully, presumably because the two connection objects will
  then be garbage collected later, after s.execute() has terminated.

  Also, removing the call to System.gc() removes the deadlock, but
  this breaks the test however (verifyNoOpenResultSets throws X0X95.S
  - LANG_CANT_INVALIDATE_OPEN_RESULT_SET in line 1733):
    
     "Operation 'CREATE TRIGGER' cannot be performed on object 'T1'
      because there is an open ResultSet dependent on that object."

  So it would seem that calling System.gc() is sufficient, but
  System.runFinalization is harmful, since it will wait for
  finalization to finish, which is a dangerous thing if the thread
  already holds locks. *Or* one could argue that the finalizers should
  never call anything that could require a lock (too strict in my
  view).

So, now I am trying to understand what would be the correct approach
to resolve this.

- Without the call to close in the finalizer of EmbedConnection, we
  have DERBY-1947, that is, ContextManager objects is referenced from
  the HashSet 'allContexts' of the ContextService may leak.

- With the call to close in the finalizer of EmbedConnection, we risk
  deadlock as long as any Derby code calls System.runFinalization()
  anywhere. Grepping, i see this happens in three places in the
  engine:
        
  LowMemory.java:95: System.runFinalization();
  GenericLanguageConnectionContext.java:1617: System.runFinalization();
  GenericLanguageConnectionContext.java:1709: System.runFinalization();

Possible approaches:

1) Maybe we could change the HashSet 'allContexts' of the
   ContextService to use weak hash map perhaps, a WeakHashSet, if there
   is such a thing. That way, the ContextManager objects would be
   cleaned eventually.

2) Remove the explicit calls to System.runFinalization. It seems that
   keeping just the System.gc() call is less risky, but may be less
   efficient, so could break existing apps? The System.gc() is not
   guaranteed to yield results anyway..

3) Figure out a way to explicitly close the result sets in question,
   so the gc calls would be redundant. I am not sure how easy this
   would be; they are probably there for a good reason.

4) Remove the calls and allow the execution to fail as indicated in
   the comment of verifyNoOpenResultSets:

   // There may be open ResultSet's that are yet to be garbage collected
   // let's try and force these out rather than throw an error
   System.gc();
   System.runFinalization();
 
   This could break existing apps.

5) other ideas..?

Finally, can this deadlock be considered a Java run-time error? If
not, what is the contract being broken by Derby app code in the above?
I tried to search a bit around advisability of explicitly running
runFinalization, in the presence of held Java locks, and finalizers
which can cause locks, but I didn't find anything conclusive...

Any advise is appreciated :)


Dag H. Wanvik made changes - 18/Apr/07 12:04 AM
Attachment ProcedureInTriggerTest-threadstacks.txt [ 12355722 ]
Rick Hillegas added a comment - 18/Apr/07 04:19 PM
Hi Dag,

>1) Maybe we could change the HashSet 'allContexts' of the
> ContextService to use weak hash map perhaps, a WeakHashSet, if there
> is such a thing. That way, the ContextManager objects would be
> cleaned eventually.

Maybe you could press java.util.WeakHashMap into service. Its javadoc suggests the following issues:

a) You would need to choose something innocuous for the values in this map. You're only interested in the keys and garbage-collectible values would need to be wrapped in WeakReferences.

b) ContextService.notifyAllActiveThreads() would need to be insulated from disappearing keys. Also, for the record, it looks to me as though the Thread.interrupt() call needs to be wrapped in a privileged action block.

Dag H. Wanvik added a comment - 18/Apr/07 04:38 PM
A data point: In addition to the patch, I removed both calls to
System.runFinalization() from GenericLanguageConnectionContext.java,
but kept the calls to System.gc().

I ran suites.All end derbyall successfully with both Sun JDK1.4.2 and
1.6 (sane jars), so I wonder if this may be the simplest way to resolve this.

Does anyone know if/why the calls to System.runFinalization() are
(sometimes only, it would seem) necessary?

The calls to System.runFinalization() has been there since incubation
as far as I can tell.

In any case, I will prepare a patch which contains this change as
well, maybe then someone can test on other VMs; I wonder whether the
behavior could differ in a significant way between VMs here.

Dag H. Wanvik added a comment - 18/Apr/07 05:06 PM
Uploaded patch DERBY-1947-3, which is the same as *-2, except
that two calls to System.runFinalization have been commented out,
please see previous comment.

Dag H. Wanvik made changes - 18/Apr/07 05:06 PM
Attachment DERBY-1947-3.diff [ 12355775 ]
Attachment DERBY-1947-3.stat [ 12355776 ]
Repository Revision Date User Message
ASF #530159 Wed Apr 18 21:15:21 UTC 2007 bpendleton DERBY-2480: getConnection leaks memory when connecting to non-existent db

This patch was contributed by Jeff Clary (jclary@actuate.com). The test
program was contributed by John Embretsen (John.Embretsen@Sun.com) based
on the original reproduction program contributed by Jeff Clary.

The issue is that repeated calls to java.sql.DriverManager.getConnection(
"jdbc:derby:C:\\DOES_NOT_EXIST") leak memory and eventually lead to an
OutOfMemoryError.

This bug is similar to DERBY-1947 in that ContextManager objects are not
getting removed from the HashSet.

The change adds a call to cleanupOnError to EmbedConnection's constructor.
Files Changed
ADD /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/memory/ConnectionHandlingJunit.java
ADD /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/memory/build.xml
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection.java
MODIFY /db/derby/code/trunk/java/testing/build.xml

Dag H. Wanvik added a comment - 19/Apr/07 11:51 PM
More data:
Unfortunately, without the call to System.runFinalization(),
ProcedureInTriggerTest fails on Linux with Sun JDKs
with LANG_CANT_INVALIDATE_OPEN_RESULT_SET.
Keeping the call, it deadlocks, as on Solaris.

For the IBM 1.5 VM, keeping the call, there is no deadlock,
but the error happens. As soon as the finalizer of the nested
EmbedConnection objects (non-root) synchronize,
the failure happens, but at least the VM doesn't deadlock...
Presumably the failure happens because the finalizers can't complete
when gc() and runFinalization() is called, barring the
result sets from being garbage collected as well.

I'll have to try another tack than removing the call to

Dag H. Wanvik added a comment - 19/Apr/07 11:55 PM
.. to complete the sentence of the previous comment:

I'll have to try another tack than removing the call to
System.runFinalization().

Knut Anders Hatlen added a comment - 20/Apr/07 10:22 AM
> Presumably the failure happens because the finalizers can't complete
> when gc() and runFinalization() is called, barring the
> result sets from being garbage collected as well.

It could also be that gc() just makes the garbage collection start, possibly in another thread, so that runFinalization() is called before the objects are marked as unreferenced. IIRC, gc() doesn't block whereas runFinalization() does.

Note that the IBM 1.5 VM implemented a much more aggressive gc than previous versions. I remember that many tests had to be rewritten when people started running tests with that VM because ResultSets were closed earlier, etc. That probably explains why you don't see the deadlock in runFinalization() on IBM 1.5, since the objects most likely are gc'ed and finalized before you come to that point.

Dag H. Wanvik added a comment - 20/Apr/07 01:37 PM
Thanks for looking at this Knut!

> It could also be that gc() just makes the garbage collection start,
> possibly in another thread, so that runFinalization() is called before
> the objects are marked as unreferenced. IIRC, gc() doesn't block
> whereas runFinalization() does.

On Solaris, gc() alone manages to clear up the result set objects in
time: Not sure how that works; possibly the marking of the nested
connection objects makes it possible to also mark the result set
objects which are then effectively collected in time for the test in
#prepareToInvalidate() even though the connection objects can't yet be
finalized (blocked). As you say, since gc() doesn't block, there is no deadlock,
and it works.

> Note that the IBM 1.5 VM implemented a much more aggressive gc than
> previous versions. I remember that many tests had to be rewritten when
> people started running tests with that VM because ResultSets were

On Linux with SUN VM and with the IBM VM, gc() alone are not able to
free the result set objects in time, but this is could be timing
dependent.

> closed earlier, etc. That probably explains why you don't see the
> deadlock in runFinalization() on IBM 1.5, since the objects most
> likely are gc'ed and finalized before you come to that point.

No, I get the error with the IBM VM too, so the calls are
necessary. But they will not succeed in finalizing the nested
connection objects (unless they are collected earlier but result set
objects are not) but at least it doesn't deadlock.

I will upload a new patch which avoids synchronization in the
finalizer of nested connection objects, which solves the deadlock
problem.

Dag H. Wanvik added a comment - 20/Apr/07 01:52 PM
This version of the patch, DERBY-1947-4.* supercedes all earlier versions.
It removes the call to close() from the finalizer of EmbedConnection for nested
connection objects introduced in earlier versions of this patch as it is not strictly necessary. This solves the deadlock issue.

suites.All and derbyall + the repro run cleanly with Sun 1.4 on Solaris.
I have verified the repro and ProcudureInTriggerTest against Sun 1.4 and IBM 1.5 on Linux as well.

Unless I get feedback on this version I will commit it on Monday.


Dag H. Wanvik made changes - 20/Apr/07 01:52 PM
Attachment DERBY-1947-4.diff [ 12355927 ]
Attachment DERBY-1947-4.stat [ 12355928 ]
Repository Revision Date User Message
ASF #531638 Mon Apr 23 22:44:25 UTC 2007 dag DERBY-1947 OutOfMemoryError after repeated calls to boot and shutdown a database

Committed DERBY-1947-4.diff.
Files Changed
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection.java

Dag H. Wanvik added a comment - 23/Apr/07 10:46 PM
Committed DERBY-1947-4.* as svn 531638 and resolving it.


Dag H. Wanvik made changes - 23/Apr/07 10:47 PM
Status Open [ 1 ] Resolved [ 5 ]
Derby Info [Patch Available]
Fix Version/s 10.3.0.0 [ 12310800 ]
Resolution Fixed [ 1 ]
Dag H. Wanvik made changes - 25/Apr/07 12:13 AM
Link This issue relates to DERBY-1585 [ DERBY-1585 ]
Dag H. Wanvik made changes - 16/Nov/07 03:13 PM
Status Resolved [ 5 ] Closed [ 6 ]