PGLog的记录数是有限制的,正常情况下默认是3000条(由参数osd_min_pg_log_entries控制),PG降级情况下默认增加到3000条(由配置osd_max_pg_log_entries设置)。当达到限制时,就会trim log。
trim log会调用ReplicatedPG::calc_trim_to()来进行计算。计算的时候从log的tail(tail指向最老的记录的前一个)开始,需要trim的条数为log.head-log.tail-max_entries。但是trim的时候需要考虑到min_last_complete_ondisk(这个表示各个副本上last_complete的最小版本,是主OSD在收到3个副本都完成时再进行计算的,也就是计算last_complete_ondisk和其他副本OSD上的last_complete_ondisk,即peer_last_complete_ondisk的最小值得到min_last_complete_ondisk。last_complete: 在该指针之前的版本都已经在所有的OSD上完成更新(只表示内存更新完成);last_complete主要是跟recovery相关),也就是说trim的时候不能超过min_last_complete_ondisk,因为超过了也trim掉的话就会导致没有更新到磁盘上的pg log丢失。所以说可能存在某个时刻,pglog的记录数超过max_entries。源码如下:
![](https://ctyun-developers-0510.gdoss.xstore.ctyun.cn/prod/ec38daa4ec994ec38e5c374da9d09ff2.png)
举例如下:log tail的eversion为1000,log head的eversion为5000,配置的max_entries为3000(osd_max_pg_log_entries),那么此次删除的new_trim_to=5000-3000,由于limit(即min_last_complate)为1800,所以不能删超过last_complete的部分,即最终pg_trim_to的结果为1800。![](https://ctyun-developers-0510.gdoss.xstore.ctyun.cn/prod/1c24a17e0d544f9882c980fe42a40552.png)
![](https://ctyun-developers-0510.gdoss.xstore.ctyun.cn/prod/1c24a17e0d544f9882c980fe42a40552.png)