[CONJ-983] Connector/J call may stuck on acquiring lock Created: 2022-06-17  Updated: 2022-07-14  Resolved: 2022-06-21

Status: Closed
Project: MariaDB Connector/J
Component/s: Other
Affects Version/s: 2.7.2
Fix Version/s: 2.7.6

Type: Bug Priority: Major
Reporter: Valerii Kravchuk Assignee: Diego Dupin
Resolution: Fixed Votes: 0
Labels: None


 Description   

Looks like it's possible to get stuck while acquiring lock, like this:

... waiting on condition [0x00007f03666a0000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000526660bf8> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
at org.mariadb.jdbc.MariaDbStatement.executeInternal(MariaDbStatement.java:340)
at org.mariadb.jdbc.MariaDbStatement.execute(MariaDbStatement.java:501)
at org.apache.tomcat.jdbc.pool.PooledConnection.validate(PooledConnection.java:583)
at org.apache.tomcat.jdbc.pool.PooledConnection.validate(PooledConnection.java:485)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:832)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:674)
at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:198)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:136)
at com.appiancorp.rdbms.datasource.BusinessDataSourceConnectionProvider.getConnection(BusinessDataSourceConnectionProvider.java:63)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160)
at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:81)

The current theory is that during previous use of this connection, something went wrong which caused the connection to be returned to the pool without unlocking the lock.



 Comments   
Comment by Diego Dupin [ 2022-06-17 ]

Java connector use ReentrantLock in order to ensure thread concurrency issues. This error means that lock was acquied by another thread and has not been release. Thread is then stucked forever.

There is 2 possibles case that can lead there:

  • executing a CallableStatement commands while closing that CallableStatement during command execution in another thread.
  • using query timeout (for server before MariaDB 10.1.2 or during batch), timeout function beeing executed just when returning results => a exeption CancellationException is not catched skipping the lock.unlock().
Comment by Diego Dupin [ 2022-06-21 ]

this affect only 2.x series, not 3.0

Comment by Diego Dupin [ 2022-06-22 ]

correction available using snapshot :

<repositories>
    <repository>
        <id>sonatype-nexus-snapshots</id>
        <name>Sonatype Nexus Snapshots</name>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    </repository>
</repositories>
 
<dependencies>
    <dependency>
        <groupId>org.mariadb.jdbc</groupId>
        <artifactId>mariadb-java-client</artifactId>
        <version>2.7.6-SNAPSHOT</version>
    </dependency>
</dependencies>

Generated at Thu Feb 08 03:19:45 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.