[ 
https://issues.apache.org/jira/browse/DERBY-4731?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mike Matrigali updated DERBY-4731:
----------------------------------


I verified the bug is reproducible against trunk using the attached test case.

The stores support of XA enforces certain protocols.  After a transaction has 
been prepared, no further activity on that transaction is expected.  The raw 
store enforces this by checking the state of the transaction for all logged 
operations.  It will throw a protocol error if any logged operation is 
attempted 
after the transaction has moved into PREPARE state.  This is the situation that 
the test case is 
causing.

In this case the global temporary table has been declared to not be logged and 
on commit to delete all the rows in the table.  It looks like the code to do 
this did not take into account XA transactions.  To 
provide the expected behavior with no logging, the SQL layer determines at 
commit time if any 
temp tables will need fix up, and in the case of delete on commit it implements 
this by creating new
empty containers and substituting these for the existing containers.   This 
action of creating a container
after the prepare is caught by store and the error is thrown.

I am not sure the right fix, but here are some options:

1) somehow figure out how to move the work to prepare, rather than commit - so 
that there is no
    work to do at commit time.
2) move the work to after the commit.  I think this will mean coming up with a 
different transaction 
    to do the work on.  Need to make sure all the work is done before user gets 
control back. 
    
option 2 seems best to me, not sure how tricky it is to come up with the right 
transaction to use.

> XA two phase commit with active  GLOBAL TEMPORARY TABLE causes  An internal 
> error identified by RawStore module
> ---------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-4731
>                 URL: https://issues.apache.org/jira/browse/DERBY-4731
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.3.3.0, 10.4.2.0, 10.5.3.0, 10.6.1.0, 10.7.0.0
>            Reporter: Kathey Marsden
>         Attachments: ReproXATempTable.java, utilXid.java
>
>
> If an XA  two phase commit is performed while an GLOBAL TEMPORARY TABLE is 
> active,  it will fail with:
> XAER_RMERR
> Exception in thread "main" javax.transaction.xa.XAException: An internal 
> error w
> as identified by RawStore module.
>         at 
> org.apache.derby.jdbc.EmbedXAResource.wrapInXAException(EmbedXAResour
> ce.java:820)
>         at 
> org.apache.derby.jdbc.EmbedXAResource.commit(EmbedXAResource.java:143
> )
>         at ReproXATempTable.tempTableInXA(ReproXATempTable.java:51)
>         at ReproXATempTable.main(ReproXATempTable.java:14)
> Caused by: java.sql.SQLTransactionRollbackException: An internal error was 
> ident
> ified by RawStore module.
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLE
> xceptionFactory40.java:88)
>         at 
> org.apache.derby.impl.jdbc.Util.generateCsSQLException(Util.java:256)
>         at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException
> (TransactionResourceImpl.java:391)
>         at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Tr
> ansactionResourceImpl.java:346)
>         at 
> org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConne
> ction.java:2269)
>         at 
> org.apache.derby.impl.jdbc.EmbedConnection.xa_commit(EmbedConnection.
> java:2924)
>         at 
> org.apache.derby.jdbc.XATransactionState.xa_commit(XATransactionState
> .java:339)
>         at 
> org.apache.derby.jdbc.EmbedXAResource.commit(EmbedXAResource.java:141
> )
>         ... 2 more
> Caused by: java.sql.SQLException: An internal error was identified by 
> RawStore m
> odule.
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExc
> eptionFactory.java:45)
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransport
> AcrossDRDA(SQLExceptionFactory40.java:119)
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLE
> xceptionFactory40.java:70)
>         ... 9 more
> Caused by: ERROR 40XT0: An internal error was identified by RawStore module.
>         at 
> org.apache.derby.iapi.error.StandardException.newException(StandardEx
> ception.java:276)
>         at 
> org.apache.derby.impl.store.raw.xact.Xact.setActiveState(Xact.java:18
> 09)
>         at 
> org.apache.derby.impl.store.raw.xact.Xact.addContainer(Xact.java:1357
> )
>         at org.apache.derby.impl.store.access.heap.Heap.create(Heap.java:274)
>         at 
> org.apache.derby.impl.store.access.heap.HeapConglomerateFactory.creat
> eConglomerate(HeapConglomerateFactory.java:195)
>         at 
> org.apache.derby.impl.store.access.RAMTransaction.createConglomerate(
> RAMTransaction.java:823)
>         at 
> org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.clean
> upTempTableOnCommitOrRollback(GenericLanguageConnectionContext.java:1345)
>         at 
> org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.doCom
> mit(GenericLanguageConnectionContext.java:1263)
>         at 
> org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.xaCom
> mit(GenericLanguageConnectionContext.java:1160)
>         at 
> org.apache.derby.impl.jdbc.EmbedConnection.xa_commit(EmbedConnection.
> java:2921)
>         ... 4 more
> See attached program for reproduction. 
> javac  -g ReproXATempTable.java utilXid.java
> java ReproXATempTable
> To work around the issue, you can drop the temp table before ending the xa 
> transaction.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to