do_recovery为恢复的核心函数。存储的时候都是以oid的形式进行存储的,那么迁移的时候都是按照oid来一个一个的进行迁移的。BackfillInterval 代表了将要恢复的一段object所有的恢复的信息.
通过send_pushes进行推送,每次推送多个object,数量和大小在配置文件中可以设置。Recovery_WQ调用_process(),_process调用 do_recovery恢复某一个固定pg的数据。worker 进程负责监控队列,并从队列中摘除task。调用的栈为:worker->void_process->_processRecoveryWQ 是一个定义在osd内部的恢复队列,recovery_wq是其一个对象实例。TrivialEvent 包含了如下的Event:这些event都是boost的 statechart类型的。其中一个push message包含了多个object,这些object的数据在build_push_ops中被填充,填充方法如下:
-
for (interval_set<uint64_t>::iterator p = out_op->data_included.begin();
-
p != out_op->data_included.end();
-
++p) {
-
bufferlist bit;
-
osd->store->read(coll, recovery_info.soid,
-
p.get_start(), p.get_len(), bit);
-
if (p.get_len() != bit.length()) {
-
dout(10) << " extent " << p.get_start() << "~" << p.get_len()
-
<< " is actually " << p.get_start() << "~" << bit.length()
-
<< dendl;
-
p.set_len(bit.length());
-
new_progress.data_complete = true;
-
}
-
out_op->data.claim_append(bit);
-
}
将数据append到pushes里面,然后统一发送,这样提高了系统recovery的吞吐量,避免单一object的copy。
阅读(8682) | 评论(0) | 转发(2) |