The ceph buffers are used to process data in memory. For instance, when a FileStore handles an OP_WRITE transaction it writes a list of buffers to disk.
+---------+ | +-----+ | list ptr | | | | +----------+ +-----+ | | | | | append_ >-------> >--------------------> | | | buffer | +-----+ | | | | +----------+ ptr | | | | | _len | list +-----+ | | | | +----------+ +------+ ,--->+ >-----> | | | _buffers >----> >----- +-----+ | +-----+ | +----------+ +----^-+ \ ptr | raw | | last_p | / `-->+-----+ | +-----+ | +--------+-+ / + >-----> | | | ,- ,--->+-----+ | | | | | / ,--- | | | | | / ,--- | | | | +-v--+-^--+--^+-------+ | | | | | bl | ls | p | p_off >--------------->| | | +----+----+-----+-----+ | +-----+ | | | off >------------->| raw | +---------------+-----+ | | iterator +---------+
The actual data is stored in buffer::raw opaque objects. They are accessed through a buffer::ptr. A buffer::list is a sequential list of buffer::ptr which can be used as if it was a contiguous data area although it can be spread over many buffer::raw containers, as represented by the rectangle enclosing the two buffer::raw objects in the above drawing. The buffer::list::iterator can be used to walk each character of the buffer::list as follows:
bufferlist bl; bl.append("ABC", 3); { bufferlist::iterator i(&bl); ++i; EXPECT_EQ('B', *i); }