[
https://issues.apache.org/jira/browse/DERBY-4733?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Mike Matrigali updated DERBY-4733:
----------------------------------
Summary: Get error "Failed to create database - directory already exists"
when attempting to connect to a database that failed during creation (was: Get
error "Failed to create database - directory already exists" when shutting down
a process that is creating a table)
I've changed the bug description to indicate the problem is about attempting to
connect to a database which previously failed during creation. If anyone has
better wording, feel free to improve it. I believe that the create table has
nothing to do with the problem.
This problem sounds medium hard to fix. Basically until the database is
actually successfully created there is no existing mechanism to recover from
errors while creating the database - especially if you are killing the process
that is doing the database creation. There is a bootstrap phase where we are
getting the database to the point that it can handle all errors, but until then
we basically rely on not enabling access to the db until
it is finished. The .zip you posted is missing the necessary bootstrap files
that derby
uses to open a database, and we don't lay down those files until we have
finished
creating the database. Also as a performance enhancement I believe that we
optimize database creation by doing a lot of operations unlogged, as it is
assumed
no recovery is necessary for failures during middle of create database.
As has been commented I can see severe problems with Derby going ahead and
deleting
the existing directory that it does not recognize as a database to make the
creation
succeed. It is too easy for the case to be a user error, rather than an
attempt to connect
to previously failed created database. With derby I think many people just
leave
the create=true flag on their connect line, so even though the database may
think
it is doing a create, it might be surprising to users. Probably what is
causing this db
to not boot is the missing bootstrap file service.properties, which I think is
instantiated
after we have forced the successful db creation to disk. Unfortunately I have
seen
too many users muck around with the internal files and trusting this file to
not exist to
mean that we can go ahead and delete existing seg0 and log seems like a way to
cause trouble.
It would seem useful if anyone is interested to provide better error messages.
Step one could be just to change the text of this one to mention that it might
be possible that
a previous create database attempt failed and that user needs to clean up the
existing
directory. Step two could be to actually look for database artifacts that
should get
cleaned up, like log, seg0, tmp, db.lck.
There may be smaller fixes that could be made if whatever if causing the db to
not
be created is something other than the process going away. I don't know if
existing
boot error handling is smart enough to know that it is failing during create
database
and if that context knows what objects it could delete as part of the error
recovery.
> Get error "Failed to create database - directory already exists" when
> attempting to connect to a database that failed during creation
> -------------------------------------------------------------------------------------------------------------------------------------
>
> Key: DERBY-4733
> URL: https://issues.apache.org/jira/browse/DERBY-4733
> Project: Derby
> Issue Type: Bug
> Components: Store
> Affects Versions: 10.6.1.0
> Environment: Windows XP
> Reporter: David Van Couvering
> Attachments: corruptme.zip, CorruptMePlease.java
>
>
> If you exit a process that is in the middle of booting a database or creating
> a table, then when you try to access the same database again, you get the
> error "Failed to create database 'foo', see next exception" followed by
> "Directory xxx already exists".
> A stack trace is below. I am attaching a simple program that reproduces.
> Just try running it multiple times. I hit this after the second try.
> Opening database
> java.sql.SQLException: Failed to create database 'corruptme', 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.createDatabase(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 CorruptMePlease$CreateTableTask.run(CorruptMePlease.java:34)
> at java.lang.Thread.run(Unknown Source)
> Caused by: java.sql.SQLException: Failed to create database 'corruptme', 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)
> ... 14 more
> Caused by: java.sql.SQLException: Directory
> C:\vontu\depot\sandbox_incremental\DerbyCorruption\corruptme already exists.
> 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.generateCsSQLException(Unknown
> Source)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown
> Source)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown
> Source)
> at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown
> Source)
> ... 11 more
> Caused by: ERROR XBM0J: Directory
> C:\vontu\depot\sandbox_incremental\DerbyCorruption\corruptme already exists.
> at org.apache.derby.iapi.error.StandardException.newException(Unknown
> Source)
> at
> org.apache.derby.impl.services.monitor.StorageFactoryService$9.run(Unknown
> Source)
> at java.security.AccessController.doPrivileged(Native Method)
> at
> org.apache.derby.impl.services.monitor.StorageFactoryService.createServiceRoot(Unknown
> Source)
> at
> org.apache.derby.impl.services.monitor.BaseMonitor.bootService(Unknown Source)
> at
> org.apache.derby.impl.services.monitor.BaseMonitor.createPersistentService(Unknown
> Source)
> at
> org.apache.derby.iapi.services.monitor.Monitor.createPersistentService(Unknown
> Source)
> ... 11 more
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.