[ https://issues.apache.org/jira/browse/JENA-324?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Andy Seaborne resolved JENA-324. -------------------------------- Resolution: Fixed Fix Version/s: TDB 0.9.4 Assignee: Andy Seaborne "fixed" in the sense of "recovery is attempted". If the hardware is broken, few guarantees can be given. Partial commits were not possible and still aren't. > An exception thrown from commit() leaves the StoreConnection in an > inconsistent state. > -------------------------------------------------------------------------------------- > > Key: JENA-324 > URL: https://issues.apache.org/jira/browse/JENA-324 > Project: Apache Jena > Issue Type: Bug > Components: TDB > Affects Versions: TDB 0.9.1, TDB 0.9.2, TDB 0.9.3, TDB 0.9.4 > Reporter: Mark Buquor > Assignee: Andy Seaborne > Fix For: TDB 0.9.4 > > > An exception thrown from commit() leaves the StoreConnection in an > inconsistent state. > Example: After a commit() throws an IOException in prepare() due to > insufficient disk space, I see the following behavior: > dataset.isInTransaction() == false > dataset.abort() throws TDBTransactionException: "Transaction has already > committed or aborted" > dataset.end() appears OK > dataset.begin(ReadWrite.READ) appears OK > dataset.begin(ReadWrite.WRITE) blocks on writersWaiting.acquire() > > The debugger shows that the transaction is stuck in limbo: active, closed, > and unfinished. > TransactionManager.activeWriters: 1 > TransactionManager.activeTransactions: 1 > [Transaction: 151 : Mode=WRITE : State=CLOSED : X:\RELM1\] > changesPending=true > outcome=UNFINISHED > Short of a fix, it looks like the only option to clear the stuck transaction > is StoreConnection.expel(location, true), which has the comment "testing > only". > There's also the indeterminacy of ending a transaction that, as far as I can > tell at the Dataset level, may or may not be committed ("Transaction has > already committed or aborted"). > Rough outline of a commit: > state == TxnState.PREPARING > -- commitPrepare() > -- journal.write() > -- journal.sync() // Commit point. > state == TxnState.COMMITED > -- noteTxnCommit() > -- currentReaderView.set(null) > -- writersWaiting.release() > noteTxnCommit() is called after the commit and performs IO, so it appears > that if commit() throws an exception, it's not necessarily true that the > transaction is effectively aborted. -- 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