db-derby-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mike matrigali <mikema...@gmail.com>
Subject Re: Corrupt database: ArrayIndexOutOfBoundsException on connect
Date Mon, 10 Mar 2014 19:27:41 GMT
I don't have time to do remote diagnostics, but did look at the issue
a bit.  If you have the ability to run a "sane" server on the db that
might produce more information in the log.  I am not sure if the apache
release includes this, so it may only be available if you build your
own from source.

I looked at stack and source with Myrna and did see that it looks 
similar to a reported issue DERBY-5936.  Looking at the source it looks
like we get a bad value off the page while are "bootstrapping" the
page/container.  In the case of sane we do some error checking, in the
release we just get the ArrayIndexOutOfBoundsException.  The code
should at least catch that JAVA error and turn it into a better derby
error with some diagnostics about what the page looks like.  I will file
a JIRA for that.

It may help if you add your experience to comments in DERBY-5936, with
the stack and maybe derby.log if you have it and it looks any different
than the stack you posted.  Sometimes there is a previous error in
derby.log that then explains the following error.  Obviously do not
share derby.log if it looks like it has anything confidential from your
customer.  Also in that issue rick asked a number of questions and
did not get answers, so maybe you can answer for your situation.

I know you posted that you do compresses, though the type you said
you are using has not been the problem in the past.  I would be
especially interested if it is possible you had machine crashes/sudden
shutdowns vs JVM crash.

Derby is designed to be able to recover from any killing of the process
during any operation as long as the disk is properly synced.  So if your
disk is write-cache disabled then this is a bug and your machine did
not crash then this is definitely a derby bug.  There is an edge case
in machine crash where partial page writes are done by the OS, but derby
should be reporting checksum errors in that case.

It may help to post a long listing (on unix a "ls -l") of the files
in seg0 and in log.  This will show no user data, just the number of
files, numbered file names, and sizes of the files.  This may help
someone to repro this problem.

 From the issue:
A couple questions we usually ask about data corruptions:

1) Do you compress database tables?

2) Is the disk write-cache enabled or disabled?

3) Did anything unusual happen before the corruption. E.g., an 
application or system crash?

Can you share the database with us so that we can crack it open and look 
for more clues? Can you send us derby.log? There may be more information 
in the full derby.log.

Thanks,
-Rick
On 3/10/2014 11:19 AM, Phil Bradley wrote:
>
> Hi Myrna,
> Thanks, the data in question is really just an offline cache so there's
> no issue with data loss (and it's kind of understandable that killing
> the process in the middle of compressing a table might not be best
> practice:)
>
> My second question was really "is a database in this state of use to the
> derby developers?"  I'm not authorised to upload the database as part of
> a bug report since it belongs to a client but if there are any Derby
> developers out there that would like me to run some diagnostics then I'm
> happy to do so.
>
> Regards,
> Phil
>
>
>
>
> On Mon, Mar 10, 2014, at 16:20, Myrna van Lunteren wrote:
>> Although Derby has transaction control and a recovery mechanism, if a
>> JVM crashes or gets interrupted, the normal transaction steps might be
>> interrupted in unfortunate places, especially during compress. Was the
>> database shutdown before compress? Do you have a backup?
>>
>> But perhaps there is something of use to you on this page:
>> https://wiki.apache.org/db-derby/DatabaseCorruption
>>
>> HTH
>> Myrna
>>
>>
>>
>> On Mon, Mar 10, 2014 at 4:49 AM, Phil Bradley <philb@tower.ie
>> <mailto:philb@tower.ie>> wrote:
>>
>>
>>     Hi,
>>
>>     I have a derby database that I am unable to connect to; when I try
>>     I get
>>     "java.lang.ArrayIndexOutOfBoundsException". The full stack trace is
>>     shown below.
>>
>>     Firstly, some background:
>>
>>     - I'm using derby 10.8.2.2 with a Java Webstart application that
>>     connects in embedded mode. The clients are using Java 7u45 on
>>     Windows 7,
>>     32 bit
>>
>>     - The application is configured to run
>>     SYSCS_UTIL.SYSCS_COMPRESS_TABLE()
>>     every 5 days on each table on startup
>>
>>     - The client was running SYSCS_UTIL.SYSCS_COMPRESS_TABLE() on a
>>     particular table and based on the application logs, it looks like
>>     either
>>     the JVM crashed or the application was ended via task manager.
>>
>>     - On subsequent attempts to start the application, the client was
>>     unable
>>     to connect to the database as per the stack trace below. I have made a
>>     copy of the database and I get this error reliably on accessing the
>>     copy.
>>
>>     I have two questions:
>>
>>     1. Is there anything that I can do to recover from this kind of
>>     scenario
>>     automatically?
>>     2. Is there any debugging or other investigation that I can do
>>     that will
>>     help reduce the severity of this kind of problem?
>>
>>     Thanks,
>>     Phil
>>
>>
>>
>>
>>
>>     java.sql.SQLException: Failed to start database
>>     'C:\Users\Administrator\.myapp\myapp_db' with class loader
>>     com.sun.jnlp.JNLPClassLoader@1bef5e8, 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(Unknown Source)
>>             at java.sql.DriverManager.getConnection(Unknown Source)
>>             at
>>
>>     com.mycompany.database.DbInitializer.runScript(DbInitializer.java:143)
>>             at
>>
>>     com.mycompany.myapp.ApplicationRunner.initialiseDb(ApplicationRunner.java:817)
>>             at
>>
>>     com.mycompany.myapp.ApplicationRunner.startApplication(ApplicationRunner.java:945)
>>             at
>>
>>     com.mycompany.myapp.ApplicationRunner.run(ApplicationRunner.java:581)
>>             at
>>
>>     com.mycompany.myapp.ApplicationRunner.main(ApplicationRunner.java:552)
>>             at
>>
>>     com.mycompany.myapp.ApplicationLoader.main(ApplicationLoader.java:90)
>>             at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>             at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>>             at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown
>>             Source)
>>             at java.lang.reflect.Method.invoke(Unknown Source)
>>             at com.sun.javaws.Launcher.executeApplication(Unknown Source)
>>             at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
>>             at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
>>             at com.sun.javaws.Launcher.run(Unknown Source)
>>             at java.lang.Thread.run(Unknown Source)
>>     Caused by: java.sql.SQLException: Failed to start database
>>     'C:\Users\Administrator\.myapp\myapp_db' with class loader
>>     com.sun.jnlp.JNLPClassLoader@1bef5e8, 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)
>>             ... 27 more
>>     Caused by: java.sql.SQLException: Java exception: ':
>>     java.lang.ArrayIndexOutOfBoundsException'.
>>             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)
>>             ... 24 more
>>     Caused by: java.lang.ArrayIndexOutOfBoundsException
>>             at java.lang.System.arraycopy(Native Method)
>>             at
>>
>>     org.apache.derby.impl.store.raw.data.AllocPage.ReadContainerInfo(Unknown
>>             Source)
>>             at
>>
>>     org.apache.derby.impl.store.raw.data.FileContainer.readHeader(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.FileContainer.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.openDroppedContainer(Unknown
>>             Source)
>>             at
>>
>>     org.apache.derby.impl.store.raw.xact.Xact.openDroppedContainer(Unknown
>>             Source)
>>             at
>>
>>     org.apache.derby.impl.store.raw.data.ContainerBasicOperation.findContainer(Unknown
>>             Source)
>>             at
>>
>>     org.apache.derby.impl.store.raw.data.ContainerBasicOperation.needsRedo(Unknown
>>             Source)
>>             at org.apache.derby.impl.store.raw.log.FileLogger.redo(Unknown
>>             Source)
>>             at
>>     org.apache.derby.impl.store.raw.log.LogToFile.recover(Unknown
>>             Source)
>>             at org.apache.derby.impl.store.raw.RawStore.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.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)
>>             ... 24 more
>>     2014-03-08 06:10:59,357 javawsApplicationMain ERROR  Initialisation
>>     error [40000] [XJ040] Failed to start database
>>     'C:\Users\Administrator\.myapp\myapp_db' with class loader
>>     com.sun.jnlp.JNLPClassLoader@1bef5e8, see the next exception for
>>     details.
>>     2014-03-08 06:10:59,357 javawsApplicationMain ERROR Initialisation
>>     error
>>     [0] [XJ001] Java exception: ':
>>     java.lang.ArrayIndexOutOfBoundsException'.
>>
>>
>>
>>
>>


Mime
View raw message