[ 
https://issues.apache.org/jira/browse/GROOVY-11966?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18076318#comment-18076318
 ] 

ASF GitHub Bot commented on GROOVY-11966:
-----------------------------------------

codecov-commenter commented on PR #2492:
URL: https://github.com/apache/groovy/pull/2492#issuecomment-4321733700

   ## 
[Codecov](https://app.codecov.io/gh/apache/groovy/pull/2492?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 Report
   :white_check_mark: All modified and coverable lines are covered by tests.
   :white_check_mark: Project coverage is 67.1168%. Comparing base 
([`ac71deb`](https://app.codecov.io/gh/apache/groovy/commit/ac71deb69d3193d07052fcaa57e3a442baf4e244?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache))
 to head 
([`e8bbc97`](https://app.codecov.io/gh/apache/groovy/commit/e8bbc97b86f2ea40efdffcb03f3c07e23e0c6754?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)).
   :warning: Report is 1 commits behind head on master.
   
   <details><summary>Additional details and impacted files</summary>
   
   
   
   [![Impacted file tree 
graph](https://app.codecov.io/gh/apache/groovy/pull/2492/graphs/tree.svg?width=650&height=150&src=pr&token=1r45138NfQ&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)](https://app.codecov.io/gh/apache/groovy/pull/2492?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
   
   ```diff
   @@                Coverage Diff                 @@
   ##               master      #2492        +/-   ##
   ==================================================
   + Coverage     67.1130%   67.1168%   +0.0038%     
     Complexity      31605      31605                
   ==================================================
     Files            1451       1451                
     Lines          122556     122567        +11     
     Branches        22006      22006                
   ==================================================
   + Hits            82251      82263        +12     
   - Misses          33220      33221         +1     
   + Partials         7085       7083         -2     
   ```
   
   | [Files with missing 
lines](https://app.codecov.io/gh/apache/groovy/pull/2492?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
 | Coverage Δ | |
   |---|---|---|
   | 
[...a/org/codehaus/groovy/ast/NodeMetaDataHandler.java](https://app.codecov.io/gh/apache/groovy/pull/2492?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fcodehaus%2Fgroovy%2Fast%2FNodeMetaDataHandler.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Ob2RlTWV0YURhdGFIYW5kbGVyLmphdmE=)
 | `92.4528% <100.0000%> (+1.9766%)` | :arrow_up: |
   
   ... and [23 files with indirect coverage 
changes](https://app.codecov.io/gh/apache/groovy/pull/2492/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
   </details>
   <details><summary> :rocket: New features to boost your workflow: </summary>
   
   - :snowflake: [Test 
Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, 
report on failures, and find test suite problems.
   - :package: [JS Bundle 
Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save 
yourself from yourself by tracking and limiting bundle sizes in JS merges.
   </details>




> AnnotationNode.isTargetAllowed introduces concurrent write to shared 
> ListHashMap
> --------------------------------------------------------------------------------
>
>                 Key: GROOVY-11966
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11966
>             Project: Groovy
>          Issue Type: Bug
>            Reporter: Paul King
>            Assignee: Paul King
>            Priority: Major
>
> h3. Summary
> {{AnnotationNode.isTargetAllowed}} (and {{getRetentionPolicy}}) lazily caches 
> its result via {{classNode.redirect().getNodeMetaData(Target.class, 
> factory)}}, which delegates to {{NodeMetaDataHandler.getNodeMetaData(Object, 
> Function)}} and ultimately calls {{computeIfAbsent}} on a {{ListHashMap}}. 
> {{ListHashMap}} is documented as not thread-safe.
> The {{ClassNode}} for built-in annotations like {{@CompileStatic}}, 
> {{@Inject}}, {{@Target}}, etc. is shared process-wide via 
> {{ClassHelper.makeCached}} (SoftReference cache keyed by {{Class}}). Parallel 
> compiles in the same JVM (Gradle {{--parallel}}, multi-source-set builds, 
> Grails worker pools) therefore race on the same metadata map.
> h3. Symptom
> {{ArrayIndexOutOfBoundsException}} from {{ListHashMap.toMap}} / 
> {{ListHashMap.put}} during the array-to-{{HashMap}} resize. Concretely, one 
> thread can finish the {{evolve}} branch and bump {{size}} past 
> {{keys.length}} while another thread is mid-{{toMap}} reading {{keys[i]}}.
> h3. Affects
> Master only. Path was introduced by GROOVY-6526 (commit {{e16c9fb618}}) and 
> is exercised on every annotation by GROOVY-11838's default-target 
> enforcement. Groovy 5 returned a precomputed {{int}} field with no 
> shared-state access.
> h3. Fix options
> * Add dedicated {{volatile int allowedTargets}} and {{volatile 
> RetentionPolicy retentionPolicy}} fields to {{ClassNode}}; lazy-init from 
> {{AnnotationNode}}, bypassing {{NodeMetaDataHandler}} for these two lookups. 
> Idempotent computation, safe under races, no lock.
> * Switch {{NodeMetaDataHandler.newMetaDataMap()}} default to 
> {{ConcurrentHashMap}} (atomic {{computeIfAbsent}}). Wider scope, fixes any 
> similar latent races in other metadata callers.
> * Synchronise the read-modify-write in 
> {{NodeMetaDataHandler.getNodeMetaData(Object, Function)}}.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to