【HDFS】客户端写数据时,dataQueue的几处wait方法的调用场景

dataQueue.wait的几处调用点如下:

1、DataStreamer#run方法一开始,判断dataQueue如果为空,或者doSleep==true,那么就dataQueue.wait(timeout);
2、waitForAllAcks方法里,会dataQueue.wait(sendHeartbeat()); waitForAllAcks的作用是等待所有的data packets都成功地收到ack。
3、waitForAckedSeqno方法里,此方法用于等待seqno的响应。会执行dataQueue.wait(1000);
4、waitAndQueuePacket方法里,会执行dataQueue.wait();

我们一个一个来看。

1、DataStreamer#run里的wait

这种情况发生在DataStreamer#run方法的一开始,当dataQueue里没有可以发送的DFSPacket时,就会一直在while循环里wait(timeout)。
直到dataQueue里有DFSPacket退出while循环,执行getFirst方法从dataQueue里拿到第一个DFSPacket准备发送。

这里wait(timeout)假设过了timeout时间,dataQueue里还没有DFSPacket对象,那么就会进入下一轮while循环。
在其他往dataQueue里add DFSPacket对象的地方,会调用notifyAll方法,所以可能会提前唤醒等待在这里的线程。

boolean doSleep =<

你可能感兴趣的:(HDFS全方位实战,hdfs,hadoop)