本文试图弄清楚以下问题:
- checkStreamerFailures方法主要目的是做什么的?
- checkStreamerFailures方法的调用点(调用时机、条件)?
- checkStreamerFailures及其周边函数的逻辑。
RQ1:checkStreamerFailures方法主要目的是做什么的?
此方法的目的是在close流或者每次写完一整个stripe时,对streamer做健康判断。
因为cell是ec写的最小单位,那每次一个条带包含6+3个cell,在这一个条带写入的过程中,如果有写入失败的streamer就要做一些额外工作。
例如:
- 调用updateBlockForPipeline RPC来把block的GS值更新。
- 等待
- 调用updatePipeline RPC来把这个block的写入pipeline的datanode列表进行更新。(NN侧会通过setExpectedLocations方法更新
ReplicaUnderConstruction[] replicas
) - 检查如果总计失败的streamer数超过parity block数,抛IOE,关闭所有streamer,写文件失败。