[
https://issues.apache.org/jira/browse/DERBY-5344?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Kathey Marsden updated DERBY-5344:
----------------------------------
Attachment: heapdump.20110720.zip
heapanalyzer.20110720.215042.24230.0001.jpg
Attaching the heapdump and a screen shot of heap analyzer for the run I did in
July.
The IBM heap analyzer can be found at:
https://www.ibm.com/developerworks/mydeveloperworks/groups/service/html/communityview?communityUuid=4544bafe-c7a2-455f-9d43-eb866ea60091
The heapdump shows a SQLClob with String (presumably value of the underlying
SQLChar) of size 209.716,216 bytes, so presumably a problem with
materialization but the thing I don't really understand is why this size when
the actual lobs in the test are much larger. I am thinking probably something
is happening in EmbedResultSet updateRow() related to setting the parameters
of the constructed WHERE CURRENT OF statement in this code:
//using quotes around the cursor name to preserve case sensitivity
updateWhereCurrentOfSQL.append(" WHERE CURRENT OF " +
IdUtil.normalToDelimited(getCursorName()));
StatementContext currSC = lcc.getStatementContext();
Activation parentAct = null;
if (currSC != null) {
parentAct = currSC.getActivation();
}
// Context used for preparing, don't set any timeout (use 0)
statementContext = lcc.pushStatementContext(isAtomic, false,
updateWhereCurrentOfSQL.toString(), null, false, 0L);
// A priori, the new statement context inherits the activation of
// the existing statementContext, so that that activation ends up
// as parent of the new activation 'act' created below, which will
// be the activation of the pushed statement context.
statementContext.setActivation(parentAct);
org.apache.derby.iapi.sql.PreparedStatement ps =
lcc.prepareInternalStatement(updateWhereCurrentOfSQL.toString());
Activation act = ps.getActivation(lcc, false);
statementContext.setActivation(act);
//in this for loop we are assigning values for parameters in sql
constructed earlier with columnname=?,...
for (int i=1, paramPosition=0; i<=rd.getColumnCount(); i++) {
if (columnGotUpdated[i-1]) //if the column got updated, do
following
act.getParameterValueSet().getParameterForSet(paramPosition++).setValue(updateRow.getColumn(i));
}
But that theory may be off as I would have expected that in that case it would
be setValue() that would have been the method that would have run out of memory
rather than updateRow(). Maybe setValue got inlined?
Myrna and I also looked at her recent heapdump in heap analyzer. Hers was
quite odd as there was an orphaned char[] of approximately 39MB (she ran with a
smaller heap). I am thinking maybe in that case the large string was in the
process of being garbage collected and so had no parents but was still there.
Still it shows an inappropriately large string is being built up.
> updateClob2 test in LobLimitsTest gets OutOfMemoryError on updateRow with
> embedded
> ----------------------------------------------------------------------------------
>
> Key: DERBY-5344
> URL: https://issues.apache.org/jira/browse/DERBY-5344
> Project: Derby
> Issue Type: Bug
> Components: Store, Test
> Affects Versions: 10.9.1.0
> Reporter: Kathey Marsden
> Labels: derby_triage10_10
> Attachments: DERBY-5344_dump.jar,
> heapanalyzer.20110720.215042.24230.0001.jpg, heapdump.20110720.zip
>
>
> On converting LobLimits.java to LobLimitsTest I noticed this disabled test:
> There is disabled test in largedata.LobLimitsTest.java which is a carryover
> from largedata.LobLimits.java
> // Disabled for now, this will materialize, will open
> // jira for it.
> // updateClob2("ClobTest
> #8.1",conn,selectClob,BIG_LOB_SZ,0,0,10,1,CHARDATAFILE);
> Enabling the test for embedded I noticed it still can get an out of memory.
> (I actually think I did run it once successfully)
> but on my second full run of the suite I saw it fail.
>
> java.sql.SQLException: Java exception: ': java.lang.OutOfMemoryError'.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:98)
> 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.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.updateRow(EmbedResultSet.java:3788)
> at
> org.apache.derbyTesting.functionTests.tests.largedata.LobLimitsTest.updateClob2(LobLimitsTest.java:1219)
> at
> org.apache.derbyTesting.functionTests.tests.largedata.LobLimitsTest.testClob2(LobLimitsTest.java:304)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
> at java.lang.reflect.Method.invoke(Method.java:611)
> at junit.framework.TestCase.runTest(TestCase.java:154)
> at junit.framework.TestCase.runBare(TestCase.java:127)
> at
> org.apache.derbyTesting.junit.BaseTestCase.runBare(BaseTestCase.java:112)
> at junit.framework.TestResult$1.protect(TestResult.java:106)
> at junit.framework.TestResult.runProtected(TestResult.java:124)
> at junit.framework.TestResult.run(TestResult.java:109)
> at junit.framework.TestCase.run(TestCase.java:118)
> at junit.framework.TestSuite.runTest(TestSuite.java:208)
> at junit.framework.TestSuite.run(TestSuite.java:203)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:22)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:19)
> at junit.framework.TestResult.runProtected(TestResult.java:124)
> at junit.extensions.TestSetup.run(TestSetup.java:23)
> at
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:22)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:19)
> at junit.framework.TestResult.runProtected(TestResult.java:124)
> at junit.extensions.TestSetup.run(TestSetup.java:23)
> at junit.framework.TestSuite.runTest(TestSuite.java:208)
> at junit.framework.TestSuite.run(TestSuite.java:203)
> at junit.textui.TestRunner.doRun(TestRunner.java:116)
> at junit.textui.TestRunner.start(TestRunner.java:172)
> at junit.textui.TestRunner.main(TestRunner.java:138)
> Caused by: java.sql.SQLException: Java exception: ':
> java.lang.OutOfMemoryError'.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:45)
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(SQLExceptionFactory40.java:122)
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:71)
> ... 37 more
> Caused by: java.lang.OutOfMemoryError
> at
> org.apache.derby.iapi.services.io.DynamicByteArrayOutputStream.expandBuffer(DynamicByteArrayOutputStream.java:244)
> at
> org.apache.derby.iapi.services.io.DynamicByteArrayOutputStream.write(DynamicByteArrayOutputStream.java:78)
> at java.io.DataOutputStream.write(DataOutputStream.java)
> at org.apache.derby.iapi.types.SQLChar.writeUTF(SQLChar.java:922)
> at org.apache.derby.iapi.types.SQLChar.writeClobUTF(SQLChar.java:960)
> at org.apache.derby.iapi.types.SQLClob.writeExternal(SQLClob.java:647)
> at
> org.apache.derby.impl.store.raw.data.StoredPage.logColumn(StoredPage.java:6325)
> at
> org.apache.derby.impl.store.raw.data.StoredPage.logRow(StoredPage.java:4006)
> at
> org.apache.derby.impl.store.raw.data.UpdateOperation.writeOptionalDataToBuffer(UpdateOperation.java:255)
> at
> org.apache.derby.impl.store.raw.data.UpdateOperation.<init>(UpdateOperation.java:106)
> at
> org.apache.derby.impl.store.raw.data.LoggableActions.actionUpdate(LoggableActions.java:80)
> at
> org.apache.derby.impl.store.raw.data.StoredPage.doUpdateAtSlot(StoredPage.java:8602)
> at
> org.apache.derby.impl.store.raw.data.BasePage.updateAtSlot(BasePage.java:1064)
> at
> org.apache.derby.impl.store.access.conglomerate.GenericConglomerateController.replace(GenericConglomerateController.java:486)
> at
> org.apache.derby.impl.sql.execute.RowChangerImpl.updateRow(RowChangerImpl.java:523)
> at
> org.apache.derby.impl.sql.execute.UpdateResultSet.collectAffectedRows(UpdateResultSet.java:569)
> at
> org.apache.derby.impl.sql.execute.UpdateResultSet.open(UpdateResultSet.java:264)
> at
> org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(GenericPreparedStatement.java:436)
> at
> org.apache.derby.impl.sql.GenericPreparedStatement.executeSubStatement(GenericPreparedStatement.java:306)
> at
> org.apache.derby.impl.jdbc.EmbedResultSet.updateRow(EmbedResultSet.java:3772)
> ... 29 more
> The test passes on client and in LobLimitsLiteTest in embedded. To reproduce
> run largedata.LobLimitsTest, commenting out the below condition:
> if (!(usingEmbedded() && BIGGEST_LOB_SZ == _2GB)) {
> updateClob2("ClobTest
> #8.1",selectClob,BIG_LOB_SZ,0,0,10,CHARDATAFILE);
> }
> or likely you can get a smaller standalone test case by adjusting the sizes
> and adjusting down the heap with -Xmx
--
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