As part of HADOOP-2346, I changed how default socketFactory creates its
socket : from 'new Socket()' to 'SocketChannel.open().socket()' since
DFSClient uses socket factory. As a side effect, ipc.Client ends up
using this socket creation.
ipc.Client's internal response receiver is blocked on
socket.getInputStream().read() as expected. But other threads can not
send RPCs since their write() is blocked on a socket imlementation
related lock. This lock is held by the reader. Thats pretty weird. How
can it not allow read and write at the same time?
Raghu.
Related stack traces (from a Junit test):
read : locked 0xd32b6bf0
=============================
"IPC Client connection to localhost/127.0.0.1:55567" daemon prio=10
tid=0xc02dfc00 nid=0x2c41 runnable [0xbf836000..0xbf836fb0]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:184)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)
- locked <0xd32c30c8> (a sun.nio.ch.Util$1)
- locked <0xd32c30b8> (a java.util.Collections$UnmodifiableSet)
- locked <0xd32c2ed0> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)
at
sun.nio.ch.SocketAdaptor$SocketInputStream.read(SocketAdaptor.java:193)
- locked <0xd32b6bf0> (a java.lang.Object)
at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:86)
- locked <0xd32b6f50> (a sun.nio.ch.SocketAdaptor$SocketInputStream)
at java.io.FilterInputStream.read(FilterInputStream.java:116)
at org.apache.hadoop.ipc.Client$Connection$1.read(Client.java:190)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
- locked <0xd32b6f10> (a java.io.BufferedInputStream)
at java.io.DataInputStream.readInt(DataInputStream.java:370)
at org.apache.hadoop.ipc.Client$Connection.run(Client.java:276)
write : trying to lock 0xd32b6bf0
==================================
"main" prio=10 tid=0x0805b000 nid=0x2b85 waiting for monitor entry
[0xd7e66000..0xd7e67288]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.nio.channels.Channels.write(Channels.java:58)
- waiting to lock <0xd32b6bf0> (a java.lang.Object)
at java.nio.channels.Channels.access$000(Channels.java:47)
at java.nio.channels.Channels$1.write(Channels.java:134)
- locked <0xd32b90f8> (a java.nio.channels.Channels$1)
at org.apache.hadoop.ipc.Client$Connection$2.write(Client.java:201)
at
java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
- locked <0xd32b90c0> (a java.io.BufferedOutputStream)
at java.io.DataOutputStream.flush(DataOutputStream.java:106)
at org.apache.hadoop.ipc.Client$Connection.sendParam(Client.java:346)
- locked <0xd32b90a8> (a java.io.DataOutputStream)
at org.apache.hadoop.ipc.Client.call(Client.java:504)
- locked <0xd32bb3b0> (a org.apache.hadoop.ipc.Client$Call)
at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:198)
at org.apache.hadoop.dfs.$Proxy1.getProtocolVersion(Unknown Source)
at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:291)
at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:278)
at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:315)
at org.apache.hadoop.ipc.RPC.waitForProxy(RPC.java:260)
at org.apache.hadoop.dfs.DataNode.startDataNode(DataNode.java:211)
at org.apache.hadoop.dfs.DataNode.<init>(DataNode.java:166)
at org.apache.hadoop.dfs.DataNode.makeInstance(DataNode.java:2532)
at org.apache.hadoop.dfs.DataNode.run(DataNode.java:2476)
at org.apache.hadoop.dfs.DataNode.createDataNode(DataNode.java:2497)
at
org.apache.hadoop.dfs.MiniDFSCluster.startDataNodes(MiniDFSCluster.java:298)