ceph Buffer#yyds干货盘点#

1、简介

Buffer就是一个命名空间,在这个命名空间下定义了Buffer相关的数据结构,这些数据结构在Ceph的源码中广泛使用

2、buffer::raw

buffer::raw类是基础类,其子类完成了Buffer数据空间的分配;

buffer::raw是一个原始的数数据废土据Buffer,在其基础之上添加了长度、引用计数 和 额外的crc校验信息

2.1 类结构

class buffe云服务登录r::raw { public: cha内存空间清理r *d内存空间清理ata; //数据指针 unsigne云计算技术与应用专业d len; //数据长度 atomic_t nref; //引用计数

mutable si云服务oppomple_spinlock_t crc_spinlock; //读写锁,保护 crc_map map<pair&数据恢复软件免费版lt;size_t, size_数据段的tcp报头中为什么包含端口号t>, pair<uint32_t, uint32_t> > crc云计算技术与应用_map; //crc 校验信息,第一个pair为数据段的起始和结束(from,to),第二个pa云服务ir是crc32校验码,pair的第一个字段为base crc32 校验码,第二个字段为加上数据段后计云服务vivo算出的crc32 校验码内存空间小的五v五游戏

explicit raw(unsigned l) : data(NULL), len(l), nref(0), crc_spinlock(SIMPLE_SPINLOCK_INITIALIZER) { } raw(char *c, unsigned l) : data(c), len(l), nref(0), crc_sp云服务平台inlock(SIMPLE_SPINLOCK_INITIALIZER) { } virtual ~raw() {}

// no copying. // cppcheck-supp云服务ress noExplicitCons云计算是什么意思tructor raw(const raw &other); const raw& operator=(const raw &other);

virtual char *get_data() { return data; } virtual raw* clone_empty() = 0; raw *clone() { raw *c = clone_empty(); memcpy(c->data, data, len); return c; } virtual bool can_zero_copy() const { return false; } virtual int zero_copy_to_fd(int fd, loff_t *offset) { return -EN内存空间小的五v五游戏OTSUP; } virtual bool is_page_aligned() { return ((long)data & ~CEPH_PAGE_MASK) == 0; } bool is_n_page_sized() { return (len & ~CEPH_PAGE_MASK) == 0; } virtual bool is_shareable() { // true if safe to reference/share the existing buffer copy // false if it is not safe云计算技术与应用 to share the buffer, e.g., due to special // and/内存空间怎么清除的or registered memory that is scarce return tru云服务vivoe; } bool get_crc(const pair<size_t, size_t> &fromto, pair<uint32_t, uint32_t> *crc) const { simple_spin_lock(&crc_spinlock); map<pair<size_t, size_t数据分析师>, pa数据段ir<uint32_t, uint32_t> >::const_iterator i = crc_map.find(fromto); if (i == crc_map.end()) { simp云计算导论le_spin_unlock(&c云计算定义rc_spinlock); return false; } *crc = i->second; simple云服务_spin_unlo内存空间不足怎么办ck(&crc_spinlock); return true; } void set_crc(cons内存空间清理t pair<云服务器免费;size_t, size_t> &fromto, const pair<uint32_t, uint32_t> &crc) { simple_spin_lock(云服务&a云服务mp;crc_spinlock); crc_ma数据结构p云计算最简单解释[fromto] = crc; simple_spin_unlock(&crc_spinlock); } void invalidate_云计算技术与应用专业crc() { simple_spin_lock(&a云计算导论mp;crc_spinlock);数据分析师 if (crc_m云计算分为哪些类型ap.size() != 0)云服务 { crc_map.clear(); } simple_spin_unlock(&crc_spinlock); } };

2.2 代码分云计算的特点

2.3 派生类

raw_malloc:实现了用mall云计算是什么意思oc函数分配内存空间的功能

raw_mmap_pages:实现了通过mmap来把内存匿名映射到进程的地址空间

raw_posix_aligned:调用了函数 posix_mem数据段的tcp报头中为什么包含align来申请内存地址对齐的内存空间

raw_hack_aligned:在系统不云服务支持内数据透视表存对齐申请的情况下自己实现了内存的地址的对齐

raw数据段_pipe:实现了匹配做为Bu数据分析ffer的内存空间

raw_char:使用了C++的new操作符来申请内存空间

3、buffer::ptr

buffer::ptr类实现了Buffer内部的一段数据,即buffer::ptr就是对于buffer::raw的一个部分数据段

ptr 是 raw里的一个任意的数据段,_off 是在 _raw 里的偏移量,_len是ptr的长度

3.1 类结构

class CEPH_BUFFER_API ptr { raw *_raw; unsigned _off, _len;

void rele数据透视表ase();数据废土

public: ptr() : _raw(0), _off(0), _len(0) {} // cppcheck-云计算是什么意思suppress noExplicitConstructor ptr(raw *r); // cppcheck-suppress noExplicitConstructor p云计算技术与应用t云服务器r(unsigned l); ptr(const char数据结构 *d, unsigned l); ptr(const ptr& p); ptr(ptr&& p);云计算技术与应用 ptr(const ptr& p, unsigned o, unsig云计算最简单解释ned l); ptr& operator= (const pt数据废土r& p); ptr& oper内存空间小的五v五游戏ator= (ptr&& p); ~ptr() { release(); }

bool have_raw() const { return _raw ? true:false; }

raw *clone(); void swap(ptr& other); ptr& make_sharea云服务器ble();

3.2 代码分析

4、buffer:数据漫游:list

buffer::list封装了许多个数据段;

类 buffer::list是一个使用广泛的类,它是多个buffer::ptr的列表,也就是多个内存数据段的列云计算定义表

4.2 类结构

class CEPH_BUFFER_API list { // my private bits std::list<ptr> _buffers; unsigned _len; unsigned _memcopy_count; //the total of memcopy using rebuild(). ptr append_buffer; // where i put small appends数据透视表.

public: class iterator;

private数据段的tcp报头中为什么包含: template <bool is_con云服务器st> class CEPH_BUFFER_API iterator_impl : public std::iterato无限内存空间r<std::forward_iterator_tag数据漫游, char>云服务器免费 { protected: typedef typename s云服务系统入口td::conditional<is_const, const list, list>::type bl_t; typedef typename s数据库td::conditional<is_const, const std::list<ptr>, std::list<ptr> >::type list_t; typedef typename std::c数据库on数据废土ditional<is_const, typename std::list<ptr>::const_iterator, typename std::list&数据分析师lt;pt内存空间小的五v五游戏r>云服务登录::iterator>::type list_iter_t; bl_t* bl; list_t云计算大数据* ls; // meh.. just here to avoid an ex云计算技术与应用专业tra pointer dereference.. unsigned off; // in bl list_iter_t p; unsigned数据 p_off; // in *p friend class iter数据废土ator云计算_impl<true>;内存空间

public: // constructor. position. iterator_impl() : bl(0), ls(0), off(0), p_off云计算定义(0) {云服务平台} iterator_impl(bl_t *l, unsigned o=0); iterat云计算分为哪些类型or_impl(bl_t *l, unsigned o, list数据恢复软件免费版_iter_t ip, unsigned po) : bl(l), ls(&bl->_buffers), off(o), p(ip), p_off(po) {} iterator_impl(const list::iterator& i);

/// get current iterator offset in buffer::list unsigned get_off() const { return off; } /// get nu数据mber of bytes remaining from iterator position to the en云计算大数据d of the数据废土 buffer::list unsigned get_remaining() const { retur云服务平台n bl->length() - off; }

/// true if itera云服务平台登录入口tor is at the end of the buffer::list bool数据恢复 end() const { return p == ls->end(); //return off =云服务= bl->length(); }

void advance(int o); void seek(unsigned o); char operator*() const; iterat数据库or_impl& operator++(); ptr get_current_ptr() const;

bl_t& get_bl() const { return *bl; }

// copy data out. /数据透视表/ note t云服务器hat the数据分析师se all _append_ to dest! void copy(unsigned len, char *dest); void co无限内存空间py(unsigned len, ptr &de内存空间st); void copy(unsigned len, list &dest); void copy(unsigned len, std::string &dest); void copy_all(list &dest);

friend bool operator云服务vivo==(const iterator_impl&am数据漫游是什么意思p; lhs, c内存空间怎么清除的onst iterator_impl& rhs) { return &lhs.get_bl()云计算技术与应用 == &rhs.get_bl云服务vivo() && lhs.get_off() == rh数据库s.get_off(); } friend bool operator!=(const iterator_impl& l云服务平台hs, const iterator_云服务impl& rhs) { return &lhs.get_bl() != &a云服务oppomp;rhs.get_bl() || lhs.get_off() != rhs.get_o云服务平台登录入口ff(); } };

public: typedef iterator_impl<true> const_iterator;

class CEPH_BUFFER_API it内存空间小的五v五游戏erator : public iterator_impl云计算分为哪些类型<false> { public: iterator() = default; iterator(bl_t *l, unsigned o=0); iterator(bl_t *l, unsigned o, list_iter_t ip, unsigned po);

void advance(int o); void seek(unsigned o); char operator*(); i数据恢复软件免费版terator& operator数据库++(); ptr get_数据漫游是什么意思current_p数据透视表tr();

// copy data out void copy(unsigned le数据漫游是什么意思n, char *dest); void copy(unsigne数据分析d len, ptr &a云服务vivomp;dest无限内存空间); void copy内存空间(unsigned le数据分析师n, list &dest); void copy(unsigned len, std::stri数据恢复软件免费版n云计算的特点g &dest); void copy_all(list &am数据分析师p;dest);

// copy data in void copy_in(unsigned len, const char *src); void cop数据恢复软件免费版y_in(unsigned len, const char *src, bool crc_res云计算大数据et); void copy_in(unsigned len, const list& otherl);

bool operator==(const iterator& rhs) const {云服务 return bl == rhs.bl &云计算导论& off == rhs.off; } bool o内存空间perato云计算最简单解释r!=(const iterator& rhs) const { return bl != rhs.bl || off != rhs.off; } };

private: muta云服务ble iterator last_p; int zero_copy_to数据分析师_fd(int fd) const;

public:数据段的tcp报头中为什么包含端口号 // cons/des list() : _len(0), _memcopy_count(0), last_p(this) {} // cppcheck-suppress noExplici云服务器tConstructor list(un数据恢复signed prealloc) : _len(0), _memcopy_count(0), last_p(内存空间this) { append_buffer = buffer::create(prealloc); append_buffer.set_length(0); // unu云计算大数据sed, so数据段的tcp报头中为什么包含端口号 far. }

list(const list& other) : _buffers(other._buffers), _len数据分析(other._len), _memcopy_coun云服务器t(other._memcopy_count), last_p(this) { make_shareable手机内存空间(); } list(list&& other); li云计算大数据st& operator= (const list& other) { if (this != &other) { _buffers = other._buffers; _len = othe数据段r._len; make_shareable(); } return *this; }

list& operator= (list云计算导论&& other) { _buffers = std::move(other数据漫游是什么意思._buffers); _len = other._len; _云计算导论memcopy_count = other._memcopy_count; last_p = begin()内存空间不足怎么办; append_buffer.swap(other.append_buffer); other.cl云服务器免费ear云计算分为哪些类型(); return *this; }

unsigned get_num_buffers() const { return _buffers.size(); } con内存空间小的五v五游戏st ptr& front() const { return _buffers.front(); } c无限内存空间onst ptr& back数据透视表() const { return _buffers.云计算分为哪些类型back(); }

unsigned get_memcop数据分析师y_count() const {return _m云计算导论emcopy_coun云计算技术与应用t; } const std::list&l云服务器免费t;ptr>& buffers() const { return _buffers; } void swap(list& other); unsigned length() const {#数据透视表if 0 // DEBUG: verify _len unsign云计算技术与应用专业ed len = 0; for (std::list<ptr>::const_iterator云计算 it = _buffers.begin(); it != _buffers.end(); it++) { len += (*it).length()数据段; } assert(l云计算是什么意思en == _len);#endif return _le云计算大数据n; }

bool contents_equal(buffer::list& other); boo数据段l cont云服务系统入口ents_equal(const buffer::list& other) const;

bool can_zero_copy() const; bool is_provided_buffer(const char *ds云计算技术与应用t) const; bool is_aligned(unsigned align) const; bool is_p云计算最简单解释age内存空间不足怎么办_aligned() const; bool is_n_align_sized(unsigned内存空间不足怎么办 align) const; bool is_n_pag数据分析师e_sized() const;

b云服务器ool is_zero云服务系统入口() const;

// modifiers void clear() { _buffers.clear(); _len = 0; _memcopy_count = 0; last_p = begin(); } void push_front(ptr& bp) { if (bp.le云计算定义ngth() == 0) return; _buff云计算是什么意思ers.push_front(bp); _len += bp.length(); } void push_front(ptr&& bp) { if (bp.length() == 0) return; _len += bp.length内存空间清理(); _buffers.push_front(std::move(bp)); } void push_front(raw *r) { push_front(ptr(r)); } void push_back(const ptr& bp) {数据废土 if (bp.length() == 0) return; _buffers.push_back(bp); _len += bp.length(); } voi数据段d push_back(ptr&云服务平台amp;& bp) { if (bp.length() == 0) return; _len += bp.length(); _buffe云服务rs.push_back(std::move(bp)); } void push_back(raw *r云计算) { pu云服务器免费sh_back(ptr(r)); }

void zero内存空间清理(); void zero(unsigned o, unsigned l);

bool is_contiguous() const; void rebuild(); void rebuild(ptr& nb); void rebuild_aligned(unsigned align); void rebuild_a云服务平台ligned数据_size_and_memory(unsigned align_size, unsign内存空间不足怎么办ed align_memory); void rebuild_page_aligned();

// assignment-op with move semantics co数据段的tcp报头中为什么包含nst static unsigned int CLAIM_DEFAULT = 0; const static unsigned int CLAIM_ALLOW_NONSHAREABLE = 1;

void claim(list& bl, unsigned in云服务t flags = CLAIM_DEFAULT); void claim_append(list&数据结构 bl, unsi云服务器gned int flags = CLAIM_DEFAUL数据段T); void claim_prepend(list& bl, unsigned int f云服务系统入口lags = CLAIM_DEFAULT);

// clone non-shareable b云计算导论uffers (make shareable) void make_shareable() { std::list<buffer::ptr&g数据分析师t;::iterator pb; for (pb = _buffers.begin(); pb != _buffers.end(); ++pb) { (void) pb->make_shareable(); } }

// copy with explicit volatile-sharing semantics void share(const list& bl) { if (this != &手机内存空间bl) { clear(云计算); std::内存空间怎么清除的list<buffer::ptr>:云计算:const_iterator pb; for (pb = bl._buffer数据透视表s.begin(); pb != bl._buffers.end(); ++pb) { push_back(*pb); } } }

iterat云计算导论or begin() { return iterator(this, 0); } iterator en云服务器免费d() { return ite云服务vivorator(this, _len, _buffers.end(), 0); }

const_iterator begin() const { return const_iterator(this, 0); } const_iterat云服务or end() const { return数据废土 const_iterator(this, _len, _buffers.end(), 0); }

// crope lookalikes. // **** WARNING: this are horribly ineffic云服务ient for l云计算定义arge bufferlists. **** void c数据漫游opy(unsigned off, unsigned len, char *dest) const; void copy(unsigned off, unsigned len, list &dest) const; void copy(uns云计算是什么意思igned off, unsigned len, std::string& dest) const; void copy_in(unsigned off, unsigned len, const char *src); void copy_in(unsigned off, unsigned len, con数据分析st char *src, bool crc_reset); void cop云计算大数据y_in(unsigned off, unsigned le云服务器免费n, const list& src);

void append(c数据结构har c); void append(const char *data, unsigned len); void append(const std::string& s) { append(s.data(), s.length()); } voi数据结构d append(const ptr& bp); void append(ptr&& bp); void append(c数据onst ptr& bp, un云计算最简单解释signed off, unsigned len); void append(const list& bl); void append(std::istream&内存空间怎么清除的amp; in); void append_zero(unsigned len);云计算是什么意思 /* * get a char */ const云服务平台登录入口 char& operator[](unsigned云服务器免费 n) const; char *c_str(); std::string to_str() const云服务器;

vo内存空间id substr_of(const list& other, unsigned off, unsigned len);

/// return a pointer to a contiguous extent of the buffer, /// re内存空间清理allocating as needed char *get_云服务平台登录入口contiguous(unsigned off, ///< offset unsigned len); ///< length

// funky modifer void splice(unsigned of云服务登录f, unsigned len, list *claim_by=0 /*, bufferlist数据段&a数据库mp; repla数据结构ce_with */); void write(int off, int len, std::ostream& out) const;

void enco数据分析师de_base64(list& o); void decode_base64(li手机内存空间st& o);

void write_stream(std::ostr云计算导论eam &云服务器amp;out) const; void hexdump(std::ostream &out) const; int read_file(const char *fn, std::string *error);数据恢复 ssize_t re数据库ad_fd(int fd, size_t len); int read_fd_zero_copy(int fd, size_t len); int write_file(const char *fn, int mode=0644)无限内存空间; int write_fd(int f手机内存空间d) const; int write_fd(int fd, uint64_t offset) const; int write_fd_zero_cop内存空间清理y(int fd) cons云服务登录t; void prepare_iov(std::vector<iovec> *piov) const; uint32_t crc32c(uint32_t crc) const; void invalidate_crc(); }

4.3 代码分析

4.4 基本操作

4数据库.4.1 添加 ptr 到 list 头部

void push_front(ptr&数据透视表;& bp) { if (bp.length() =云计算定义= 0) return; _len内存空间清理 += bp.length(); _buffers.push_front云计算导论(std::云计算分为哪些类型move(bp)); }

4.1.2 添加一个 raw 到 list 头部中,先构造一个 pt内存空间清理r,后添加l云计算最简单解释ist中

void push_front(raw *r) { push_front(ptr(r)); }

4.1.3 判断内存是否以参数 align 对齐,每一内存空间清理个 ptr 都必须以 ali云服务系统入口gn对齐

相当于 "%" 操作; 即 判断A是否为B的倍数时,不仅可以通过 "%"操作判断;也可以直接 A 和 B全部转换为 二进制, 将 B 减 1 的值 与A 进行 "&内存空间不足怎么办amp;",如果结果为 0,则代表 A是B的倍数

temp云计算分为哪些类型lat云计算技术与应用专业e <typename T>bool is_aligned(T* ptr) { const auto align_mask = alignof(T) - 1; return (reinterpret_cast<uintptr_t>数据段(ptr) & align_mask) == 0;}