Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1940486
  • 博文数量: 1000
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7921
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-20 09:23
个人简介

storage R&D guy.

文章分类

全部博文(1000)

文章存档

2019年(5)

2017年(47)

2016年(38)

2015年(539)

2014年(193)

2013年(178)

分类: 服务器与存储

2016-01-14 20:33:42

    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中被填充,填充方法如下:


点击(此处)折叠或打开

  1. for (interval_set<uint64_t>::iterator p = out_op->data_included.begin();
  2.        p != out_op->data_included.end();
  3.        ++p) {
  4.     bufferlist bit;
  5.     osd->store->read(coll, recovery_info.soid,
  6.          p.get_start(), p.get_len(), bit);
  7.     if (p.get_len() != bit.length()) {
  8.       dout(10) << " extent " << p.get_start() << "~" << p.get_len()
  9.      << " is actually " << p.get_start() << "~" << bit.length()
  10.      << dendl;
  11.       p.set_len(bit.length());
  12.       new_progress.data_complete = true;
  13.     }
  14.     out_op->data.claim_append(bit);
  15.   }



将数据append到pushes里面,然后统一发送,这样提高了系统recovery的吞吐量,避免单一object的copy。
阅读(1664) | 评论(0) | 转发(0) |
0

上一篇:link1

下一篇:异步IO接口Libaio的用法

给主人留下些什么吧!~~