ceph源码阅读 buffer

ceph::buffer是ceph非常底层的实现,负责管理ceph的内存。ceph::buffer的设计较为复杂,但本身没有任何内容,主要包含buffer::list、buffer::ptr、buffer::hash。这三个类都定义在src/include/buffer.h和src/common/http://buffer.cc中。


buffer::raw:负责维护物理内存的引用计数nref和释放操作。
buffer::ptr:指向buffer::raw的指针。
buffer::list:表示一个ptr的列表(std::list<bufferptr>),相当于将N个ptr构成一个更大的虚拟的连续内存。

buffer::hash:一个或多个bufferlist的有效哈希。

buffer::raw

bufferlist是基于bufferptr和bufferraw实现的,所以先分析buffer::raw。

 class raw {
 public:

 std::aligned_storage<sizeof(ptr_node),
 alignof(ptr_node)>::type bptr_storage;
 char *data;
 unsigned len;
 std::atomic<unsigned> nref { 0 };
 int mempool;

 std::pair<size_t, size_t> last_crc_offset {std::numeric_limits<size_t>::max(), std::numeric_limits<size_t>::max()};
 std::pair<uint32_t, uint32_t> last_crc_val;

 mutable ceph::spinlock crc_spinlock;
 ...
}

成员变量:

data:指向原始数据raw的指针。

len:原始数据raw的长度。

nref:引用计数。

mempool:其对应的内存池的index,这个和data空间的分配有关。

crc_spinlock:读写锁。

buffer::ptr

bufferptr是基于bufferraw,bufferptr是bufferraw的指针,指向buffer::raw的一部分数据段。

 class CEPH_BUFFER_API ptr {
    raw *_raw;
 public: // dirty hack for testing; if it works, this will be abstracted
 unsigned _off, _len;
 ...
 }

成员变量:

_raw:指向raw的指针

_off:数据偏移量

_len:数据长度

buffer::list

在list类前面定义了链表的结构体struct ptr_hook。

 struct ptr_hook {
 mutable ptr_hook* next;

 ptr_hook() = default;
 ptr_hook(ptr_hook* const next)
      : next(next) {
    }
  };

buffer::list是由ptr组成的链表

class buffers_t {
      // _root.next can be thought as _head
      ptr_hook _root;
      ptr_hook* _tail;
      std::size_t _size;
      ...
}

_root:链表头

_tail:链表尾

_size:链表节点数

bufferlist将数据以不连续链表的方式存储。

bufferlist的迭代器

  template <bool is_const>
  class CEPH_BUFFER_API iterator_impl
      : public std::iterator<std::forward_iterator_tag, char>
  {
  protected:
    bl_t *bl;
    list_t *ls;   // meh.. just here to avoid an extra pointer dereference..
    unsigned off; // in bl
    list_iter_t p;
    unsigned p_off; // in *p
    ......
  };

bl:指针,指向bufferlist

ls:指针,指向bufferlist的成员 _buffers

p: 类型是std::list::iterator,用来迭代遍历bufferlist中的bufferptr

p_off:当前位置在对应的bufferptr中的偏移量

off:当前位置在整个bufferlist中的偏移量

buffer常见的函数

void buffer::list::substr_of()

获取子字符串

other:指向原数据的bufferlist指针

off:数据的偏移

len:数据截取长度

 void buffer::list::substr_of(const list& other, unsigned off, unsigned len)
  {
 if (off + len > other.length())
 throw end_of_buffer();

 clear();

    // skip off
    //curbuf获得other的链表头
 auto curbuf = std::cbegin(other._buffers);

    //找到和off对应的链表节点
 while (off > 0 && off >= curbuf->length()) {
      // skip this buffer
      //cout << "skipping over " << *curbuf << std::endl;

      off -= (*curbuf).length();
 ++curbuf;
    }
 ceph_assert(len == 0 || curbuf != std::cend(other._buffers));
 
    //截取所需要的长度,创建新的节点加入到链表尾
 while (len > 0) {
      // partial?
 if (off + len < curbuf->length()) {
  //cout << "copying partial of " << *curbuf << std::endl;
 _buffers.push_back(*ptr_node::create( *curbuf, off, len ).release());
  _len += len;
 break;
      }
 
      // through end
      //cout << "copying end (all?) of " << *curbuf << std::endl;
 unsigned howmuch = curbuf->length() - off;
 _buffers.push_back(*ptr_node::create( *curbuf, off, howmuch ).release());
      _len += howmuch;
      len -= howmuch;
      off = 0;
 ++curbuf;
    }
  }

buffer::create_aligned()

预对齐内存的分配

len:分配内存的大小

align:内存对齐的倍数

ceph::unique_leakable_ptr<buffer::raw> buffer::create_aligned(
 unsigned len, unsigned align) {
 return create_aligned_in_mempool(len, align,
 mempool::mempool_buffer_anon);
}

void buffer::list::claim_append(list& bl, unsigned int flags)

将bl的数据复制_buffers的尾部/头部,然后接bl的数据清空。

void buffer::list::rebuild(
std::unique_ptr<buffer::ptr_node, buffer::ptr_node::disposer> nb)

将bufferlist中_buffers链表中所有的ptr中的数据存到一个ptr中并将_buffers原有数据clear,然后将新的单个ptr push到_buffers中。

### 回答1: ceph源码分析pdf是一本关于ceph分布式文件系统的源代码深度剖析的著作,通过详细分析ceph系统的架构、实现、核心代码等方面,帮助读者深入理解ceph系统的设计思路和工作原理。 本书主要分为三个部分,第一部分介绍了ceph系统的概述和架构,包括ceph系统的目标、特点、架构分层等;第二部分主要探讨了ceph系统的核心组件,包括RADOS、MDS、OSD等,深入剖析了它们的工作原理和实现方式;第三部分则是关于ceph系统的进阶主题,如分布式存储、数据一致性、故障处理等等。 本书的特点在于对ceph源代码的深度剖析,对每个核心组件都逐一分析了其关键代码,帮助读者了解ceph系统的实现方式。此外,本书也提供了一些示例代码,可以帮助读者更好地理解ceph的设计思路和实现细节。 总之,ceph源码分析pdf具有深入、全面、实用的特点,可以帮助ceph开发者和用户深入理解ceph系统的工作原理,快速掌握ceph的使用和开发技巧。 ### 回答2: Ceph是一个采用分布式架构的开源存储系统,具有高可用性、高可扩展性和高性能等优点。对于想要深入了解Ceph存储系统的开发者来说,ceph源码分析pdf是一个非常有价值的资源,可以帮助他们全面理解Ceph的架构和运行机制。 ceph源码分析pdf主要分为以下几部分: 1. Ceph的整体架构介绍 介绍Ceph的整体架构,包括Ceph的分布式存储、元数据管理、数据访问、数据一致性、数据恢复等方面。同时,还会涉及到Ceph的各种组件和组件之间的关系。 2. Ceph的核心代码解析 对Ceph的核心代码进行深度解析,包括存储服务、客户端库、管理工具等部分。这部分内容非常重要,可以帮助开发者全面了解Ceph的代码,并有助于他们进行相关的开发工作。 3. Ceph的性能优化 介绍Ceph的性能优化方法,包括IO性能优化、网络性能优化、CPU性能优化等方面。这对于想要将Ceph应用于实际场景并且需要进行性能优化的开发者来说非常有价值。 总之,ceph源码分析pdf是一个非常有价值的资源,可以帮助开发者全面了解Ceph存储系统的架构和运行机制,并深入了解Ceph的核心代码和性能优化方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值