先看一段recovery和backfill的日志:
可以看到关键函数在PrimaryLogPG::on_activate(),再进入对应的代码:
若因测试需要想要跳过recovery,直接backfill,配置文件配置如下即可:
osd_min_pg_log_entries = 1
osd_max_pg_log_entries = 1
osd_pg_log_trim_min = 1
set<pg_shard_t> backfill_targets记录的是需要做backfill的osd(刚加入pg的osd)。
pg的backfill请求也是发送到osd的work queue中与业务IO一起竞争。
本次backfill的对象,日志搜关键string“ my backfill interval BackfillInfo”可得该pg实际需要backfill的个数。也可以从日志grep " last_backfill_started " ./osd.* -Rn| grep "pg\[6\.5" 得到对象名和个数,需要排除掉MIN和MAX。
dout(10) << " peer " << bt
<< " num_objects now " << pinfo.stats.stats.sum.num_objects
<< " / " << info.stats.stats.sum.num_objects << dendl;//这个打印是backfill的对象个数。一条打印就是一个对象。
比如日志打印:peer 3 num_objects now 590 / 591,表示本次一共有591个对象做backfill,本次backfill的为第590个。