The librados calls used by AioRequest::send should always return
zero unless there is a bug.
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit
c77bce3311ab62892eb8c1d883263ba7ed663b20)
Conflicts:
src/librbd/AioRequest.cc: trivial resolution
src/librbd/AioRequest.h: trivial resolution
src/librbd/internal.cc: trivial resolution
return true;
}
- int AioRead::send() {
- ldout(m_ictx->cct, 20) << "send " << this << " " << m_oid << " " << m_object_off << "~" << m_object_len << dendl;
+ void AioRead::send() {
+ ldout(m_ictx->cct, 20) << "send " << this << " " << m_oid << " "
+ << m_object_off << "~" << m_object_len << dendl;
librados::AioCompletion *rados_completion =
librados::Rados::aio_create_completion(this, rados_req_cb, NULL);
} else {
op.read(m_object_off, m_object_len, &m_read_data, NULL);
}
+
r = m_ioctx->aio_operate(m_oid, rados_completion, &op, flags, NULL);
+ assert(r == 0);
rados_completion->release();
- return r;
}
/** write **/
return finished;
}
- int AbstractWrite::send() {
- ldout(m_ictx->cct, 20) << "send " << this << " " << m_oid << " " << m_object_off << "~" << m_object_len << dendl;
+ void AbstractWrite::send() {
+ ldout(m_ictx->cct, 20) << "send " << this << " " << m_oid << " "
+ << m_object_off << "~" << m_object_len << dendl;
librados::AioCompletion *rados_completion =
librados::Rados::aio_create_completion(this, NULL, rados_req_cb);
int r;
assert(m_write.size());
r = m_ioctx->aio_operate(m_oid, rados_completion, &m_write,
m_snap_seq, m_snaps);
+ assert(r == 0);
rados_completion->release();
- return r;
}
void AbstractWrite::send_copyup() {
}
virtual bool should_complete(int r) = 0;
- virtual int send() = 0;
+ virtual void send() = 0;
protected:
void read_from_parent(vector<pair<uint64_t,uint64_t> >& image_extents);
}
virtual ~AioRead() {}
virtual bool should_complete(int r);
- virtual int send();
+ virtual void send();
ceph::bufferlist &data() {
return m_read_data;
bool hide_enoent);
virtual ~AbstractWrite() {}
virtual bool should_complete(int r);
- virtual int send();
+ virtual void send();
void guard_write();
bool has_parent() const {
SimpleThrottle throttle(cct->_conf->rbd_concurrent_management_ops, false);
for (uint64_t ono = 0; ono < overlap_objects; ono++) {
+ if (throttle.pending_error()) {
+ return throttle.wait_for_ret();
+ }
+
{
RWLock::RLocker l(ictx->parent_lock);
// stop early if the parent went away - it just means
Context *comp = new C_SimpleThrottle(&throttle);
AioWrite *req = new AioWrite(ictx, oid, ono, 0, objectx, object_overlap,
bl, snapc, CEPH_NOSNAP, comp);
- r = req->send();
- if (r < 0) {
- lderr(cct) << "failed to flatten object " << oid << dendl;
- goto err;
- }
-
+ req->send();
prog_ctx.update_progress(ono, overlap_objects);
}
objectx, object_overlap,
bl, snapc, snap_id, req_comp);
c->add_request();
- r = req->send();
- assert(r == 0);
+ req->send();
}
}
snapc, snap_id, req_comp);
}
- r = req->send();
- assert(r == 0);
+ req->send();
}
+ r = 0;
if (ictx->object_cacher) {
Mutex::Locker l(ictx->cache_lock);
ictx->object_cacher->discard_set(ictx->object_set, extents);
q->length, q->offset,
cache_comp);
} else {
- r = req->send();
- assert(r == 0);
+ req->send();
}
}
}
- c->finish_adding_requests(cct);
+ c->finish_adding_requests(ictx->cct);
c->put();
ictx->perfcounter->inc(l_librbd_aio_rd);