[
https://issues.apache.org/jira/browse/DERBY-5190?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13019908#comment-13019908
]
Dag H. Wanvik commented on DERBY-5190:
--------------------------------------
The only way writePage can hang in a wait is in this piece of code:
// Gain entry
while (restoreChannelInProgress) {
try {
channelCleanupMonitor.wait();
} catch (InterruptedException e) {
InterruptStatus.setInterrupted();
}
}
and since there is no other thread in the NIO code (verified with jstack),
another thread must have returned without resetting restoreChannelInProgress
and giving notification.
On line 836 in recoverContainerAfterInterrupt we see this code:
if (retries-- == 0) {
throw StandardException.newException(
SQLState.FILE_IO_INTERRUPTED);
}
which is not inside the try catch block which releases restoreChannelInProgress
with notification to waiters. So, if for some reason, this loop maxes out,
while this thread then gives an error (this is during shutdown so the error
will be ignored), any other thread waiting for restoreChannelInProgress to
become false will hang as seen. As far as I can see this construction on line
836 is the only way we can exit from recoverContainerAfterInterrupt without
resetting restoreChannelInProgress.
> store/rollForwardRecovery.sql stuck in RAFContainer4.writePage() during
> shutdown
> --------------------------------------------------------------------------------
>
> Key: DERBY-5190
> URL: https://issues.apache.org/jira/browse/DERBY-5190
> Project: Derby
> Issue Type: Bug
> Components: Store
> Affects Versions: 10.9.0.0
> Environment: Oracle Enterprise Linux 6.0
> Linux 2.6.32-100.28.9.el6.x86_64 #1 SMP Wed Mar 16 19:24:16 EDT 2011 x86_64
> x86_64 x86_64 GNU/Linux
> java version "1.6.0_17"
> OpenJDK Runtime Environment (IcedTea6 1.7.10) (rhel-1.39.b17.el6_0-x86_64)
> OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)
> Reporter: Knut Anders Hatlen
>
> Saw store/rollForwardRecovery.sql hanging during shutdown with this trace:
> "main" prio=10 tid=0x00007f9f0c009000 nid=0x571 in Object.wait()
> [0x00007f9f123eb000]
> java.lang.Thread.State: WAITING (on object monitor)
> at java.lang.Object.wait(Native Method)
> - waiting on <0x00007f9ee3eccf58> (a java.lang.Object)
> at java.lang.Object.wait(Object.java:502)
> at org.apache.derby.impl.store.raw.data.RAFContainer4.writePage(Unknown
> Source)
> - locked <0x00007f9ee3eccf58> (a java.lang.Object)
> at org.apache.derby.impl.store.raw.data.CachedPage.writePage(Unknown
> Source)
> at org.apache.derby.impl.store.raw.data.CachedPage.clean(Unknown Source)
> at
> org.apache.derby.impl.services.cache.ConcurrentCache.cleanAndUnkeepEntry(Unknown
> Source)
> at
> org.apache.derby.impl.services.cache.ConcurrentCache.cleanCache(Unknown
> Source)
> at
> org.apache.derby.impl.services.cache.ConcurrentCache.cleanAll(Unknown Source)
> at
> org.apache.derby.impl.store.raw.data.BaseDataFileFactory.checkpoint(Unknown
> Source)
> at
> org.apache.derby.impl.store.raw.log.LogToFile.checkpointWithTran(Unknown
> Source)
> at org.apache.derby.impl.store.raw.log.LogToFile.checkpoint(Unknown
> Source)
> at org.apache.derby.impl.store.raw.RawStore.stop(Unknown Source)
> at org.apache.derby.impl.services.monitor.TopService.stop(Unknown
> Source)
> at org.apache.derby.impl.services.monitor.TopService.shutdown(Unknown
> Source)
> at org.apache.derby.impl.services.monitor.BaseMonitor.shutdown(Unknown
> Source)
> at org.apache.derby.impl.services.monitor.BaseMonitor.shutdown(Unknown
> Source)
> at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source)
> at org.apache.derby.jdbc.AutoloadedDriver.connect(Unknown Source)
> at java.sql.DriverManager.getConnection(DriverManager.java:620)
> at java.sql.DriverManager.getConnection(DriverManager.java:222)
> at org.apache.derby.impl.tools.ij.utilMain.cleanupGo(Unknown Source)
> at org.apache.derby.impl.tools.ij.utilMain.go(Unknown Source)
> at org.apache.derby.impl.tools.ij.Main.go(Unknown Source)
> at org.apache.derby.impl.tools.ij.Main.mainCore(Unknown Source)
> at org.apache.derby.impl.tools.ij.Main.main(Unknown Source)
> at org.apache.derby.tools.ij.main(Unknown Source)
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira