You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Petr Nídl (JIRA)" <ji...@apache.org> on 2012/10/22 12:18:18 UTC

[jira] [Comment Edited] (AMQ-1063) Journaled JDBC checkpoint fails with java.io.IOException: Already started.

    [ https://issues.apache.org/jira/browse/AMQ-1063?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13481287#comment-13481287 ] 

Petr Nídl edited comment on AMQ-1063 at 10/22/12 10:17 AM:
-----------------------------------------------------------

I've analyzed the problem for 5.6.0 release. It happens when org.apache.activemq.store.journal.JournalPersistenceAdapter starts new transaction during checkpoint and fails to retrieve the database connection for this task. The main cause is in org.apache.activemq.store.jdbc.TransactionContext.begin() method (lines 153-159):

<pre>
153 public void begin() throws IOException {
154   if (inTx) {
155     throw new IOException("Already started.");
156   }
157   inTx = true;
158   connection = getConnection();
159 }
</pre>

Lines 157 and 158 should be switched because currently the TransactionContext instance is marked as "inTx" even though the getConnection() method throws an exception. From that moment the TransactionContext instance is marked as "inTx" forever and will never start new transaction again.
                
      was (Author: pnidl):
    I've analyzed the problem for 5.6.0 release. It happens when org.apache.activemq.store.journal.JournalPersistenceAdapter starts new transaction during checkpoint and fails to retrieve the database connection for this task. The main cause is in org.apache.activemq.store.jdbc.TransactionContext.begin() method (lines 153-159):

153 public void begin() throws IOException {
154   if (inTx) {
155     throw new IOException("Already started.");
156   }
157   inTx = true;
158   connection = getConnection();
159 }

Lines 157 and 158 should be switched because currently the TransactionContext instance is marked as "inTx" even though the getConnection() method throws an exception. From that moment the TransactionContext instance is marked as "inTx" forever and will never start new transaction again.
                  
> Journaled JDBC checkpoint fails with java.io.IOException: Already started.
> --------------------------------------------------------------------------
>
>                 Key: AMQ-1063
>                 URL: https://issues.apache.org/jira/browse/AMQ-1063
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 5.0.0
>         Environment: Windows XP Professional, JVM 1.5.0_09, MySQL 5.0.27
>            Reporter: jk@penguinsfan.com
>             Fix For: NEEDS_REVIEWED
>
>         Attachments: activemq.log.zip
>
>
> I am running trunk using JDBC against MySQL 5.0.27.  I am seeing the above mentioned IOException.  Do not have specific instructions on how to reproduce at the current time, but I was using durable subscriptions with the store durable cursor if that helps.  (I'll post if I find out more information.)
>       <persistenceAdapter>
>    
>       <journaledJDBC journalLogFiles="5" dataDirectory="../activemq-data" dataSource="#mysql-ds"/>
>     </persistenceAdapter>
>   <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
>     <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
>     <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
>     <property name="username" value="*** OMITTED ***"/>
>     <property name="password" value="*** OMITTED *** "/>
>     <property name="poolPreparedStatements" value="true"/>
>   </bean>  
> Log trace:
> 2006-11-19 19:19:48,078 [/127.0.0.1:4898] DEBUG JournalPersistenceAdapter      - Waking for checkpoint to complete.
> 2006-11-19 19:19:48,078 [eckpoint Worker] DEBUG JournalPersistenceAdapter      - Checkpoint started.
> 2006-11-19 19:19:48,078 [eckpoint Worker] ERROR JournalPersistenceAdapter      - Failed to checkpoint a message store: java.util.concurrent.ExecutionException: java.io.IOException: Already started.
> java.util.concurrent.ExecutionException: java.io.IOException: Already started.
> 	at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:205)
> 	at java.util.concurrent.FutureTask.get(FutureTask.java:80)
> 	at org.apache.activemq.store.journal.JournalPersistenceAdapter.doCheckpoint(JournalPersistenceAdapter.java:386)
> 	at org.apache.activemq.store.journal.JournalPersistenceAdapter$2.iterate(JournalPersistenceAdapter.java:129)
> 	at org.apache.activemq.thread.DedicatedTaskRunner.runTask(DedicatedTaskRunner.java:88)
> 	at org.apache.activemq.thread.DedicatedTaskRunner.access$0(DedicatedTaskRunner.java:76)
> 	at org.apache.activemq.thread.DedicatedTaskRunner$1.run(DedicatedTaskRunner.java:39)
> Caused by: java.io.IOException: Already started.
> 	at org.apache.activemq.store.jdbc.TransactionContext.begin(TransactionContext.java:145)
> 	at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.beginTransaction(JDBCPersistenceAdapter.java:358)
> 	at org.apache.activemq.store.journal.JournalPersistenceAdapter.beginTransaction(JournalPersistenceAdapter.java:189)
> 	at org.apache.activemq.util.TransactionTemplate.run(TransactionTemplate.java:41)
> 	at org.apache.activemq.store.journal.JournalMessageStore.checkpoint(JournalMessageStore.java:247)
> 	at org.apache.activemq.store.journal.JournalTopicMessageStore.checkpoint(JournalTopicMessageStore.java:162)
> 	at org.apache.activemq.store.journal.JournalPersistenceAdapter$5.call(JournalPersistenceAdapter.java:373)
> 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
> 	at java.util.concurrent.FutureTask.run(FutureTask.java:123)
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
> 	at java.lang.Thread.run(Thread.java:595)
> 2006-11-19 19:19:48,109 [eckpoint Worker] DEBUG JournalPersistenceAdapter      - Checkpoint done.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira