[jboss-jira] [JBoss JIRA] (JBJCA-1355) set-tx-query-timeout does not work when the remaining transaction timeout is shorter than one second

Masafumi Miura (JIRA) issues at jboss.org
Sun Oct 1 22:42:00 EDT 2017


Masafumi Miura created JBJCA-1355:
-------------------------------------

             Summary: set-tx-query-timeout does not work when the remaining transaction timeout is shorter than one second
                 Key: JBJCA-1355
                 URL: https://issues.jboss.org/browse/JBJCA-1355
             Project: IronJacamar
          Issue Type: Bug
          Components: JDBC
            Reporter: Masafumi Miura


{{set-tx-query-timeout}} setting does not work when the remaining transaction timeout is shorter than one second (between 0-999 millis) due to incorrect round-up in IronJacamar {{WrapperDataSource#getTimeLeftBeforeTransactionTimeout()}}. 

---

{{WrappedConnection#checkConfiguredQueryTimeout()}} checks the returned value from {{WrapperDataSource#getTimeLeftBeforeTransactionTimeout()}} and set the value to query timeout if it's larger than 0. If it's not larger than 0, the configured query timeout ({{query-timeout}} in datasource setting) is used. This behavior itself is ok.

However, {{WrapperDataSource#getTimeLeftBeforeTransactionTimeout()}} incorrectly rounds up the returned value from transaction manager's {{TransactionTimeoutConfiguration#getTimeLeftBeforeTransactionTimeout()}}. And it results in returning 0 when the remaining transaction timeout is between 0-999 millis. This causes the issue.

Here's the related code from 1.3.7.Final (It's same in the latest 1.3 branch and 1.4 branch):

- https://github.com/ironjacamar/ironjacamar/blob/ironjacamar-1.3.7.Final/adapters/src/main/java/org/jboss/jca/adapters/jdbc/WrappedConnection.java#L2022-L2049
{code}
2022    /**
2023     * Check configured query timeout
2024     * @param ws The statement
2025     * @param explicitTimeout An explicit timeout value set
2026     * @exception SQLException Thrown if an error occurs
2027     */
2028    void checkConfiguredQueryTimeout(WrappedStatement ws, int explicitTimeout) throws SQLException
2029    {
2030       if (mc == null || dataSource == null)
2031          return;
2032 
2033       int timeout = 0;
2034 
2035       // Use the transaction timeout
2036       if (mc.isTransactionQueryTimeout())
2037       {
2038          timeout = dataSource.getTimeLeftBeforeTransactionTimeout();
2039          if (timeout > 0 && explicitTimeout > 0 && timeout > explicitTimeout)
2040             timeout = explicitTimeout;
2041       }
2042 
2043       // Look for a configured value
2044       if (timeout <= 0 && explicitTimeout <= 0)
2045          timeout = mc.getQueryTimeout();
2046 
2047       if (timeout > 0)
2048          ws.setQueryTimeout(timeout);
2049    }
{code}

- https://github.com/ironjacamar/ironjacamar/blob/ironjacamar-1.3.7.Final/adapters/src/main/java/org/jboss/jca/adapters/jdbc/WrapperDataSource.java#L190-L218
{code}
190    /**
191     * Get the time left before a transaction timeout
192     * @return The amount in seconds; <code>-1</code> if no timeout
193     * @exception SQLException Thrown if an error occurs
194     */
195    protected int getTimeLeftBeforeTransactionTimeout() throws SQLException
196    {
197       try
198       {
199          if (cm instanceof TransactionTimeoutConfiguration)
200          {
201             long timeout = ((TransactionTimeoutConfiguration) cm).getTimeLeftBeforeTransactionTimeout(true);
202             // No timeout
203             if (timeout == -1)
204                return -1;
205             // Round up to the nearest second
206             long result = timeout / 1000;
207             if ((result % 1000) != 0)
208                ++result;
209             return (int) result;
210          }
211          else
212             return -1;
213       }
214       catch (RollbackException e)
215       {
216          throw new SQLException(e);
217       }
218    }
{code}




--
This message was sent by Atlassian JIRA
(v7.2.3#72005)


More information about the jboss-jira mailing list