[
https://issues.apache.org/jira/browse/DERBY-5389?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Rick Hillegas updated DERBY-5389:
---------------------------------
Attachment: derby-5389-01-aa-nullIdentity.diff
Attaching derby-5389-01-aa-nullIdentity.diff. This adds some defensive logic to
the identity setting method of SequenceUpdater. Without the defensive logic, a
SequenceUpdater can be in an ambiguous state if there is an error instantiating
a SequenceGenerator. I am running the full regression tests now.
On an insane build and on Java 5 or higher, the ambiguous state appears to be
harmless. The SequenceUpdater recovers from the ambiguity and correctly sets
its state the next time that it actually becomes usable. However, if you are
running on JDK 1.4 or CDC/FP 1.1, then Derby uses a different cache module
(Clock instead of ConcurrentCache). The path through ConcurrentCache ends up
cleaning the SequenceUpdater after the instantiation error, setting it to an
unambiguously clean state.. The path through Clock does not clean the
SequenceUpdater and this causes the Assertion to be raised the next time you
try to set the identity of the ambiguous SequenceUpdater.
The fix is to have the SequenceUpdater set its key to null if it can't
instantiate a SequenceGenerator. This makes its internal state consistent and
prevents us from raising the Assertion.
With the fix, the repro runs cleanly on sane builds on JDK 1.4 and phoneME. In
addition, the SequenceGenerator test runs cleanly for me on Java 6 and JDK 1.4.
The test also gets further than it used to on phoneME. However, the test hangs
at one point. So there might be another problem behind this one.
Kathey, could you test-drive the patch on a sane build on weme 6.2?
Touches the following file:
M java/engine/org/apache/derby/impl/sql/catalog/SequenceUpdater.java
> SequenceGeneratorTest failures with weme 6.2 sane build ASSERT FAILED
> Identity being changed on a live cacheable
> ----------------------------------------------------------------------------------------------------------------
>
> Key: DERBY-5389
> URL: https://issues.apache.org/jira/browse/DERBY-5389
> Project: Derby
> Issue Type: Bug
> Environment: weme 6.2
> java.runtime.version=2.4
> java.fullversion=IBM J9 2.4 Windows XP x86-32 (JIT enabled, AOT enabled)
> J9VM - 20080919_023055_lHdFGQ
> JIT - r9.weme62_20080724_2131
> GC - 20080609_AA
> Reporter: Kathey Marsden
> Attachments: DERBY_5389.java, derby-5389-01-aa-nullIdentity.diff
>
>
> I noticed these failures on trunk 10.9.0.0 1160489 with weme 6.2 and a sane
> build. They may have been around for some time as the nightlies only do an
> insane run with weme 6.2 and developers don't run weme tests with sane build
> frequently.
> 2)
> test_09_defaultRangeSize(org.apache.derbyTesting.functionTests.tests.lang.SequenceGeneratorTest)java.sql.SQLException:
> The exception 'org.apache.de
> rby.shared.common.sanity.AssertFailure: ASSERT FAILED Identity being changed
> on a live cacheable. Old uuidString = ff45762e-0131-f3dc-5f35-ffff92a7798
> d' was thrown while evaluating an expression.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:45)
> at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:142)
> at org.apache.derby.impl.jdbc.Util.seeNextException(Util.java:278)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:407)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(TransactionResourceImpl.java:348)
> at
> org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConnection.java:2290)
> at
> org.apache.derby.impl.jdbc.ConnectionChild.handleException(ConnectionChild.java:82)
> at
> org.apache.derby.impl.jdbc.EmbedResultSet.closeOnTransactionError(EmbedResultSet.java:4409)
> at
> org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(EmbedResultSet.java:472)
> at
> org.apache.derby.impl.jdbc.EmbedResultSet.next(EmbedResultSet.java:376)
> at
> org.apache.derbyTesting.functionTests.tests.lang.SequenceGeneratorTest.getScalarInteger(SequenceGeneratorTest.java:686)
> at
> org.apache.derbyTesting.functionTests.tests.lang.SequenceGeneratorTest.vetBumping(SequenceGeneratorTest.java:175)
> at
> org.apache.derbyTesting.functionTests.tests.lang.SequenceGeneratorTest.test_09_defaultRangeSize(SequenceGeneratorTest.java:608)
> at
> java.lang.reflect.AccessibleObject.invokeV(AccessibleObject.java:195)
> at
> org.apache.derbyTesting.junit.BaseTestCase.runBare(BaseTestCase.java:113)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> at
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> at
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> at
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> at
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> Caused by: java.sql.SQLException: Java exception: 'ASSERT FAILED Identity
> being changed on a live cacheable. Old uuidString = ff45762e-0131-f3dc-5f35-
> ffff92a7798d: org.apache.derby.shared.common.sanity.AssertFailure'.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:45)
> at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:142)
> at org.apache.derby.impl.jdbc.Util.javaException(Util.java:299)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:412)
> ... 62 more
> Caused by: org.apache.derby.shared.common.sanity.AssertFailure: ASSERT FAILED
> Identity being changed on a live cacheable. Old uuidString = ff45762e-01
> 31-f3dc-5f35-ffff92a7798d
> at
> org.apache.derby.shared.common.sanity.SanityManager.THROWASSERT(SanityManager.java:162)
> at
> org.apache.derby.shared.common.sanity.SanityManager.THROWASSERT(SanityManager.java:147)
> at
> org.apache.derby.impl.sql.catalog.SequenceUpdater.setIdentity(SequenceUpdater.java:255)
> at
> org.apache.derby.impl.services.cache.CachedItem.takeOnIdentity(CachedItem.java:222)
> at org.apache.derby.impl.services.cache.Clock.addEntry(Clock.java:800)
> at org.apache.derby.impl.services.cache.Clock.find(Clock.java:303)
> at
> org.apache.derby.impl.sql.catalog.DataDictionaryImpl.getCurrentValueAndAdvance(DataDictionaryImpl.java:10335)
> at
> org.apache.derby.impl.sql.execute.BaseActivation.getCurrentValueAndAdvance(BaseActivation.java:689)
> at
> org.apache.derby.exe.ac5135f637x0131xf3dcx5f35xffff92a7798d1.e0(Unknown
> Source)
> at
> org.apache.derby.impl.services.reflect.DirectCall.invoke(ReflectGeneratedClass.java:139)
> at
> org.apache.derby.impl.sql.execute.RowResultSet.getNextRowCore(RowResultSet.java:148)
> at
> org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.getNextRow(BasicNoPutResultSetImpl.java:478)
> at
> org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(EmbedResultSet.java:432)
> ... 56 more
> There was 1 failure:
> 1)
> test_08_userWrittenAllocators(org.apache.derbyTesting.functionTests.tests.lang.SequenceGeneratorTest)junit.framework.ComparisonFailure:
> Unexpected
> SQL state. expected:<X[0Y85]> but was:<X[J001]>
> at java.lang.Throwable.<init>(Throwable.java:67)
> at
> junit.framework.AssertionFailedError.<init>(AssertionFailedError.java:13)
> at junit.framework.ComparisonFailure.<init>(ComparisonFailure.java:22)
> at
> org.apache.derbyTesting.junit.BaseJDBCTestCase.assertSQLState(BaseJDBCTestCase.java:791)
> at
> org.apache.derbyTesting.junit.BaseJDBCTestCase.assertSQLState(BaseJDBCTestCase.java:826)
> at
> org.apache.derbyTesting.junit.BaseJDBCTestCase.assertSQLState(BaseJDBCTestCase.java:840)
> at
> org.apache.derbyTesting.junit.BaseJDBCTestCase.assertStatementError(BaseJDBCTestCase.java:1143)
> at
> org.apache.derbyTesting.functionTests.tests.lang.GeneratedColumnsHelper.expectExecutionError(GeneratedColumnsHelper.java:220)
> at
> org.apache.derbyTesting.functionTests.tests.lang.SequenceGeneratorTest.test_08_userWrittenAllocators(SequenceGeneratorTest.java:574)
> at
> java.lang.reflect.AccessibleObject.invokeV(AccessibleObject.java:195)
> at
> org.apache.derbyTesting.junit.BaseTestCase.runBare(BaseTestCase.java:113)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> at
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> at
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> at
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> at
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> Caused by: java.sql.SQLException: Java exception: 'ASSERT FAILED Identity
> being changed on a live cacheable. Old uuidString = ff45762e-0131-f3dc-5f35-
> ffff92a7798d: org.apache.derby.shared.common.sanity.AssertFailure'.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:45)
> at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:142)
> at org.apache.derby.impl.jdbc.Util.javaException(Util.java:299)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:412)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:407)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(TransactionResourceImpl.java:348)
> at
> org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConnection.java:2290)
> at
> org.apache.derby.impl.jdbc.ConnectionChild.handleException(ConnectionChild.java:82)
> at
> org.apache.derby.impl.jdbc.EmbedResultSet.closeOnTransactionError(EmbedResultSet.java:4409)
> at
> org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(EmbedResultSet.java:472)
> at
> org.apache.derby.impl.jdbc.EmbedResultSet.next(EmbedResultSet.java:376)
> at
> org.apache.derbyTesting.junit.JDBC.assertDrainResults(JDBC.java:686)
> at
> org.apache.derbyTesting.junit.BaseJDBCTestCase.fetchAndDiscardAllResults(BaseJDBCTestCase.java:1279)
> at
> org.apache.derbyTesting.junit.BaseJDBCTestCase.assertStatementError(BaseJDBCTestCase.java:1139)
> ... 54 more
> Caused by: org.apache.derby.shared.common.sanity.AssertFailure: ASSERT FAILED
> Identity being changed on a live cacheable. Old uuidString = ff45762e-01
> 31-f3dc-5f35-ffff92a7798d
> at
> org.apache.derby.shared.common.sanity.SanityManager.THROWASSERT(SanityManager.java:162)
> at
> org.apache.derby.shared.common.sanity.SanityManager.THROWASSERT(SanityManager.java:147)
> at
> org.apache.derby.impl.sql.catalog.SequenceUpdater.setIdentity(SequenceUpdater.java:255)
> at
> org.apache.derby.impl.services.cache.CachedItem.takeOnIdentity(CachedItem.java:222)
> at org.apache.derby.impl.services.cache.Clock.addEntry(Clock.java:800)
> at org.apache.derby.impl.services.cache.Clock.find(Clock.java:303)
> at
> org.apache.derby.impl.sql.catalog.DataDictionaryImpl.getCurrentValueAndAdvance(DataDictionaryImpl.java:10335)
> at
> org.apache.derby.impl.sql.execute.BaseActivation.getCurrentValueAndAdvance(BaseActivation.java:689)
> at
> org.apache.derby.exe.ac942f362cx0131xf3dcx5f35xffff92a7798d1.e0(Unknown
> Source)
> at
> org.apache.derby.impl.services.reflect.DirectCall.invoke(ReflectGeneratedClass.java:139)
> at
> org.apache.derby.impl.sql.execute.RowResultSet.getNextRowCore(RowResultSet.java:148)
> at
> org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.getNextRow(BasicNoPutResultSetImpl.java:478)
> at
> org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(EmbedResultSet.java:432)
> ... 58 more
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira