Good, very encouraging, thanks!

On Fri, May 14, 2010 at 10:26 AM, Mike Matrigali <mikem_app@sbcglobal.net> wrote:
The db should never be corrupted by this.  It is sometimes confusing
as many scary errors come back, as often the error results in all
subsequent operations failing until the database is completely shutdown
and rebooted.

It is hard to say exactly what happens, mostly because of the way
interupts work in java.  Basically the interrupt is not noticed until
a java call is made that checks for interrupts.  The usual case in derby
is that this is noticed when an I/O happens.  Depending on what I/O
is interrupted different thing can happen.  If it is a log I/O then
it is a server level error and the system disables all future I/O's,
causing those to return errors and the eventually system will come down.
A read error I think is just statement error and subsequent queries may
work.  In all cases the system should recover fine after subsequent
reboot, causing any transaction to back out that was in middle when the
I/O failed.


David Van Couvering wrote:
Hi, all.  I am using Derby embedded in a server process.  The server process can receive a request to shut down, in which case it does an orderly shutdown of all its services.  This uses ExecutorService.shutdownNow(), which sends an InterruptException to any task currently running.  I am looking at changing this to using shutdown with a timeout before reverting to shutdownNow(), but I still want to discuss with you what happens.

It *appears* that as a result of receiving this interrupt, Derby receives a java.nio.channels.ClosedByInterruptException, which it then rethrows as a SQLException.  That's fine, I can dig through the layers of causes to find that it's a ClosedByInterruptException.  But my question to you is, when Derby gets interrupted like this, what does it do?  Does it correctly roll back the current transaction?  Does it ignore the interrupt until it can finish processing the transaction?  I am particularly concerned that this could cause some kind of inconsistency or corruption in the database.

For your edification, here is the stack trace.  I am not sure if it always happens when trying to open a connection, or if it also happens in the middle of an operation, I'm going to look for more examples of the stack trace, and will send it your way.

Thanks!

David

com.vontu.itemcatalog.api.ItemCatalogException: java.sql.SQLException: Failed to start database 'C:\Vontu\Protect\scan\incremental_index/MONITOR_TARGET_4', see the next exception for details.


       at com.vontu.itemcatalog.derby.DBCPConnectionPool.getConnection(DBCPConnectionPool.java:71)
       at com.vontu.itemcatalog.derby.SQLCallable.call(SQLCallable.java:53)
       at com.vontu.itemcatalog.derby.SQLCallable.call(SQLCallable.java:44)


       at com.vontu.itemcatalog.derby.PendingDeliveriesPersister.createTablesAsNeeded(PendingDeliveriesPersister.java:47)
       at com.vontu.itemcatalog.derby.PendingDeliveriesPersister.<init>(PendingDeliveriesPersister.java:42)


       at com.vontu.itemcatalog.derby.PendingDeliveriesPersister.<init>(PendingDeliveriesPersister.java:29)
       at com.vontu.itemcatalog.derby.PendingDeliveriesPersisterProvider.getPersister(PendingDeliveriesPersisterProvider.java:25)


       at com.vontu.itemcatalog.marshall.BloomFilterBatchMarshallableProvider.getNextMarshallable(BloomFilterBatchMarshallableProvider.java:89)
       at com.vontu.itemcatalog.distribution.ItemSetSender.execute(ItemSetSender.java:121)


       at com.vontu.itemcatalog.distribution.ItemSetSender.run(ItemSetSender.java:104)
       at com.vontu.discover.incremental.ItemSetSenderDispatcher.run(ItemSetSenderDispatcher.java:83)
       at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)


       at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
       at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)


       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)


       at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
       at java.lang.Thread.run(Thread.java:619)


Caused by: java.sql.SQLException: Failed to start database 'C:\Vontu\Protect\scan\incremental_index/MONITOR_TARGET_4', see the next exception for details.
       at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)


       at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
       at org.apache.derby.impl.jdbc.Util.seeNextException(Unknown Source)
       at org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(Unknown Source)


       at org.apache.derby.impl.jdbc.EmbedConnection.<init>(Unknown Source)
       at org.apache.derby.impl.jdbc.EmbedConnection30.<init>(Unknown Source)
       at org.apache.derby.impl.jdbc.EmbedConnection40.<init>(Unknown Source)


       at org.apache.derby.jdbc.Driver40.getNewEmbedConnection(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:582)


       at java.sql.DriverManager.getConnection(DriverManager.java:185)
       at org.apache.commons.dbcp.DriverManagerConnectionFactory.createConnection(DriverManagerConnectionFactory.java:48)
       at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:290)


       at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:840)
       at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
       at com.vontu.itemcatalog.derby.DBCPConnectionPool.getConnection(DBCPConnectionPool.java:66)


       ... 19 more
Caused by: java.sql.SQLException: Failed to start database 'C:\Vontu\Protect\scan\incremental_index/MONITOR_TARGET_4', see the next exception for details.
       at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)


       at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
       ... 36 more
Caused by: java.sql.SQLException: Java exception: ': java.nio.channels.ClosedByInterruptException'.


       at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
       at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
       at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)


       at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
       at org.apache.derby.impl.jdbc.Util.javaException(Unknown Source)
       ... 33 more
Caused by: java.nio.channels.ClosedByInterruptException

       at java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:184)

       at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:627)
       at org.apache.derby.impl.store.raw.data.RAFContainer4.readFull(Unknown Source)
       at org.apache.derby.impl.store.raw.data.RAFContainer4.getEmbryonicPage(Unknown Source)


       at org.apache.derby.impl.store.raw.data.RAFContainer.run(Unknown Source)
       at java.security.AccessController.doPrivileged(Native Method)
       at org.apache.derby.impl.store.raw.data.RAFContainer.openContainer(Unknown Source)


       at org.apache.derby.impl.store.raw.data.RAFContainer4.openContainer(Unknown Source)
       at org.apache.derby.impl.store.raw.data.FileContainer.setIdent(Unknown Source)
       at org.apache.derby.impl.store.raw.data.RAFContainer.setIdentity(Unknown Source)


       at org.apache.derby.impl.services.cache.ConcurrentCache.find(Unknown Source)
       at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.openContainer(Unknown Source)
       at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.openContainer(Unknown Source)


       at org.apache.derby.impl.store.raw.xact.Xact.openContainer(Unknown Source)
       at org.apache.derby.impl.store.access.heap.HeapConglomerateFactory.readConglomerate(Unknown Source)
       at org.apache.derby.impl.store.access.RAMAccessManager.conglomCacheFind(Unknown Source)


       at org.apache.derby.impl.store.access.RAMTransaction.findExistingConglomerate(Unknown Source)
       at org.apache.derby.impl.store.access.RAMTransaction.openScan(Unknown Source)
       at org.apache.derby.impl.store.access.PropertyConglomerate.openScan(Unknown Source)


       at org.apache.derby.impl.store.access.PropertyConglomerate.readDbProperties(Unknown Source)
       at org.apache.derby.impl.store.access.PropertyConglomerate.getCachedDbProperties(Unknown Source)
       at org.apache.derby.impl.store.access.PropertyConglomerate.getCachedProperty(Unknown Source)


       at org.apache.derby.impl.store.access.PropertyConglomerate.getProperty(Unknown Source)
       at org.apache.derby.impl.store.access.PC_XenaVersion.upgradeIfNeeded(Unknown Source)
       at org.apache.derby.impl.store.access.PropertyConglomerate.<init>(Unknown Source)


       at org.apache.derby.impl.store.access.RAMAccessManager.boot(Unknown Source)
       at org.apache.derby.impl.services.monitor.BaseMonitor.boot(Unknown Source)
       at org.apache.derby.impl.services.monitor.TopService.bootModule(Unknown Source)


       at org.apache.derby.impl.services.monitor.BaseMonitor.startModule(Unknown Source)
       at org.apache.derby.iapi.services.monitor.Monitor.bootServiceModule(Unknown Source)
       at org.apache.derby.impl.db.BasicDatabase.bootStore(Unknown Source)


       at org.apache.derby.impl.db.BasicDatabase.boot(Unknown Source)
       at org.apache.derby.impl.services.monitor.BaseMonitor.boot(Unknown Source)
       at org.apache.derby.impl.services.monitor.TopService.bootModule(Unknown Source)


       at org.apache.derby.impl.services.monitor.BaseMonitor.bootService(Unknown Source)
       at org.apache.derby.impl.services.monitor.BaseMonitor.startProviderService(Unknown Source)
       at org.apache.derby.impl.services.monitor.BaseMonitor.findProviderAndStartService(Unknown Source)


       at org.apache.derby.impl.services.monitor.BaseMonitor.startPersistentService(Unknown Source)
       at org.apache.derby.iapi.services.monitor.Monitor.startPersistentService(Unknown Source)
       ... 33 more



--
David W. Van Couvering

http://www.linkedin.com/in/davidvc
http://davidvancouvering.blogspot.com
http://twitter.com/dcouvering




--
David W. Van Couvering

http://www.linkedin.com/in/davidvc
http://davidvancouvering.blogspot.com
http://twitter.com/dcouvering