Fix class initialization deadlock in AbstractArrayItem and AbstractMapItem#517
Conversation
…pItem Convert static field initializers that trigger cross-class initialization to use lazy initialization via Lazy<T>. This prevents class initialization deadlock when JUnit 5's SEPARATE_THREAD timeout mode causes concurrent class loading from multiple threads. The deadlock occurred because static ARGUMENTS field initialization called IIntegerItem.type()/IAnyAtomicItem.type(), which triggered initialization of other classes. When multiple threads competed for class locks during parallel test execution, they could deadlock. Fixes #515
📝 WalkthroughWalkthroughLazy initialization pattern replaces eager static instantiation of argument lists and empty singletons in array and map item classes, deferring object creation until first access to mitigate class initialization deadlock scenarios. Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (2)
🧰 Additional context used🧬 Code graph analysis (2)core/src/main/java/gov/nist/secauto/metaschema/core/metapath/item/function/impl/AbstractMapItem.java (2)
core/src/main/java/gov/nist/secauto/metaschema/core/metapath/item/function/impl/AbstractArrayItem.java (2)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
🔇 Additional comments (9)
Comment |
Summary
AbstractArrayItemandAbstractMapItemto use lazy initialization viaLazy<T>SEPARATE_THREADtimeout mode causes concurrent class loading from multiple threadsProblem
The deadlock occurred because:
ARGUMENTSfield initialization calledIIntegerItem.type()/IAnyAtomicItem.type()SEPARATE_THREADmode) could trigger class initialization simultaneously with the test threadSolution
Convert the problematic static fields to use
Lazy<>pattern:ARGUMENTSfield now usesLazy<List<IArgument>>EMPTYsingleton now usesLazy<IArrayItem<?>>/Lazy<IMapItem<?>>This defers initialization until first use within a single thread context, preventing the deadlock.
Test plan
ArraySizeTest,MapSizeTest,MapContainsTestpass withforkCount=4Fixes #515
Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.