[
https://issues.apache.org/jira/browse/DERBY-2861?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12605116#action_12605116
]
Dag H. Wanvik commented on DERBY-2861:
--------------------------------------
When I added synchronized(this) for both dm.getPersistentProviderInfos and
dm.clearColumnInfoInProviders
I observed another race:
Table: SCHEMAMAIN.SOURCETABLE
--->thread 1: Thread[Thread-11,5,main]
**
org.apache.derby.iapi.sql.dictionary.TableDescriptor.setReferencedColumnMap(TableDescriptor.java:381)
**
org.apache.derby.impl.sql.catalog.DataDictionaryImpl.getTableDescriptor(DataDictionaryImpl.java:1997)
**
org.apache.derby.impl.sql.compile.QueryTreeNode.getTableDescriptor(QueryTreeNode.java:1228)
**
org.apache.derby.impl.sql.compile.FromBaseTable.bindTableDescriptor(FromBaseTable.java:2445)
**
org.apache.derby.impl.sql.compile.FromBaseTable.bindNonVTITables(FromBaseTable.java:2175)
** org.apache.derby.impl.sql.compile.FromList.bindTables(FromList.java:310)
**
org.apache.derby.impl.sql.compile.SelectNode.bindNonVTITables(SelectNode.java:390)
**
org.apache.derby.impl.sql.compile.FromSubquery.bindNonVTITables(FromSubquery.java:154)
**
org.apache.derby.impl.sql.compile.FromBaseTable.bindNonVTITables(FromBaseTable.java:2290)
** org.apache.derby.impl.sql.compile.FromList.bindTables(FromList.java:310)
**
org.apache.derby.impl.sql.compile.SelectNode.bindNonVTITables(SelectNode.java:390)
**
org.apache.derby.impl.sql.compile.CreateViewNode.bindViewDefinition(CreateViewNode.java:259)
**
org.apache.derby.impl.sql.compile.CreateViewNode.bindStatement(CreateViewNode.java:181)
**
org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java:314)
** org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:88)
**
org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(GenericLanguageConnectionContext.java:794)
** org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:606)
** org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:555)
**
TestEmbeddedMultiThreading.executeStatement(TestEmbeddedMultiThreading.java:124)
** TestEmbeddedMultiThreading.access$100(TestEmbeddedMultiThreading.java:25)
**
TestEmbeddedMultiThreading$ViewCreatorDropper.run(TestEmbeddedMultiThreading.java:188)
** java.lang.Thread.run(Thread.java:619)
--->thread 2: Thread[Thread-8,5,main]
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1206)
at
org.apache.derby.iapi.sql.dictionary.TableDescriptor.getObjectName(TableDescriptor.java:796)
at
org.apache.derby.impl.sql.depend.BasicDependencyManager.getPersistentProviderInfos(BasicDependencyManager.java:683)
at
org.apache.derby.impl.sql.compile.CreateViewNode.bindViewDefinition(CreateViewNode.java:287)
at
org.apache.derby.impl.sql.compile.CreateViewNode.bindStatement(CreateViewNode.java:181)
at
org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java:314)
at
org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:88)
at
org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(GenericLanguageConnectionContext.java:794)
at
org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:606)
at
org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:555)
at
TestEmbeddedMultiThreading.executeStatement(TestEmbeddedMultiThreading.java:124)
at
TestEmbeddedMultiThreading.access$100(TestEmbeddedMultiThreading.java:25)
at
TestEmbeddedMultiThreading$ViewCreatorDropper.run(TestEmbeddedMultiThreading.java:188)
at java.lang.Thread.run(Thread.java:619)
> Thread safety issue in TableDescriptor
> --------------------------------------
>
> Key: DERBY-2861
> URL: https://issues.apache.org/jira/browse/DERBY-2861
> Project: Derby
> Issue Type: Bug
> Components: SQL
> Environment: Tested on a dual-core 3GHz Pentium machine running
> Windows Vista Business, using JDK 1.4.2_13 and Derby trunk revision 548822.
> Reporter: Jeff Clary
> Attachments: TestEmbeddedMultiThreading.java
>
>
> A NullPointerException occurs in
> org.apache.derby.iapi.sql.dictionary.TableDescriptor.getObjectName when
> accessing the same object on many threads (each with its own connection).
> The attached test program starts N threads each creating and then dropping a
> separate view against the same source view, repeated M times. I can
> reproduce the problem with N=100 and M=100 on my machine, but not every run.
> An instance member named referencedColumnMap is checked for null at the top
> of the getObjectName method, but later when it is dereferenced it is null,
> because it was set to null by another thread. I am not sure what
> getObjectName is used for other than error reporting. I have considered a
> fix of just saving the non-null reference as a method variable, to avoid the
> later NullPointerException. But I don't know what unintended consequences
> this may have.
> When the test program does show the exception, the stack trace looks like
> this:
> java.lang.NullPointerException
> at
> org.apache.derby.iapi.sql.dictionary.TableDescriptor.getObjectName(TableDescriptor.java:758)
> at
> org.apache.derby.impl.sql.depend.BasicDependencyManager.getPersistentProviderInfos(BasicDependencyManager.java:677)
> at
> org.apache.derby.impl.sql.compile.CreateViewNode.bindViewDefinition(CreateViewNode.java:287)
> at
> org.apache.derby.impl.sql.compile.CreateViewNode.bind(CreateViewNode.java:183)
> at
> org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java:345)
> at
> org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:119)
> at
> org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(GenericLanguageConnectionContext.java:745)
> at
> org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:568)
> at
> org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:517)
> at
> TestEmbeddedMultiThreading.executeStatement(TestEmbeddedMultiThreading.java:109)
> at
> TestEmbeddedMultiThreading.access$100(TestEmbeddedMultiThreading.java:10)
> at
> TestEmbeddedMultiThreading$ViewCreatorDropper.run(TestEmbeddedMultiThreading.java:173)
> at java.lang.Thread.run(Thread.java:534)
>
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.