xlist<AioCompletion*>::item m_xlist_item;
bool event_notify;
+ template <typename T, void (T::*MF)(int)>
+ static void callback_adapter(completion_t cb, void *arg) {
+ AioCompletion *comp = reinterpret_cast<AioCompletion *>(cb);
+ T *t = reinterpret_cast<T *>(arg);
+ (t->*MF)(comp->get_return_value());
+ comp->release();
+ }
+
+ static AioCompletion *create(void *cb_arg, callback_t cb_complete,
+ rbd_completion_t rbd_comp) {
+ AioCompletion *comp = new AioCompletion();
+ comp->set_complete_cb(cb_arg, cb_complete);
+ comp->rbd_comp = (rbd_comp != nullptr ? rbd_comp : comp);
+ return comp;
+ }
+
+ template <typename T, void (T::*MF)(int) = &T::complete>
+ static AioCompletion *create(T *obj) {
+ AioCompletion *comp = new AioCompletion();
+ comp->set_complete_cb(obj, &callback_adapter<T, MF>);
+ comp->rbd_comp = comp;
+ return comp;
+ }
+
AioCompletion() : lock("AioCompletion::lock", true, false),
done(false), rval(0), complete_cb(NULL),
complete_arg(NULL), rbd_comp(NULL),
image_extents.push_back(make_pair(off, len));
C_SaferCond cond;
- AioCompletion *c = aio_create_completion_internal(&cond, rbd_ctx_cb);
+ AioCompletion *c = AioCompletion::create(&cond);
aio_read(c, off, len, buf, NULL, op_flags, false);
return cond.wait();
}
}
C_SaferCond cond;
- AioCompletion *c = aio_create_completion_internal(&cond, rbd_ctx_cb);
+ AioCompletion *c = AioCompletion::create(&cond);
aio_write(c, off, len, buf, op_flags, false);
r = cond.wait();
}
C_SaferCond cond;
- AioCompletion *c = aio_create_completion_internal(&cond, rbd_ctx_cb);
+ AioCompletion *c = AioCompletion::create(&cond);
aio_discard(c, off, len, false);
r = cond.wait();
guard_read();
}
- AioObjectRead::~AioObjectRead()
- {
- if (m_parent_completion) {
- m_parent_completion->release();
- m_parent_completion = NULL;
- }
- }
-
void AioObjectRead::guard_read()
{
RWLock::RLocker snap_locker(m_ictx->snap_lock);
void AioObjectRead::read_from_parent(const vector<pair<uint64_t,uint64_t> >& parent_extents)
{
assert(!m_parent_completion);
- m_parent_completion = aio_create_completion_internal(this, rbd_req_cb);
+ m_parent_completion = AioCompletion::create<AioObjectRequest>(this);
// prevent the parent image from being deleted while this
// request is still in-progress
#include "include/buffer.h"
#include "include/Context.h"
#include "include/rados/librados.hpp"
+#include "include/rbd/librbd.hpp"
#include "librbd/ObjectMap.h"
namespace librbd {
vector<pair<uint64_t,uint64_t> >& be,
librados::snap_t snap_id, bool sparse,
Context *completion, int op_flags);
- virtual ~AioObjectRead();
virtual bool should_complete(int r);
virtual void send();
read_state_d m_state;
void send_copyup();
+
void read_from_parent(const vector<pair<uint64_t,uint64_t> >& image_extents);
};
void CopyupRequest::send()
{
m_state = STATE_READ_FROM_PARENT;
- AioCompletion *comp = aio_create_completion_internal(
- util::create_context_callback(this), rbd_ctx_cb);
+ AioCompletion *comp = AioCompletion::create(this);
ldout(m_ictx->cct, 20) << __func__ << " " << this
<< ": completion " << comp
AioCompletion *JournalReplay::create_aio_completion(Context *on_safe) {
Mutex::Locker locker(m_lock);
- AioCompletion *aio_comp = aio_create_completion_internal(
- this, &aio_completion_callback);
+ AioCompletion *aio_comp = AioCompletion::create(this, aio_completion_callback,
+ nullptr);
m_aio_completions.insert(std::pair<AioCompletion*,Context*>(
aio_comp, on_safe));
return aio_comp;
}
Context *ctx = new C_CopyWrite(m_throttle, m_bl);
- AioCompletion *comp = aio_create_completion_internal(ctx, rbd_ctx_cb);
+ AioCompletion *comp = AioCompletion::create(ctx);
// coordinate through AIO WQ to ensure lock is acquired if needed
m_dest->aio_work_queue->aio_write(comp, m_offset, m_bl->length(),
uint64_t len = min(period, src_size - offset);
bufferlist *bl = new bufferlist();
Context *ctx = new C_CopyRead(&throttle, dest, offset, bl);
- AioCompletion *comp = aio_create_completion_internal(ctx, rbd_ctx_cb);
+ AioCompletion *comp = AioCompletion::create(ctx);
AioImageRequest::aio_read(src, comp, offset, len, NULL, bl,
fadvise_flags);
prog_ctx.update_progress(offset, src_size);
bufferlist bl;
- Mutex mylock("IoCtxImpl::write::mylock");
- Cond cond;
- bool done;
- int ret;
-
- Context *ctx = new C_SafeCond(&mylock, &cond, &done, &ret);
- AioCompletion *c = aio_create_completion_internal(ctx, rbd_ctx_cb);
+ C_SaferCond ctx;
+ AioCompletion *c = AioCompletion::create(&ctx);
AioImageRequest::aio_read(ictx, c, off, read_len, NULL, &bl, 0);
- mylock.Lock();
- while (!done)
- cond.Wait(mylock);
- mylock.Unlock();
-
- if (ret < 0)
- return ret;
+ int ret = ctx.wait();
+ if (ret < 0) {
+ return ret;
+ }
r = cb(total_read, ret, bl.c_str(), arg);
- if (r < 0)
+ if (r < 0) {
return r;
+ }
total_read += ret;
left -= ret;
ictx->perfcounter->inc(l_librbd_readahead_bytes, readahead_length);
}
}
-
- AioCompletion *aio_create_completion() {
- AioCompletion *c = new AioCompletion();
- return c;
- }
-
- AioCompletion *aio_create_completion(void *cb_arg, callback_t cb_complete) {
- AioCompletion *c = new AioCompletion();
- c->set_complete_cb(cb_arg, cb_complete);
- return c;
- }
-
- AioCompletion *aio_create_completion_internal(void *cb_arg,
- callback_t cb_complete) {
- AioCompletion *c = aio_create_completion(cb_arg, cb_complete);
- c->rbd_comp = c;
- return c;
- }
}
int mirror_peer_set_cluster(IoCtx& io_ctx, const std::string &cluster_uuid,
const std::string &cluster_name);
- AioCompletion *aio_create_completion();
- AioCompletion *aio_create_completion(void *cb_arg, callback_t cb_complete);
- AioCompletion *aio_create_completion_internal(void *cb_arg,
- callback_t cb_complete);
-
- // raw callbacks
- void rbd_req_cb(completion_t cb, void *arg);
- void rbd_ctx_cb(completion_t cb, void *arg);
}
#endif
RBD::AioCompletion::AioCompletion(void *cb_arg, callback_t complete_cb)
{
- librbd::AioCompletion *c = librbd::aio_create_completion(cb_arg,
- complete_cb);
- pc = (void *)c;
- c->rbd_comp = this;
+ pc = reinterpret_cast<void*>(librbd::AioCompletion::create(
+ cb_arg, complete_cb, this));
}
bool RBD::AioCompletion::is_complete()