[
https://issues.apache.org/jira/browse/DERBY-4741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12986365#action_12986365
]
Knut Anders Hatlen commented on DERBY-4741:
-------------------------------------------
The use of the static field thisTest may have some consequences that are not
entirely obvious:
The field is set when the test suite is created, so when the tests start
running it will always point to the last test case that was created, not
necessarily to the running test case. That is, it will always point to a client
test case. Because of this, one may be led to believe that the test that calls
thisTest.openDefaultConnection() always uses client connections. However,
BaseJDBCTestCase.openDefaultConnection() calls TestConfiguration.getCurrent()
to get the current test configuration, so the connection type should be chosen
dynamically based on the active decorators. But this assumption is also not
quite true. The decorators only affect the TestConfiguration for the main
thread, so when running inside a stored procedure in a server thread, the
decorators will have no effect, and an embedded connection will be opened even
if the test case is actually running within a client/server decorator.
I think the intention is to always use embedded connections inside the stored
procedure, and that's also what the code does (so, as mentioned in an earlier
comment, there's probably not much point in running this test in client/server
mode?). But it takes some effort to convince oneself that that's what it
actually does. Do you think it's possible to make it more explicit that the
worker threads always use embedded connections?
And some little nits:
+ if (w.e != null) {
+ fail("WorkerThread " + i + " saw exception " + w.e);
+ }
Use the fail() method that takes an exception to preserve the stack trace?
+ ResultSet rs = s.executeQuery("select count(*) from mtTab");
+ rs.next();
+ assertEquals("too few rows inserted",
+ rs.getLong(1), NO_OF_THREADS * NO_OF_MT_OPS);
+ rs.close();
How do you know it must be too few and not too many? ;)
JDBC.assertSingleValueResultSet() could simplify this code.
> 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-raf-stresstest-1.diff, derby-4741-raf-stresstest-1.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-4741-sleeps-waits-3.diff, derby-4741-sleeps-waits-3.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.