Blair Zajac wrote:
Hello,

I have a test case for my JDBC DAO layer that runs 50 concurrent threads all inserting the same data to ensure that the DAO does not throw an error if the data is already in the table (more details on the app below). After working a while Derby 10.4.2.0 stops making progress, the java process shows 0% CPU utilization and Derby does not report a deadlock. Running kill -QUIT on java shows all threads waiting on something. After a while, one transaction will timeout.

Setting the lock timeout to -1 did not get the test to finish successfully. If I reduce the number of threads in the test to 10, then Derby successfully completes. The same exact code runs against PostgreSQL and Oracle all 50 threads complete successfully.

Connecting to the Derby server with ij and SELECTing on SYSCS_DIAG.LOCK_TABLE shows that the transaction that has all the locks that other transactions are waiting on is not in a WAIT state for any other lock. So according to this, it should be making progress, but it's not. Are there locks that the transaction can be waiting on that aren't reported by SYSCS_DIAG.LOCK_TABLE. Are there any other things to look at?

I have YourKit if that'll make it easier to help look at some internal structures to see what's happening. I can put a test case together that replicates the behavior outside of our application and but it'll take a little bit of coding and I can attach it later.

Hello Blair,

My only *guess* is that there might be a restructuring of a BTree going on, which is not correctly reported - and you might be experiencing a deadlock. To stop guessing and actually start understanding what's going on, it would be great if you could provide a standalone repro.
Such a repro is best handled by creating a bug report in Jira:
https://issues.apache.org/jira/browse/DERBY

Other things to try:
o Post the stack trace from the hang, preferably from a Derby debug build to get line numbers. o You don't say if you enabled "extended tracing". If not, see http://wiki.apache.org/db-derby/LockDebugging o Download the patch for DERBY-2991, build Derby and see if it solves your problem.


Regards,
--
Kristian


The application needs to treat a database more like a hash table than a database for some of the data that needs to be stored. The primary key for the row is a MD5 hash of the other columns, so if there are multiple clients connecting to the same Derby server and are given the same data, which can happen due to load balancing to the application servers, they'll all try to insert or update the same row.

As background, below is the schema and code showing what I'm doing. The schema has four tables, three of which represent a set of facilities and the fourth a location.


[ snip - sql/code ]


If there's anything else I can provide, please let me know.

Regards,
Blair


Reply via email to