0
点赞
收藏
分享

微信扫一扫

Ceph源码分析【纠删码解码流程】

Go_Viola 2022-05-18 阅读 78

Ceph版本:14.2.22

 

第一部分 【总体框架】

在这里插入图片描述
 

第二部分 【源码分析】

2.1 ECBackend::objects_read_and_reconstruct 方法分析

osd在读数据时,最终通过ECBackend::objects_read_and_reconstruc方法,在该方法中调用ECBackend::start_read_op方法读数据.
文件路径:ceph/src/osd/ECBackend.cc
在这里插入图片描述

2.2 CallClientContexts::finish 方法分析

上面分析到,ECBackend::start_read_op读完数据之后,CallClientContexts类对象会自动调用回调方法finish;finish方法会调用ECUtil::decode对读的数据进行解码.
文件路径:ceph/src/osd/ECBackend.cc
在这里插入图片描述

2.3 ECUtil::decode 方法分析

上面分析到,ECUtil::decode方法是纠删码解码的入口,该方法中主要思路为:依次读取一个条带的数据(数据块+校验块),对该条带数据进行解码,将解码之后的条带数据依次追加到bufferlist中.
文件路径:ceph/src/osd/ECUtil.cc
在这里插入图片描述

2.4 ErasureCode::decode_concat 方法分析

上面分析到,ECUtil::decode方法最终会调用ec_impl->decode_concat对单个条带数据解码,decode_concat是类ErasureCode的方法。该方法会创建一个新的bufferlist对象,该对象用于存放解码之后的条带数据,该条带数据是完整的,没有任何缺失块。然后调用ErasureCode::_decode方法做进一步处理,最后将完整的条带数据追加到主调方法ECUtil::decode的bl参数中.
文件路径:ceph/src/erasure-code/ErasureCode.cc
在这里插入图片描述

2.5 ErasureCode::_decode 方法分析

在这里插入图片描述
注意:have和want_to_read区别:have中保存的chunks中块的编号,可能有缺失的块。want_to_read是逻辑上块的编号,一定是完整的。

2.6 ErasureCodeJerasure::decode_chunks 方法分析

上面分析到,ErasureCode::_decode最终会调用decode_chunks方法对decoded进一步处理。decoded是类ErasureCodeJerasure的方法。在该方法中会对单条带数据进行分离,分离出数据块和校验块,然后调用接口做进一步处理.
文件路径:ceph/src/erasure-code/jerasure/ErasureCodeJerasure.cc
在这里插入图片描述

2.7 ErasureCodeJerasureReedSolomonVandermonde::jerasure_decode 方法分析

上面分析到,ErasureCodeJerasure::decode_chunks最终会调用jerasure_decode方法做进一步处理,jerasure_decode是ErasureCodeJerasureReedSolomonVandermonde方法。该方法调用纠删码解码C语言接口,纠删码解码方法有很多,目前使用的是范德蒙行列式解码.
文件路径:ceph/src/erasure-code/jerasure/ErasureCodeJerasure.cc
在这里插入图片描述

举报

相关推荐

0 条评论