Skip to content

Crash on an interrupted thread #237

@miroch41

Description

@miroch41

Bug Description
If a thread running the transaction gets interrupted, Atomikos fails with a crash.

To reproduce
Just call

Thread.currentThread().interrupt();

On transaction boundary the application crashes, as Atomikos tries to write a checkpoint. However, writing in the respective file fails in the interrupted thread. If you try to commit, it fails and data are not committed. The exception follows:

Caused by: jakarta.transaction.RollbackException: Error in committing: could not flush state image java.nio.channels.ClosedByInterruptException com.atomikos.recovery.LogWriteException - recovery will clean up in the background
	at com.atomikos.icatch.jta.TransactionImp.rethrowAsJtaRollbackException(TransactionImp.java:49)
	at com.atomikos.icatch.jta.TransactionImp.commit(TransactionImp.java:192)
	at com.atomikos.icatch.jta.TransactionManagerImp.commit(TransactionManagerImp.java:428)
	at com.atomikos.icatch.jta.UserTransactionManager.commit(UserTransactionManager.java:160)
	at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1026)
	... 44 more
Caused by: java.lang.IllegalStateException: could not flush state image java.nio.channels.ClosedByInterruptException com.atomikos.recovery.LogWriteException
	at com.atomikos.persistence.imp.StateRecoveryManagerImp.preEnter(StateRecoveryManagerImp.java:54)
	at com.atomikos.finitestates.FSMImp.notifyListeners(FSMImp.java:102)
	at com.atomikos.finitestates.FSMImp.setState(FSMImp.java:180)
	at com.atomikos.icatch.imp.CoordinatorImp.setState(CoordinatorImp.java:283)
	at com.atomikos.icatch.imp.CoordinatorStateHandler.commitFromWithinCallback(CoordinatorStateHandler.java:346)
	at com.atomikos.icatch.imp.ActiveStateHandler$6.doCommit(ActiveStateHandler.java:285)
	at com.atomikos.icatch.imp.CoordinatorStateHandler.commitWithAfterCompletionNotification(CoordinatorStateHandler.java:587)
	at com.atomikos.icatch.imp.ActiveStateHandler.commit(ActiveStateHandler.java:280)
	at com.atomikos.icatch.imp.CoordinatorImp.commit(CoordinatorImp.java:547)
	at com.atomikos.icatch.imp.CoordinatorImp.terminate(CoordinatorImp.java:679)
	at com.atomikos.icatch.imp.CompositeTransactionImp.commit(CompositeTransactionImp.java:279)
	at com.atomikos.icatch.jta.TransactionImp.commit(TransactionImp.java:178)
	... 47 more
Caused by: com.atomikos.recovery.LogWriteException: java.nio.channels.ClosedByInterruptException
	at com.atomikos.recovery.fs.FileSystemRepository.writeCheckpoint(FileSystemRepository.java:203)
	at com.atomikos.recovery.fs.CachedRepository.performCheckpoint(CachedRepository.java:84)
	at com.atomikos.recovery.fs.CachedRepository.put(CachedRepository.java:77)
	at com.atomikos.recovery.fs.OltpLogImp.write(OltpLogImp.java:46)
	at com.atomikos.persistence.imp.StateRecoveryManagerImp.preEnter(StateRecoveryManagerImp.java:51)
	... 58 more
Caused by: java.nio.channels.ClosedByInterruptException
	at java.base/java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:200)
	at java.base/sun.nio.ch.FileChannelImpl.endBlocking(FileChannelImpl.java:172)
	at java.base/sun.nio.ch.FileChannelImpl.force(FileChannelImpl.java:532)
	at com.atomikos.recovery.fs.FileSystemRepository.writeCheckpoint(FileSystemRepository.java:196)
	... 62 more

If you try to rollback, crash occurs either. The exception follows:

Caused by: com.atomikos.icatch.jta.ExtendedSystemException: Error in rollback: could not flush state image java.nio.channels.ClosedByInterruptException com.atomikos.recovery.LogWriteException
	at com.atomikos.icatch.jta.TransactionImp.rollback(TransactionImp.java:206)
	at com.atomikos.icatch.jta.TransactionManagerImp.rollback(TransactionManagerImp.java:440)
	at com.atomikos.icatch.jta.UserTransactionManager.rollback(UserTransactionManager.java:199)
	at org.springframework.transaction.jta.JtaTransactionManager.doRollback(JtaTransactionManager.java:1053)
	... 44 more
Caused by: com.atomikos.icatch.SysException: Error in rollback: could not flush state image java.nio.channels.ClosedByInterruptException com.atomikos.recovery.LogWriteException
	at com.atomikos.icatch.imp.CoordinatorStateHandler.rollbackFromWithinCallback(CoordinatorStateHandler.java:518)
	at com.atomikos.icatch.imp.ActiveStateHandler$7.doRollback(ActiveStateHandler.java:302)
	at com.atomikos.icatch.imp.CoordinatorStateHandler.rollbackWithAfterCompletionNotification(CoordinatorStateHandler.java:569)
	at com.atomikos.icatch.imp.ActiveStateHandler.rollback(ActiveStateHandler.java:297)
	at com.atomikos.icatch.imp.CoordinatorImp.rollback(CoordinatorImp.java:576)
	at com.atomikos.icatch.imp.TransactionStateHandler.rollback(TransactionStateHandler.java:171)
	at com.atomikos.icatch.imp.TransactionStateHandler.rollbackWithStateCheck(TransactionStateHandler.java:186)
	at com.atomikos.icatch.imp.CompositeTransactionImp.doRollback(CompositeTransactionImp.java:193)
	at com.atomikos.icatch.imp.CompositeTransactionImp.rollback(CompositeTransactionImp.java:317)
	at com.atomikos.icatch.jta.TransactionImp.rollback(TransactionImp.java:203)
	... 47 more
Caused by: java.lang.IllegalStateException: could not flush state image java.nio.channels.ClosedByInterruptException com.atomikos.recovery.LogWriteException
	at com.atomikos.persistence.imp.StateRecoveryManagerImp.preEnter(StateRecoveryManagerImp.java:54)
	at com.atomikos.finitestates.FSMImp.notifyListeners(FSMImp.java:102)
	at com.atomikos.finitestates.FSMImp.setState(FSMImp.java:180)
	at com.atomikos.icatch.imp.CoordinatorImp.setState(CoordinatorImp.java:283)
	at com.atomikos.icatch.imp.CoordinatorImp.setStateHandler(CoordinatorImp.java:202)
	at com.atomikos.icatch.imp.CoordinatorStateHandler.rollbackFromWithinCallback(CoordinatorStateHandler.java:512)
	... 56 more
Caused by: com.atomikos.recovery.LogWriteException: java.nio.channels.ClosedByInterruptException
	at com.atomikos.recovery.fs.FileSystemRepository.writeCheckpoint(FileSystemRepository.java:203)
	at com.atomikos.recovery.fs.CachedRepository.performCheckpoint(CachedRepository.java:84)
	at com.atomikos.recovery.fs.CachedRepository.put(CachedRepository.java:77)
	at com.atomikos.recovery.fs.OltpLogImp.write(OltpLogImp.java:46)
	at com.atomikos.persistence.imp.StateRecoveryManagerImp.preEnter(StateRecoveryManagerImp.java:51)
	... 61 more
Caused by: java.nio.channels.ClosedByInterruptException
	at java.base/java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:200)
	at java.base/sun.nio.ch.FileChannelImpl.endBlocking(FileChannelImpl.java:172)
	at java.base/sun.nio.ch.FileChannelImpl.force(FileChannelImpl.java:532)
	at com.atomikos.recovery.fs.FileSystemRepository.writeCheckpoint(FileSystemRepository.java:196)
	... 65 more

TransactionsEssentials version
6.0.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions