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

Knut Anders Hatlen commented on DERBY-5894:
-------------------------------------------

Synchronizing backupContainer() might fix this particular NPE, but it made some 
tests trip over an assert in RAFContainer4.readPage(long,byte[],long). The 
problem is that readPage() checks whether the call is synchronized, and behaves 
differently if it is. And backupContainer() will end up calling readPage(), but 
now synchronized instead of unsynchronized, and this was unexpected. See the 
description of "stealth mode" in DERBY-4741 for details.

Synchronization in backupContainer() is only needed in order to protect the 
actionCode, actionContainerHandle and actionBackupLocation variables, and those 
variables are only needed because all of RAFContainer's privileged operations 
share one run() method, I think it's just as reasonable to keep it 
unsynchronized and instead let backupContainer() have its own run() method in 
an inner class. I even think that it's a cleaner approach in general, both 
because it avoids this class of bugs, and because it's more scalable as it 
avoids a global lock on the container for each privileged operation (not that 
relevant for backup, though, but still...).

The tests that failed when RAFContainer.backupContainer() was made 
synchronized, were:

lang.DatabaseClassLoadingTest
lang.TruncateTableAndOnlineBackupTest

derbyall/storeall/storeall.fail:store/rollForwardBackup.sql
derbyall/storeall/storeall.fail:store/rollForwardRecovery.sql
derbyall/storeall/storeall.fail:store/backupRestore.sql
derbyall/storeall/storeall.fail:store/backupRestore1.java
derbyall/storeall/storeall.fail:store/OnlineBackupTest1.java
derbyall/storeall/storeall.fail:store/OnlineBackupTest3.java
derbyall/storeall/storeall.fail:storetests/st_1.sql
derbyall/encryptionAll/encryptionAll.fail:store/encryptDatabaseTest3.sql
                
> NPE in OnlineBackupTest1 while backing up in stubFileToRemoveAfterCheckPoint
> ----------------------------------------------------------------------------
>
>                 Key: DERBY-5894
>                 URL: https://issues.apache.org/jira/browse/DERBY-5894
>             Project: Derby
>          Issue Type: Bug
>          Components: Store
>            Reporter: Dag H. Wanvik
>            Assignee: Knut Anders Hatlen
>              Labels: derby_triage10_10
>         Attachments: d5894.zip
>
>
> Saw this while running OnlineBackupTest1 trying to repro DERBY-973.
> ERROR 38000: The exception 'java.lang.NullPointerException' was thrown while 
> evaluating an expression.
>         at 
> org.apache.derby.iapi.error.StandardException.newException(StandardException.java:288)
>         at 
> org.apache.derby.iapi.error.StandardException.unexpectedUserException(StandardException.java:575)
>         at 
> org.apache.derby.impl.services.reflect.ReflectMethod.invoke(ReflectMethod.java:63)
>         at 
> org.apache.derby.impl.sql.execute.CallStatementResultSet.open(CallStatementResultSet.java:75)
>         at 
> org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(GenericPreparedStatement.java:443)
>         at 
> org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:324)
>         at 
> org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1242)
>         at 
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(EmbedPreparedStatement.java:1715)
>         at 
> org.apache.derby.impl.jdbc.EmbedCallableStatement.executeStatement(EmbedCallableStatement.java:118)
>         at 
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.execute(EmbedPreparedStatement.java:1370)
>         at 
> org.apache.derbyTesting.functionTests.tests.store.OnlineBackup.performBackup(OnlineBackup.java:89)
>         at 
> org.apache.derbyTesting.functionTests.tests.store.OnlineBackup.run(OnlineBackup.java:60)
>         at java.lang.Thread.run(Thread.java:637)
> Caused by: java.lang.NullPointerException
>         at java.util.Hashtable.put(Hashtable.java:401)
>         at 
> org.apache.derby.impl.store.raw.data.BaseDataFileFactory.stubFileToRemoveAfterCheckPoint(BaseDataFileFactory.java:1613)
>         at 
> org.apache.derby.impl.store.raw.data.RAFContainer.run(RAFContainer.java:1651)
>         at java.security.AccessController.doPrivileged(Native Method)
>         at 
> org.apache.derby.impl.store.raw.data.RAFContainer.backupContainer(RAFContainer.java:983)
>         at 
> org.apache.derby.impl.store.raw.data.BaseContainerHandle.backupContainer(BaseContainerHandle.java:1031)
>         at 
> org.apache.derby.impl.store.raw.data.BaseDataFileFactory.backupDataFiles(BaseDataFileFactory.java:2466)
>         at org.apache.derby.impl.store.raw.RawStore.backup(RawStore.java:978)
>         at org.apache.derby.impl.store.raw.RawStore.backup(RawStore.java:649)
>         at 
> org.apache.derby.impl.store.access.RAMAccessManager.backup(RAMAccessManager.java:964)
>         at 
> org.apache.derby.impl.db.BasicDatabase.backup(BasicDatabase.java:430)
>         at 
> org.apache.derby.catalog.SystemProcedures.SYSCS_BACKUP_DATABASE(SystemProcedures.java:961)
>         at 
> org.apache.derby.exe.acf33d40c7x0138x6d7cx6df3x0000720ad17b0.g0(Unknown 
> Source)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>         at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>         at java.lang.reflect.Method.invoke(Method.java:592)
>         at 
> org.apache.derby.impl.services.reflect.ReflectMethod.invoke(ReflectMethod.java:46)
>         ... 10 more

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to