Uploaded image for project: 'Solr'
  1. Solr
  2. SOLR-16165

Deadlock in SlotAcc initialization

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • 9.0, 8.11.1, 9.1
    • 9.1.1
    • faceting
    • None

    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

      1. 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
      2. 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

        Issue Links

          Activity

            People

              noble.paul Noble Paul
              jsweeney Justin Sweeney
              Votes:
              0 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0h
                  0h
                  Logged:
                  Time Spent - 50m
                  50m