[
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 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}
> 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]