[ 
https://issues.apache.org/jira/browse/HDFS-16033?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

yikf updated HDFS-16033:
------------------------
    Description: 
Cleaner thread will be blocked if we remove reference from ReferenceQueue 
unless the `queue.enqueue` called.

As shown below, We call ReferenceQueue.remove() now while cleanUp, Call chain 
as follow:

StatisticsDataReferenceCleaner#queue.remove()  ->  ReferenceQueue.remove(0)  -> 
lock.wait(0)

But, lock.notifyAll is called when queue.enqueue only, so Cleaner thread will 
be blocked.

ThreadDump:
{code:java}
"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007f7afc088800 
nid=0x2119 in Object.wait() [0x00007f7b00230000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000000c00c2f58> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - locked <0x00000000c00c2f58> (a java.lang.ref.Reference$Lock)
        at 
java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153){code}

  was:
Cleaner thread will be blocked if we remove ref from ReferenceQueue unless the 
`queue.enqueue` called.

ThreadDump:
{code:java}
"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007f7afc088800 
nid=0x2119 in Object.wait() [0x00007f7b00230000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000000c00c2f58> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - locked <0x00000000c00c2f58> (a java.lang.ref.Reference$Lock)
        at 
java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153){code}


> Fix issue of the StatisticsDataReferenceCleaner cleanUp
> -------------------------------------------------------
>
>                 Key: HDFS-16033
>                 URL: https://issues.apache.org/jira/browse/HDFS-16033
>             Project: Hadoop HDFS
>          Issue Type: Bug
>          Components: hdfs
>    Affects Versions: 3.2.1
>            Reporter: yikf
>            Priority: Minor
>
> Cleaner thread will be blocked if we remove reference from ReferenceQueue 
> unless the `queue.enqueue` called.
> As shown below, We call ReferenceQueue.remove() now while cleanUp, Call chain 
> as follow:
> StatisticsDataReferenceCleaner#queue.remove()  ->  ReferenceQueue.remove(0)  
> -> lock.wait(0)
> But, lock.notifyAll is called when queue.enqueue only, so Cleaner thread will 
> be blocked.
> ThreadDump:
> {code:java}
> "Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007f7afc088800 
> nid=0x2119 in Object.wait() [0x00007f7b00230000]
>    java.lang.Thread.State: WAITING (on object monitor)
>         at java.lang.Object.wait(Native Method)
>         - waiting on <0x00000000c00c2f58> (a java.lang.ref.Reference$Lock)
>         at java.lang.Object.wait(Object.java:502)
>         at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
>         - locked <0x00000000c00c2f58> (a java.lang.ref.Reference$Lock)
>         at 
> java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153){code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to