db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kathey Marsden (JIRA)" <j...@apache.org>
Subject [jira] Commented: (DERBY-4072) shutdown with incorrect permission on log files shows java.lang.NullPointerException at org.apache.derby.impl.store.raw.log.LogToFile.flush(LogToFile.java:3964). Should give bettter message.
Date Fri, 27 Feb 2009 18:05:12 GMT

    [ https://issues.apache.org/jira/browse/DERBY-4072?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12677439#action_12677439
] 

Kathey Marsden commented on DERBY-4072:
---------------------------------------

So the exception we are not  reporting is:
java.io.FileNotFoundException: /home/kmarsden/repro/10602/wombat/log/log28.dat (Permission
denied)
	at java.io.RandomAccessFile.<init>(RandomAccessFile.java:218)
	at org.apache.derby.impl.io.DirRandomAccessFile.<init>(DirRandomAccessFile.java:57)
	at org.apache.derby.impl.io.DirFile4.getRandomAccessFile(DirFile4.java:250)
	at org.apache.derby.impl.store.raw.log.LogToFile.run(LogToFile.java:5689)
	at java.security.AccessController.doPrivileged(AccessController.java:251)
	at org.apache.derby.impl.store.raw.log.LogToFile.privRandomAccessFile(LogToFile.java:5579)
	at org.apache.derby.impl.store.raw.log.LogToFile.checkJvmSyncError(LogToFile.java:5522)
	at org.apache.derby.impl.store.raw.log.LogToFile.openLogFileInWriteMode(LogToFile.java:5471)
	at org.apache.derby.impl.store.raw.log.LogToFile.recover(LogToFile.java:1074)
	at org.apache.derby.impl.store.raw.RawStore.boot(RawStore.java:339)
	at org.apache.derby.impl.services.monitor.BaseMonitor.boot(BaseMonitor.java:2019)
	at org.apache.derby.impl.services.monitor.TopService.bootModule(TopService.java:291)
	at org.apache.derby.impl.services.monitor.BaseMonitor.startModule(BaseMonitor.java:573)
	at org.apache.derby.iapi.services.monitor.Monitor.bootServiceModule(Monitor.java:427)
	at org.apache.derby.impl.store.access.RAMAccessManager.boot(RAMAccessManager.java:1019)
	at org.apache.derby.impl.services.monitor.BaseMonitor.boot(BaseMonitor.java:2019)
	at org.apache.derby.impl.services.monitor.TopService.bootModule(TopService.java:291)
	at org.apache.derby.impl.services.monitor.BaseMonitor.startModule(BaseMonitor.java:573)
	at org.apache.derby.iapi.services.monitor.Monitor.bootServiceModule(Monitor.java:427)
	at org.apache.derby.impl.db.BasicDatabase.bootStore(BasicDatabase.java:780)
	at org.apache.derby.impl.db.BasicDatabase.boot(BasicDatabase.java:196)
	at org.apache.derby.impl.services.monitor.BaseMonitor.boot(BaseMonitor.java:2019)
	at org.apache.derby.impl.services.monitor.TopService.bootModule(TopService.java:291)
	at org.apache.derby.impl.services.monitor.BaseMonitor.bootService(BaseMonitor.java:1856)
	at org.apache.derby.impl.services.monitor.BaseMonitor.startProviderService(BaseMonitor.java:1722)
	at org.apache.derby.impl.services.monitor.BaseMonitor.findProviderAndStartService(BaseMonitor.java:1602)
	at org.apache.derby.impl.services.monitor.BaseMonitor.startPersistentService(BaseMonitor.java:1021)
	at org.apache.derby.iapi.services.monitor.Monitor.startPersistentService(Monitor.java:550)
	at org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(EmbedConnection.java:2581)
	at org.apache.derby.impl.jdbc.EmbedConnection.<init>(EmbedConnection.java:374)
	at org.apache.derby.jdbc.Driver40.getNewEmbedConnection(Driver40.java:68)
	at org.apache.derby.jdbc.InternalDriver.connect(InternalDriver.java:238)
	at org.apache.derby.jdbc.AutoloadedDriver.connect(AutoloadedDriver.java:119)
	at java.sql.DriverManager.getConnection(DriverManager.java:316)
	at java.sql.DriverManager.getConnection(DriverManager.java:273)
	at ConnectAndShutdown.main(ConnectAndShutdown.java:9)java.io.FileNotFoundException: 

and the correspoinding code in LogToFile is ~1067
					if (!ReadOnlyDB)
					{
						// if datafactory doesn't think it is readonly, we can
						// do some futher test of our own
						try
						{
							if(isWriteSynced)
								theLog = openLogFileInWriteMode(logFile);
							else
								theLog = privRandomAccessFile(logFile, "rw");
						}
						catch (IOException ioe)
						{
							theLog = null;
						}
                        if (theLog == null || !privCanWrite(logFile))
						{
							if (theLog != null)
								theLog.close();
							theLog = null;

							ReadOnlyDB = true;
						}
					}
We catch the exception and silently change the database to ReadOnly.
Later ~~`1172 we fail to initialize logOut because theLog is null
		if (theLog != null)
					logOut = new LogAccessFile(this, theLog, logBufferSize);

There is another area of similar code ~986

finally during flush logOut is null so we get the NPE.

I was thinking we should 
1) Log the IOExceptions.
2) Log whenever we change a database to ReadOnly.
3) In flush() if the database is ReadOnly print a warning to the log that we cannot flush
the log to a ReadOnlyDB and return.

but I don't know if this is overly verbose.  Are there normal instances of the IOException
we might want to   silently ignore?



> shutdown with incorrect permission on log files shows java.lang.NullPointerException
 at org.apache.derby.impl.store.raw.log.LogToFile.flush(LogToFile.java:3964).  Should give
bettter message.
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-4072
>                 URL: https://issues.apache.org/jira/browse/DERBY-4072
>             Project: Derby
>          Issue Type: Bug
>          Components: Store
>    Affects Versions: 10.1.3.1, 10.2.2.0, 10.3.3.0, 10.4.2.0, 10.5.0.0
>            Reporter: Kathey Marsden
>            Priority: Minor
>         Attachments: ConnectAndShutdown.java, InsertALot.java, MakeDB.java
>
>
> I recently saw  case where a user was seeing the following error in the derby.log when
trying to shutdown their database.
> New exception raised during cleanup null
> java.lang.NullPointerException
>         at org.apache.derby.impl.store.raw.log.LogToFile.flush(LogToFile.java:3964)
>         at org.apache.derby.impl.store.raw.log.LogToFile.flush(LogToFile.java:1781)
>         at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.flush(BaseDataFileFa
>         at org.apache.derby.impl.store.raw.data.CachedPage.writePage(CachedPage.java:761
>         at org.apache.derby.impl.store.raw.data.CachedPage.clean(CachedPage.java:610)
>         at org.apache.derby.impl.services.cache.ConcurrentCache.cleanAndUnkeepEntry(Conc
>         at org.apache.derby.impl.services.cache.ConcurrentCache.cleanCache(ConcurrentCac
>         at org.apache.derby.impl.services.cache.ConcurrentCache.cleanAll(ConcurrentCache
>         at org.apache.derby.impl.services.cache.ConcurrentCache.shutdown(ConcurrentCache
>         at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.stop(BaseDataFileFac
>         at org.apache.derby.impl.services.monitor.TopService.stop(TopService.java:405)
>         at org.apache.derby.impl.services.monitor.TopService.shutdown(TopService.java:34
>         at org.apache.derby.impl.services.monitor.BaseMonitor.shutdown(BaseMonitor.java:
>         at org.apache.derby.impl.db.DatabaseContextImpl.cleanupOnError(DatabaseContextIm
>         at org.apache.derby.iapi.services.context.ContextManager.cleanupOnError(ContextM
>         at org.apache.derby.impl.jdbc.TransactionResourceImpl.cleanupOnError(Transaction
>         at org.apache.derby.impl.jdbc.EmbedConnection.<init>(EmbedConnection.java:584)
>         at org.apache.derby.jdbc.Driver40.getNewEmbedConnection(Driver40.java:68)
>         at org.apache.derby.jdbc.InternalDriver.connect(InternalDriver.java:238)
>         at org.apache.derby.jdbc.AutoloadedDriver.connect(AutoloadedDriver.java:119)
>         at java.sql.DriverManager.getConnection(DriverManager.java:316)
>         at java.sql.DriverManager.getConnection(DriverManager.java:273)
> It ended up that some of the log files did not have proper write permissions because
some operation on the database had been performed by root.   They had subsequently deleted
their db.lck file so the database did not boot READ ONLY as it would if the root owned db.lck
file still existed and the symptom was that they got this error on shutdown.
> Clearly this was user error, but it would have been good if we gave a better error message.
 To reproduce on Linux:
> As a user with umask 0022, run the program 
> java MakeDB
> this will make the databases wombat and create a table.
> su root
> with umask 0022, run the program to insert data and remove the db.lck file:
> java InsertALot
> rm wombat/db.lck
> go back to the original user
> run the program:
> java ConnectAndShutdown
> The application gets the normal shutdown exception but if you look in derby.log you will
see the exception.
> java.lang.NullPointerException
>         at org.apache.derby.impl.store.raw.log.LogToFile.flush(LogToFile.java:3964)
>         ...
> I will attach the files.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message