简单几句话:
在DataStreamer#run方法里有这样一些代码:
如果DataNode有问题了,肯定写不进去了,那就会走到这个catch里,然后这个里做了两件非常重要的事。
① errorState.markFirstNodeIfNotMarked(); 标记是因为datanode有问题而出现错误的。
② throw e; 抛出异常让外层的大catch继续抓住。
这里由于errorState.markFirstNodeIfNotMarked();
这条语句的存在,可以不让streame关闭。这样的话,就可以继续走下一次DataStreamer#run的循环了。