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