[
https://issues.apache.org/jira/browse/DERBY-4741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12981932#action_12981932
]
Dag H. Wanvik edited comment on DERBY-4741 at 1/14/11 4:38 PM:
---------------------------------------------------------------
Some details on where patch derby-4741-sleeps-waits-1 changes things.
The following locations where we earlier threw 08000 (CONN_INTERRUPT),
we now just note that an interrupt occurred:
* GenericStatement#prepare:
- while waiting for another thread to complete the compilation of
the statement
* LogToFile
#checkpointWithTran:
- while waiting for another thread to complete a checkpoint
#switchLogFile:
- while waiting for a semaphore needed to make sure the log switch
can complete "without having to give up the semaphore to a backup
or another flusher".
#flush:
- while waiting for the database to stop being frozen
- while waiting for another thread flushing
#syncFile
- while waiting a bit before retrying a failed sync call
#startLogBackup
- while waiting for a thread doing checkpointing before we start
backup of log as part of online-backup
The following locations previously silently swallowed the interrupt, we
now (also) note that an interrupt occurred:
* LogToFile
#recover:
- in slave replication mode, while waiting for fail-over. This code
swallowed the interrupt
#getLogFileAtBeginning:
- in slave replication mode, while waiting for SlaveFactory to tell
the thread to do recovery. This code swallowed the interrupt
* BasePage:
#setExclusive:
- while waiting for an exclusive latch
- while waiting for cleaner to finish
#setExclusiveNoWait
- while waiting for cleaner to finish
was (Author: dagw):
Some details on where patch derby-4741-sleeps-waits-1 changes things.
The following locations where we earlier threw 08000 (CONN_INTERRUPT),
we now just note that an interrupt occurred:
* GenericStatement#prepare:
- while waiting for another thread to complete the compilation of
the statement
* LogToFile
#checkpointWithTran:
- while waiting for another thread to complete a checkpoint
#switchLogFile:
- while waiting for a semaphore needed to make sure the log switch
can complete "without having to give up the semaphore to a backup
or another flusher".
#flush:
- while waiting for the database to stop being frozen
- while waiting for another thread flushing
#syncFile
- while waiting a bit before retrying a failed sync call
#startLogBackup
- while waiting for a thread doing checkpointing before we start
backup of log as part of online-backup
The following locations previously silently swallowed the interrupt, we
now (also) note that an interrupt occurred:
* LogToFile
#recover:
- in slave replication mode, while waiting for fail-over. This code
swallowed the interrupt
#getLogFileAtBeginning:
- in slave replication mode, while waiting for SlaveFactory to tell
the thread to do recovery. This code swallowed the interrupt
> Make Derby work reliably in the presence of thread interrupts
> -------------------------------------------------------------
>
> Key: DERBY-4741
> URL: https://issues.apache.org/jira/browse/DERBY-4741
> Project: Derby
> Issue Type: Bug
> Components: Store
> Affects Versions: 10.2.1.6, 10.2.2.0, 10.3.1.4, 10.3.2.1, 10.3.3.0,
> 10.4.1.3, 10.4.2.0, 10.5.1.1, 10.5.2.0, 10.5.3.0, 10.6.1.0
> Reporter: Dag H. Wanvik
> Assignee: Dag H. Wanvik
> Attachments: derby-4741-a-01-api-interruptstatus.diff,
> derby-4741-a-01-api-interruptstatus.stat,
> derby-4741-a-02-api-interruptstatus.diff,
> derby-4741-a-02-api-interruptstatus.stat,
> derby-4741-a-03-api-interruptstatus.diff,
> derby-4741-a-03-api-interruptstatus.stat,
> derby-4741-a-04-api-interruptstatus.diff,
> derby-4741-a-04-api-interruptstatus.stat,
> derby-4741-all+lenient+resurrect.diff, derby-4741-all+lenient+resurrect.stat,
> derby-4741-b-01-nio.diff, derby-4741-b-01-nio.stat, derby-4741-b-02-nio.diff,
> derby-4741-b-02-nio.stat, derby-4741-b-03-nio.diff, derby-4741-b-03-nio.stat,
> derby-4741-b-04-nio.diff, derby-4741-b-04-nio.stat, derby-4741-c-01-nio.diff,
> derby-4741-c-01-nio.stat, derby-4741-kristians-01.diff,
> derby-4741-nio-container+log+waits+locks+throws.diff,
> derby-4741-nio-container+log+waits+locks+throws.stat,
> derby-4741-nio-container+log+waits+locks-2.diff,
> derby-4741-nio-container+log+waits+locks-2.stat,
> derby-4741-nio-container+log+waits+locks.diff,
> derby-4741-nio-container+log+waits+locks.stat,
> derby-4741-nio-container+log+waits.diff,
> derby-4741-nio-container+log+waits.stat, derby-4741-nio-container+log.diff,
> derby-4741-nio-container+log.stat, derby-4741-nio-container-2.diff,
> derby-4741-nio-container-2.log, derby-4741-nio-container-2.stat,
> derby-4741-nio-container-2b.diff, derby-4741-nio-container-2b.stat,
> derby-4741-sleeps-waits-1.diff, derby-4741-sleeps-waits-1.stat, derby.log,
> derby.log, InterruptResilienceTest.java, MicroAPITest.java, xsbt0.log.gz
>
>
> When not executing on a small device VM, Derby has been using the Java NIO
> classes java.nio.clannel.* for file io.
> If thread is interrupted while executing blocking IO operations in NIO, the
> ClosedByInterruptException will get thrown. Unfortunately, Derby isn't
> current architected to retry and complete such operations (before passing on
> the interrupt), so the Derby database can be left in an inconsistent state
> and we therefore have to return a database level error. This means the
> applications can no longer access the database without a shutdown and reboot
> including a recovery.
> It would be nice if Derby could somehow detect and finish IO operations
> underway when thread interrupts happen before passing the exception on to the
> application. Derby embedded is sometimes embedded in applications that use
> Thread.interrupt to stop threads.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.