[
https://issues.apache.org/jira/browse/TORQUE-372?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17923766#comment-17923766
]
Harald Nuding commented on TORQUE-372:
--------------------------------------
[^recordMapperBase-1.vm] is the corrected version.
It does no longer create and use a MappingStrategy member variable.
If the build option useMappingStrategy is not set, initStrategy() simply return
null and a comment will be added
> Apache Torque 6 concurrency problem
> -----------------------------------
>
> Key: TORQUE-372
> URL: https://issues.apache.org/jira/browse/TORQUE-372
> Project: Torque
> Issue Type: Bug
> Components: Templates
> Affects Versions: 6.0
> Reporter: Georg Kallidis
> Priority: Major
> Fix For: 7.0
>
> Attachments: recordMapperBase-1.vm
>
>
> This was provided as e-mail from Harald Nuding 4th of Feb 2025:
> {noformat}
> We’re working on a 3pp uplift of an old project based on Torque 5.1 towards
> the new version 6.0.
> The migration was painless so far, so thank you all for the effort you spend!
>
> During regression testing we run into a concurrency problem.
> The problem happens when multiple treads parallel initialize the Recordmapper
> of the same Table:
> java.util.ConcurrentModificationException: null
> at java.base/java.util.ArrayList.sort(ArrayList.java:1723)
> ~[?:?]
> at
> org.apache.torque.om.mapper.MappingStrategy.finish(MappingStrategy.java:70)
> ~[torque-runtime-6.0.jar:6.0]
> at
> app.backend.torque.BaseZoneRecordMapper.processRow(BaseZoneRecordMapper.java:635)
> ~[classes/:?]
> at
> app.backend.torque.BaseZoneRecordMapper.processRow(BaseZoneRecordMapper.java:1)
> ~[classes/:?]
> at
> org.apache.torque.util.ResultsetSpliterator.tryAdvance(ResultsetSpliterator.java:120)
> ~[torque-runtime-6.0.jar:6.0]
> at
> java.base/java.util.Spliterator.forEachRemaining(Spliterator.java:332) ~[?:?]
> at
> java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
> ~[?:?]
> at
> java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
> ~[?:?]
> at
> java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
> ~[?:?]
> at
> java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
> ~[?:?]
> at
> java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
> ~[?:?]
> at
> org.apache.torque.util.BasePeerImpl.doSelect(BasePeerImpl.java:1153)
> ~[torque-runtime-6.0.jar:6.0]
> at
> org.apache.torque.util.BasePeerImpl.doSelect(BasePeerImpl.java:836)
> ~[torque-runtime-6.0.jar:6.0]
> Drilling down the stack, we were able to identify the root cause at the
> (singleton) initialisation of the Table
> specific
> Base<table name>RecordMapper
> The template definition of recordMapperBase.vm om module torque-templates
> produces concurrency sensitive code,
> especially the lazy initialization of the strategy member at line 172ff.
> (introduced with TORQUE-364: init a new Strategy implementation)
>
> 111 ## TORQUE-364: Should this be cached per RecordMapper (Thread
> safety/Multi query safety?)
> 112 private MappingStrategy<${dbObjectClassName}> strategy;
> ...
> 172 if (useMappingStrategy) {
> 173 initStrategy();
> 174 }
> ...
> 194 if (useMappingStrategy)
> 195 {
> 196 strategy.addColumn(nextOffset,
> 197 (res, inst) -> inst.${setter}(
> ${getter}(res, nextOffset)));
> 198 } else
> {noformat}
> Harald proposes a solution and attached a fix fro recordeMapperBase.vm:
> {noformat}
> I like to propose a solution for this problem:
> 1) The comment at line 111 was right 😊
> 2) initStrategy() should return the created MappingStrategy.
> 3) The MappingStrategy value must be used within the processRow( .. )
> method
> 4) A double init of the strategy member does not do any harm, as long the
> created MappingStrategy instance is
> used within the processRow( .. ) method
> 5) Synchronisation or volatile on this.strategy is not needed then
> 6) The boolean member useMappingStrategy can be omitted
> I’ve attached our the modified and tested recordMapperBase.vm template file.
> ...
> {noformat}
> I start to test it soon and then put it into the repo trunk with comment like
> TORQUE-ID contributed by ..
> Any comments welcome :)
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]