RBD librados中AioRequest,以写为例。
|->m_ictx (ImageCtx)
AioRequest--|-m_oid (string)
/_\ |-m_object_no, m_object_off, m_object_len (uint64_t)
| |-m_snap_id (librados::snap_t)
| |->m_completion (Context*)
| |-m_parent_extents (std::vector<std::pair<uint64_t,uint64_t> >)
| |-m_hide_enoent (bool)
|
AbstractWrite--|-m_state (write_state_d)
/_\ |-m_write (librados::ObjectWriteOperation)
| |-m_snap_seq (uint64_t)
| |-m_snaps (std::vector<librados::snap_t>)
|
AioWrite--|-m_write_data (bufferlist)
|-m_op_flags (int)
new AioWrite(ictx, p->oid.name, p->objectno, p->offset,bl, snapc, req_comp)
AioWrite(ImageCtx *ictx, const std::string &oid, uint64_t object_no,
¦ ¦ ¦ ¦ ¦uint64_t object_off, const ceph::bufferlist &data,
¦ ¦ ¦ ¦ ¦const ::SnapContext &snapc, Context *completion)
¦ : AbstractWrite(ictx, oid, object_no, object_off, data.length(), snapc,
¦ ¦ ¦ completion, false),
m_write_data(data), m_op_flags(0) {
}
AbstractWrite::AbstractWrite(ImageCtx *ictx, const std::string &oid,
uint64_t object_no, uint64_t object_off,
uint64_t len, const ::SnapContext &snapc,
Context *completion, bool hide_enoent)
: AioRequest(ictx, oid, object_no, object_off, len, CEPH_NOSNAP, completion,
hide_enoent),
m_state(LIBRBD_AIO_WRITE_FLAT), m_snap_seq(snapc.seq.val)
{
m_snaps.insert(m_snaps.end(), snapc.snaps.begin(), snapc.snaps.end());
}
AioRequest::AioRequest(ImageCtx *ictx, const std::string &oid,
uint64_t objectno, uint64_t off, uint64_t len,
librados::snap_t snap_id,
Context *completion,
bool hide_enoent)
¦ : m_ictx(ictx), m_oid(oid), m_object_no(objectno), m_object_off(off),
¦ ¦ m_object_len(len), m_snap_id(snap_id), m_completion(completion),
¦ ¦ m_hide_enoent(hide_enoent) {
¦ Striper::extent_to_file(m_ictx->cct, &m_ictx->layout, m_object_no,
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ 0, m_ictx->layout.fl_object_size, m_parent_extents);
¦ RWLock::RLocker snap_locker(m_ictx->snap_lock);
¦ RWLock::RLocker parent_locker(m_ictx->parent_lock);
¦ compute_parent_extents();
}