You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Piotr Kubowicz (JIRA)" <ji...@apache.org> on 2013/02/27 11:03:12 UTC

[jira] [Created] (OPENJPA-2340) UnsupportedOperationException on commit/rollback a transaction without writes

Piotr Kubowicz created OPENJPA-2340:
---------------------------------------

             Summary: UnsupportedOperationException on commit/rollback a transaction without writes
                 Key: OPENJPA-2340
                 URL: https://issues.apache.org/jira/browse/OPENJPA-2340
             Project: OpenJPA
          Issue Type: Bug
          Components: kernel
    Affects Versions: 2.2.1
            Reporter: Piotr Kubowicz
         Attachments: BrokerImpl-trans-cache.patch

I met the following exception:

Caused by: <openjpa-2.2.1-r422266:1396819 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: IteratorChains must contain at least one Iterator
        at org.apache.openjpa.kernel.BrokerImpl.afterCompletion(BrokerImpl.java:2036)
        at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:94)
        at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1516)
        at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:933)
        at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:570)
        ... 37 more
Caused by: java.lang.UnsupportedOperationException: IteratorChains must contain at least one Iterator
        at org.apache.commons.collections.iterators.IteratorChain.checkChainIntegrity(Unknown Source)
        at org.apache.commons.collections.iterators.IteratorChain.lockChain(Unknown Source)
        at org.apache.commons.collections.iterators.IteratorChain.hasNext(Unknown Source)
        at org.apache.openjpa.kernel.BrokerImpl.endTransaction(BrokerImpl.java:2407)
        at org.apache.openjpa.kernel.BrokerImpl.afterCompletion(BrokerImpl.java:2012)
        ... 41 more

It's hard for me to provide a minimal reproduction steps. Generally what I am doing is:

manager.getTransaction().begin();
// save some entities joined in a complex way
manager.getTransaction().commit(); // fine
manager.clear();
manager.getTransaction().begin();
manager.getTransaction().rollback(); // throws exception

What is funny, I have an @After method in my test that does another:
manager.getTransaction().rollback();
and it succeeds.

After some debugging I found that the bug is in how BrokerImpl.endTransaction() initializes transStates:
- in the rollback that throws exceptions, hasTransactionalObjects() returns true, although _transCache.size() returns 0; iterator returned by the empty _transCache throws UnsupportedOperationException
- in the rollback in @After, hasTransactionalObjects() returns false, transStates is initialized with Collections.EMPTY_SET and there is no problem with the iterator

I attached a patch which makes hasTransactionalObjects() check not only if _transCache is null, but also if its empty.

--
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