[ 
https://issues.apache.org/jira/browse/DERBY-2074?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Knut Anders Hatlen updated DERBY-2074:
--------------------------------------

    Attachment: d2074-1a.diff

Here's an alternative fix (d2047-1a.diff). I'm not able to reproduce the bug 
when it's applied, and replication also works with this change. Will run the 
full regression test suite to see if it introduces any other problems, and I'll 
also see if I can add a JUnit test case.

In this patch, I've added a flag to ModuleInstance to indicate whether or not 
the instance has finished booting. TopService.bootModule() checks this flag 
when it walks through the moduleInstances list looking for an already booted 
instance to use, and skips the module instance if it isn't fully booted. This 
fixes the bug since the code that failed because the module was only partly 
initialized, will no longer be called unless it's fully initialized.

In the cases where we'd get a NullPointerException before, we'll now create and 
boot two separate instances of the module. But there's already a window in 
which it is possible to end up booting two instances of the same module 
(because we drop the synchronization while booting) and it is correctly handled 
by the existing code, so widening the window shouldn't cause any problems. 
TopService.bootModule() handles it by checking if someone else successfully 
added an instance while we were initializing ours. If so, our instance will be 
discarded and we'll fall back to the other newly created instance.

> Several times exception from derby implementation was thrown (were unable to 
> eproduce and check if it caused by any our work)
> -----------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-2074
>                 URL: https://issues.apache.org/jira/browse/DERBY-2074
>             Project: Derby
>          Issue Type: Bug
>          Components: Store
>    Affects Versions: 10.1.3.1
>         Environment: WinXP Professional, Java 1.5.0_06
>            Reporter: Kovylin Alexandr
>            Assignee: Knut Anders Hatlen
>            Priority: Minor
>         Attachments: d2074-1a.diff, LoadSorter.java
>
>
> 12:34:45,323 ERROR [pool-1-thread-3] history.helpers.HistoryDataAccessHelper 
> - failed to read measurements, filter = (fromTime=Mon Nov 06 12:34:00 MSK 
> 2006, toTime=Mon Nov 13 12:34:00 MSK 2006, , properties=2-6-2-value) 
> org.springframework.jdbc.UncategorizedSQLException: 
> PreparedStatementCallback; uncategorized SQLException for SQL [SELECT 
> COUNT(DISTINCT sshis.measurement_time) FROM sshis_property_measurement sshis 
> INNER JOIN sstmp_filter_3 filtertbl ON sshis.property_id = 
> filtertbl.property_id WHERE sshis.measurement_time >= ? AND 
> sshis.measurement_time < ?]; SQL state [XJ001]; error code [0]; Java 
> exception:':
>  java.lang.NullPointerException'.; nested exception is
> org.apache.derby.impl.jdbc.EmbedSQLException: Java exception: ': 
> java.lang.NullPointerException'.
> java.lang.NullPointerException
>         at java.util.Hashtable.put(Unknown Source)
>         at 
> org.apache.derby.impl.store.access.RAMAccessManager.registerAccessMethod(Unknown
>  Source)
>         at 
> org.apache.derby.impl.store.access.RAMAccessManager.findMethodFactoryByImpl(Unknown
>  Source)
>         at 
> org.apache.derby.impl.store.access.RAMTransaction.createSort(UnknownSource)
>         at 
> org.apache.derby.impl.sql.execute.DistinctScalarAggregateResultSet.loadSorter(Unknown
>  Source)
>         at 
> org.apache.derby.impl.sql.execute.DistinctScalarAggregateResultSet.openCore(Unknown
>  Source)
>         at 
> org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.openCore(Unknown 
> Source)
>         at 
> org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.open(Unknown Source)
>         at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown 
> Source)
>         at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown 
> Source)
>         at 
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(Unknown 
> Source)
>         at 
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeQuery(Unknown Source)
>         at 
> org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:535)
>         at 
> org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:476)
>         at 
> org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:528)
>         at 
> org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:561)
>         at 
> org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:579)
>         at 
> org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:589)
>         at 
> org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:619)
>         at 
> org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:629)
>         at 
> org.springframework.jdbc.core.JdbcTemplate.queryForInt(JdbcTemplate.java:656)
>         at 
> com.meshnetics.wsn.ctrl.dispatcher.services.history.helpers.MeasurementsSaveGetHelper.getMeasurements(MeasurementsSaveGetHelper.java:81)
>         at 
> com.meshnetics.wsn.ctrl.dispatcher.services.history.helpers.HistoryDataAccessHelper$7.doInTransaction(HistoryDataAccessHelper.java:315)
>         at 
> com.meshnetics.wsn.ctrl.dispatcher.services.history.helpers.HistoryDataAccessHelper$7.doInTransaction(HistoryDataAccessHelper.java:314)
>         at 
> org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:117)
>         at 
> com.meshnetics.wsn.ctrl.dispatcher.services.history.helpers.HistoryDataAccessHelper.getMeasurements(HistoryDataAccessHelper.java:313)
>         at 
> com.meshnetics.wsn.ctrl.dispatcher.services.history.asyncread.MeasurementsReadTask.executeTask(MeasurementsReadTask.java:127)
>         at 
> com.meshnetics.wsn.ctrl.dispatcher.services.history.asyncread.MeasurementsReadTask.run(MeasurementsReadTask.java:97)
>         at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
>         at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
>         at java.util.concurrent.FutureTask.run(Unknown Source)
>         at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown 
> Source)
>         at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
>         at java.lang.Thread.run(Unknown Source)

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

Reply via email to