RBD Image映射到Object
来源:互联网 发布:internet网络协议 编辑:程序博客网 时间:2024/05/19 15:19
该函数是将更新的image的范围映射到具体的对象上.这个部分涉及到stripe的概念,需要预先了解这个概念(可以参考官网对其的解释)
void aio_write(ImageCtx *ictx, uint64_t off, size_t len, const char *buf, ¦AioCompletion *c, int op_flags){ ... ¦ // map ¦ vector<ObjectExtent> extents; ¦ if (len > 0) { //将更新的image的范围映射到具体的对象上 ¦ ¦ Striper::file_to_extents(ictx->cct, ictx->format_string, ¦ ¦ ¦ &ictx->layout, off, clip_len, 0, extents); ¦ } ¦ for (vector<ObjectExtent>::iterator p = extents.begin(); p != extents.end(); ++p) { ¦ ¦ ldout(cct, 20) << " oid " << p->oid << " " << p->offset << "~" << p->length ¦ ¦ ¦<< " from " << p->buffer_extents << dendl; ¦ ¦ // assemble extent ¦ ¦ bufferlist bl; ¦ ¦ for (vector<pair<uint64_t,uint64_t> >::iterator q = p->buffer_extents.begin(); ¦ q != p->buffer_extents.end(); ¦ ++q) { bl.append(buf + q->first, q->second); ¦ ¦ } } ...} void Striper::file_to_extents(CephContext *cct, const char *object_format, const ceph_file_layout *layout, uint64_t offset, uint64_t len, uint64_t trunc_size, map<object_t,vector<ObjectExtent> >& object_extents, uint64_t buffer_offset) //offset 是相对于image的偏移位置, len是影响的范围{ ldout(cct, 10) << "file_to_extents " << offset << "~" << len ¦<< " format " << object_format ¦<< dendl; assert(len > 0); /* ¦* we want only one extent per object! ¦* this means that each extent we read may map into different bits of the ¦* final read buffer.. hence ObjectExtent.buffer_extents ¦*/ __u32 object_size = layout->fl_object_size; //一个对象的字节大小 __u32 su = layout->fl_stripe_unit; //一个stripe的大小 __u32 stripe_count = layout->fl_stripe_count; // 一个stripe中的unit(block)的数量 assert(object_size >= su); uint64_t stripes_per_object = object_size / su; //一个对象关联的stripe的数量 ldout(cct, 20) << " su " << su << " sc " << stripe_count << " os " << object_size ¦<< " stripes_per_object " << stripes_per_object << dendl; uint64_t cur = offset; uint64_t left = len; while (left > 0) { ¦ // layout into objects ¦ uint64_t blockno = cur / su; // which block //cur位置跨越的block数 ¦ uint64_t stripeno = blockno / stripe_count; // which horizontal stripe (Y) //cur位置跨越的stripe数 ¦ uint64_t stripepos = blockno % stripe_count; // which object in the object set (X) // blockno在stripe中的偏移位置 ¦ uint64_t objectsetno = stripeno / stripes_per_object; // which object set //cur位置跨越的object set数 ¦ uint64_t objectno = objectsetno * stripe_count + stripepos; // object id //cur所在的object(image中的object从0开始自然排序)注object从0开始编号 ¦ // find oid, extent ¦ char buf[strlen(object_format) + 32]; ¦ snprintf(buf, sizeof(buf), object_format, (long long unsigned)objectno); //获取对象的oid,命名格式是{object_prefix}.%012llx,即对象的前缀+object的序号 ¦ object_t oid = buf; ¦ // map range into object 映射到对象内,相对对象的偏移位置(x_offset) ¦ uint64_t block_start = (stripeno % stripes_per_object) * su; ¦ uint64_t block_off = cur % su; ¦ uint64_t max = su - block_off; ¦ uint64_t x_offset = block_start + block_off; //从偏移位置开始影响对象的范围 ¦ uint64_t x_len; ¦ if (left > max) ¦ ¦ x_len = max; ¦ else ¦ ¦ x_len = left; ¦ ldout(cct, 20) << " off " << cur << " blockno " << blockno << " stripeno " << stripeno ¦ ¦<< " stripepos " << stripepos << " objectsetno " << objectsetno ¦ ¦<< " objectno " << objectno ¦ ¦<< " block_start " << block_start ¦ ¦<< " block_off " << block_off ¦ ¦<< " " << x_offset << "~" << x_len ¦ ¦<< dendl; ¦ ObjectExtent *ex = 0; ¦ vector<ObjectExtent>& exv = object_extents[oid]; //如果object对象的该次操作时第一个,或者与之前的操作在object内部地址不联系则重新申请一个ObjectExtent来存储该次操作的一些信息(对象、偏移位置、范围) //否则直接更新之前的ObjectExtent,扩大影响的范围 ¦ if (exv.empty() || exv.back().offset + exv.back().length != x_offset) { ¦ ¦ exv.resize(exv.size() + 1); ¦ ¦ ex = &exv.back(); ¦ ¦ ex->oid = oid; ¦ ¦ ex->objectno = objectno; ¦ ¦ ex->oloc = OSDMap::file_to_object_locator(*layout); ¦ ¦ ex->offset = x_offset; ¦ ¦ ex->length = x_len; ¦ ¦ ex->truncate_size = object_truncate_size(cct, layout, objectno, trunc_size); //trunc_size == 0 ¦ ¦ ldout(cct, 20) << " added new " << *ex << dendl; ¦ } else { ¦ ¦ // add to extent ¦ ¦ ex = &exv.back(); ¦ ¦ ldout(cct, 20) << " adding in to " << *ex << dendl; ¦ ¦ ex->length += x_len; ¦ } //将该ObjectExtent与更新的数据做个映射(cur - offset + buffer_offset 相对更新数据的偏移位置,x_len范围) ¦ ex->buffer_extents.push_back(make_pair(cur - offset + buffer_offset, x_len)); ¦ ¦ ¦ ¦ ldout(cct, 15) << "file_to_extents " << *ex << " in " << ex->oloc << dendl; ¦ ldout(cct, 15) << "file_to_extents " << *ex << " in " << ex->oloc << dendl; ¦ //ldout(cct, 0) << "map: ino " << ino << " oid " << ex.oid << " osd " << ex.osd << " offset " << ex.offset << " len " << ex.len << " ... left " << left << dendl; ¦ //减去已经映射到object对象上的部分,继续后续的映射。 ¦ left -= x_len; ¦ cur += x_len; }}for (vector<ObjectExtent>::iterator p = extents.begin(); p != extents.end(); ++p) { ldout(cct, 20) << " oid " << p->oid << " " << p->offset << "~" << p->length << " from " << p->buffer_extents << dendl; // assemble extent bufferlist bl; for (vector<pair<uint64_t,uint64_t> >::iterator q = p->buffer_extents.begin(); q != p->buffer_extents.end(); ++q) { //聚合同一个object上且object内地址连续的更新数据 bl.append(buf + q->first, q->second); } ....}
0 0
- RBD Image映射到Object
- RBD创建一个image
- RBD 导出一个image
- ActionScript Object 到 Java Object 的映射
- 查看谁map了rbd image
- 【福利来了】rbd image qos
- rbd: image foo: image uses unsupported features: 0x38
- Adaptive Divisons of RBD Fracture Object in Houdini
- 将JSON数据映射到Object(包括CoreData)
- image object detection
- Image Mappings (图像映射)
- ceph中如何查找一个对象或者rbd image 的实际存储位置
- 映射MAP与映像IMAGE
- 什么是映像(image), 映射(mapped)
- RBD AioRequest
- 1.Component映射:Object,hbm
- 1.集合映射:Object,hbm
- image更新到盒子
- R语言学习四
- DBus windows下编译方法
- C# Oracle数据库连接及操作
- 会用才好用。
- Swift3.0 Any数据类型转Json
- RBD Image映射到Object
- ListPopupWindow 和 PopupMenu的使用
- Java设计模式(23)行为型:解释器模式
- LintCode 184-最大数
- Java 8新特性
- SQL注入系列之环境搭建(二)----PHP+Mysql注入环境搭建
- MySQL日期时间函数大全
- 初学者细谈Web
- javaScript总结