db-derby-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mike Matrigali <mikem_...@sbcglobal.net>
Subject Re: Derbus interruptus == Derbus corruptus?
Date Fri, 14 May 2010 17:26:27 GMT
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


Mime
View raw message