Description
The core of the issue is that if a parent class reference an instance of its own child class as a static field, a deadlock can be created if 1 thread tries to access the parent class and another thread to the child class.
Thread A
"qtp1393828949-98" #98 prio=5 os_prio=0 cpu=294.10ms elapsed=6252.75s allocated=53246K defined_classes=243 tid=0x00007fa47c007000 nid=0x349c4e in Object.wait() [0x00007f9896620000]
java.lang.Thread.State: RUNNABLE
at org.apache.solr.search.facet.SlotAcc.<clinit>(SlotAcc.java:830)
at org.apache.solr.search.facet.FacetFieldProcessorByHashDV.createCollectAcc(FacetFieldProcessorByHashDV.java:271)
at org.apache.solr.search.facet.FacetFieldProcessorByHashDV.calcFacets(FacetFieldProcessorByHashDV.java:255)
Thread B
"qtp1393828949-2379" #2379 prio=5 os_prio=0 cpu=34.52ms elapsed=6013.46s allocated=20426K defined_classes=0 tid=0x00007fa49c081800 nid=0x34a58b in Object.wait() [0x00007f5fcfae7000]
java.lang.Thread.State: RUNNABLE
at org.apache.solr.search.facet.FacetFieldProcessorByArray.createCollectAcc(FacetFieldProcessorByArray.java:85)
at org.apache.solr.search.facet.FacetFieldProcessorByArray.calcFacets(FacetFieldProcessorByArray.java:144)
at org.apache.solr.search.facet.FacetFieldProcessorByArray.process(FacetFieldProcessorByArray.java:94)
... # Thread A : FacetFieldProcessorByHashDV.java:271 indexOrderAcc = new SlotAcc(fcontext) {, which accesses class SlotAcc, it would have a class init lock on SlotAcc(assuming first time loading SlotAcc in classloader) but BEFORE run to line SlotAcc.java:830
- Thread B: FacetFieldProcessorByArray.java:85 countAcc = new SweepingCountSlotAcc(numSlots, this);. Accesses SweepingCountSlotAcc (also assuming first time loading SweepingCountSlotAcc in classloader), loads and initialize based on hierarchy SweepingCountSlotAcc
> CountSlotArrAcc> CountSlotAcc -> SlotAcc, obtain lock and initialize SweepingCountSlotAcc,CountSlotArrAcc,CountSlotAcc but blocked on loading/initializing parent class SlotAcc, since Thread A has lock and is already initializing it - Thread A: run to line 830 static final CountSlotAcc DEV_NULL_SLOT_ACC = new CountSlotAcc(null)... Found CountSlotAcc, it will attempt to load CountSlotAcc as well, but such lock is held by Thread B
Attachments
Attachments
Issue Links
- relates to
-
SOLR-16167 Review static initializers that reference subclasses
- Open
- links to