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

Dag H. Wanvik updated DERBY-4741:
---------------------------------

    Attachment: derby-4741-sleeps-waits-2.stat
                derby-4741-sleeps-waits-2.diff

Uploading a second version of derby-4741-sleeps-waits, rerunning regressions.

Details on where patch derby-4741-sleeps-waits-2 adds things relative to 
version 1:

The following locations previously silently swallowed the interrupt, we now 
(also) note that an interrupt occurred:

* LogAccessFile:

  #flushDirtyBuffers:
  - While waiting for another thread flushing

  #syncLogAccessFile:
  - While sleeping a bit before retrying after a failed sync

  With the above, all the waits and sleeps in the package
  org.apache.derby.impl.store.raw.log have been made safe.

The following locations where we earlier threw 08000 (CONN_INTERRUPT), we now 
just note that an interrupt occurred:

* XactFactory:
  
  #blockBackup:
  - While doing backup blocking operations, we wait for backup to
    finish. 

  #blockBackupBlockingOperations:
  - While waiting for all backup blocking operations to complete

* BaseDataFileFactory:

  #freezePersistentStore:
  - While waiting for writes in progress to finishing before freezing.
  
  #writeInProgress:
  - While waiting for db thaw before we can start writing

* CachedPage:
  #clean:
  - Waiting for another thread cleaning it
  - Waiting for state to become unlatched attempting to clean it

* AsynchronousLogShipper:

  #run:
   - If interrupted during the shipping interval wait, shipping sooner doesn't 
hurt

  #forceFlush:

  - While waiting a bit after having flushed the master to ship log records to 
slave to free up buffer space
  
* ReplicationMessageReceive:

  #isConnectedToMaster:
  - While waiting for result from the ping thread (the "pong"). Since we may 
have been interrupted before the result is ready, we try again unless the 
connection is confirmed up.

  #SlavePingThread#run:  
  - While waiting for wakeup to do a ping.  I had to introduce an extra state 
variable here to decide whether after we receive an interrupt, a ping request 
has also been lodged.


> 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-4741-sleeps-waits-2.diff, derby-4741-sleeps-waits-2.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.

Reply via email to