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

Mike Matrigali updated DERBY-4741:
----------------------------------


so far your approach seems fine to me, and I think will help a lot of 
customers.  I was wondering if
you have a high level goal.  Basically what should derby do when it encounters 
an interrupt.

I think it should always throw some sort of error back to caller, and would be 
nice if the error or 
the nested error indicated clearly that it is being thrown because of a thread 
interrupt.  Many times
when supporting this issue it takes awhile for the user to realize that they 
are the ones generating
the interrupt.

I think the error should not be database level, and with your retry on I/O and 
log it seems like we
can avoid that.  I am not sure if it should be session or statement level,
I am leaning to it being session level, but would like to see a discussion.  I 
know often users are
doing the interrupt to stop a thread.  

Ultimately do you plan on always reenabling the interrupt after retrying or 
getting to a safe place?

We should definitely throw an error in the case of an interrupt during a lock 
wait, this seems like the
one valid case to send an interrupt to derby if a user thinks it is waiting too 
long.  Hopefully you can
code it to handle it, do processing, get to safe spot and then throw an error 
indicating a real user 
interrupt during a wait.  

Something to think about in the error throwing is the background thread.  What 
should we do if
it encounters an interrupt.  Throwing an error there might shutdown the db, i 
am not sure what it
does at top level with an error.



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

Reply via email to