Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rbd-mirror: non-primary image is recording journal events during image sync #10462

Merged
merged 9 commits into from Aug 2, 2016
372 changes: 165 additions & 207 deletions src/librbd/AioCompletion.cc

Large diffs are not rendered by default.

465 changes: 219 additions & 246 deletions src/librbd/AioCompletion.h

Large diffs are not rendered by default.

420 changes: 271 additions & 149 deletions src/librbd/AioImageRequest.cc

Large diffs are not rendered by default.

72 changes: 47 additions & 25 deletions src/librbd/AioImageRequest.h
Expand Up @@ -15,9 +15,9 @@

namespace librbd {

class AioObjectRequest;
class ImageCtx;
class AioCompletion;
class AioObjectRequestHandle;
class ImageCtx;

template <typename ImageCtxT = ImageCtx>
class AioImageRequest {
Expand Down Expand Up @@ -49,7 +49,7 @@ class AioImageRequest {
void fail(int r);

protected:
typedef std::list<AioObjectRequest *> AioObjectRequests;
typedef std::list<AioObjectRequestHandle *> AioObjectRequests;

ImageCtxT &m_image_ctx;
AioCompletion *m_aio_comp;
Expand All @@ -62,20 +62,24 @@ class AioImageRequest {
virtual const char *get_request_type() const = 0;
};

class AioImageRead : public AioImageRequest<> {
template <typename ImageCtxT = ImageCtx>
class AioImageRead : public AioImageRequest<ImageCtxT> {
public:
AioImageRead(ImageCtx &image_ctx, AioCompletion *aio_comp, uint64_t off,
using typename AioImageRequest<ImageCtxT>::Extents;

AioImageRead(ImageCtxT &image_ctx, AioCompletion *aio_comp, uint64_t off,
size_t len, char *buf, bufferlist *pbl, int op_flags)
: AioImageRequest(image_ctx, aio_comp), m_buf(buf), m_pbl(pbl),
: AioImageRequest<ImageCtxT>(image_ctx, aio_comp), m_buf(buf), m_pbl(pbl),
m_op_flags(op_flags) {
m_image_extents.push_back(std::make_pair(off, len));
}

AioImageRead(ImageCtx &image_ctx, AioCompletion *aio_comp,
AioImageRead(ImageCtxT &image_ctx, AioCompletion *aio_comp,
const Extents &image_extents, char *buf, bufferlist *pbl,
int op_flags)
: AioImageRequest(image_ctx, aio_comp), m_image_extents(image_extents),
m_buf(buf), m_pbl(pbl), m_op_flags(op_flags) {
: AioImageRequest<ImageCtxT>(image_ctx, aio_comp),
m_image_extents(image_extents), m_buf(buf), m_pbl(pbl),
m_op_flags(op_flags) {
}

protected:
Expand All @@ -93,7 +97,8 @@ class AioImageRead : public AioImageRequest<> {
int m_op_flags;
};

class AbstractAioImageWrite : public AioImageRequest<> {
template <typename ImageCtxT = ImageCtx>
class AbstractAioImageWrite : public AioImageRequest<ImageCtxT> {
public:
virtual bool is_write_op() const {
return true;
Expand All @@ -104,14 +109,16 @@ class AbstractAioImageWrite : public AioImageRequest<> {
}

protected:
using typename AioImageRequest<ImageCtxT>::AioObjectRequests;

typedef std::vector<ObjectExtent> ObjectExtents;

const uint64_t m_off;
const size_t m_len;

AbstractAioImageWrite(ImageCtx &image_ctx, AioCompletion *aio_comp,
AbstractAioImageWrite(ImageCtxT &image_ctx, AioCompletion *aio_comp,
uint64_t off, size_t len)
: AioImageRequest(image_ctx, aio_comp), m_off(off), m_len(len),
: AioImageRequest<ImageCtxT>(image_ctx, aio_comp), m_off(off), m_len(len),
m_synchronous(false) {
}

Expand All @@ -128,7 +135,7 @@ class AbstractAioImageWrite : public AioImageRequest<> {
virtual void send_object_requests(const ObjectExtents &object_extents,
const ::SnapContext &snapc,
AioObjectRequests *aio_object_requests);
virtual AioObjectRequest *create_object_request(
virtual AioObjectRequestHandle *create_object_request(
const ObjectExtent &object_extent, const ::SnapContext &snapc,
Context *on_finish) = 0;

Expand All @@ -140,15 +147,19 @@ class AbstractAioImageWrite : public AioImageRequest<> {
bool m_synchronous;
};

class AioImageWrite : public AbstractAioImageWrite {
template <typename ImageCtxT = ImageCtx>
class AioImageWrite : public AbstractAioImageWrite<ImageCtxT> {
public:
AioImageWrite(ImageCtx &image_ctx, AioCompletion *aio_comp, uint64_t off,
AioImageWrite(ImageCtxT &image_ctx, AioCompletion *aio_comp, uint64_t off,
size_t len, const char *buf, int op_flags)
: AbstractAioImageWrite(image_ctx, aio_comp, off, len), m_buf(buf),
m_op_flags(op_flags) {
: AbstractAioImageWrite<ImageCtxT>(image_ctx, aio_comp, off, len),
m_buf(buf), m_op_flags(op_flags) {
}

protected:
using typename AioImageRequest<ImageCtxT>::AioObjectRequests;
using typename AbstractAioImageWrite<ImageCtxT>::ObjectExtents;

virtual aio_type_t get_aio_type() const {
return AIO_TYPE_WRITE;
}
Expand All @@ -164,7 +175,7 @@ class AioImageWrite : public AbstractAioImageWrite {
virtual void send_object_requests(const ObjectExtents &object_extents,
const ::SnapContext &snapc,
AioObjectRequests *aio_object_requests);
virtual AioObjectRequest *create_object_request(
virtual AioObjectRequestHandle *create_object_request(
const ObjectExtent &object_extent, const ::SnapContext &snapc,
Context *on_finish);

Expand All @@ -176,14 +187,18 @@ class AioImageWrite : public AbstractAioImageWrite {
int m_op_flags;
};

class AioImageDiscard : public AbstractAioImageWrite {
template <typename ImageCtxT = ImageCtx>
class AioImageDiscard : public AbstractAioImageWrite<ImageCtxT> {
public:
AioImageDiscard(ImageCtx &image_ctx, AioCompletion *aio_comp, uint64_t off,
AioImageDiscard(ImageCtxT &image_ctx, AioCompletion *aio_comp, uint64_t off,
uint64_t len)
: AbstractAioImageWrite(image_ctx, aio_comp, off, len) {
: AbstractAioImageWrite<ImageCtxT>(image_ctx, aio_comp, off, len) {
}

protected:
using typename AioImageRequest<ImageCtxT>::AioObjectRequests;
using typename AbstractAioImageWrite<ImageCtxT>::ObjectExtents;

virtual aio_type_t get_aio_type() const {
return AIO_TYPE_DISCARD;
}
Expand All @@ -196,7 +211,7 @@ class AioImageDiscard : public AbstractAioImageWrite {
virtual void send_cache_requests(const ObjectExtents &object_extents,
uint64_t journal_tid);

virtual AioObjectRequest *create_object_request(
virtual AioObjectRequestHandle *create_object_request(
const ObjectExtent &object_extent, const ::SnapContext &snapc,
Context *on_finish);

Expand All @@ -205,17 +220,20 @@ class AioImageDiscard : public AbstractAioImageWrite {
virtual void update_stats(size_t length);
};

class AioImageFlush : public AioImageRequest<> {
template <typename ImageCtxT = ImageCtx>
class AioImageFlush : public AioImageRequest<ImageCtxT> {
public:
AioImageFlush(ImageCtx &image_ctx, AioCompletion *aio_comp)
: AioImageRequest(image_ctx, aio_comp) {
AioImageFlush(ImageCtxT &image_ctx, AioCompletion *aio_comp)
: AioImageRequest<ImageCtxT>(image_ctx, aio_comp) {
}

virtual bool is_write_op() const {
return true;
}

protected:
using typename AioImageRequest<ImageCtxT>::AioObjectRequests;

virtual void send_request();
virtual aio_type_t get_aio_type() const {
return AIO_TYPE_FLUSH;
Expand All @@ -228,5 +246,9 @@ class AioImageFlush : public AioImageRequest<> {
} // namespace librbd

extern template class librbd::AioImageRequest<librbd::ImageCtx>;
extern template class librbd::AbstractAioImageWrite<librbd::ImageCtx>;
extern template class librbd::AioImageWrite<librbd::ImageCtx>;
extern template class librbd::AioImageDiscard<librbd::ImageCtx>;
extern template class librbd::AioImageFlush<librbd::ImageCtx>;

#endif // CEPH_LIBRBD_AIO_IMAGE_REQUEST_H
12 changes: 6 additions & 6 deletions src/librbd/AioImageRequestWQ.cc
Expand Up @@ -49,7 +49,7 @@ ssize_t AioImageRequestWQ::write(uint64_t off, uint64_t len, const char *buf,
<< "len = " << len << dendl;

m_image_ctx.snap_lock.get_read();
int r = clip_io(&m_image_ctx, off, &len);
int r = clip_io(util::get_image_ctx(&m_image_ctx), off, &len);
m_image_ctx.snap_lock.put_read();
if (r < 0) {
lderr(cct) << "invalid IO request: " << cpp_strerror(r) << dendl;
Expand All @@ -73,7 +73,7 @@ int AioImageRequestWQ::discard(uint64_t off, uint64_t len) {
<< "len = " << len << dendl;

m_image_ctx.snap_lock.get_read();
int r = clip_io(&m_image_ctx, off, &len);
int r = clip_io(util::get_image_ctx(&m_image_ctx), off, &len);
m_image_ctx.snap_lock.put_read();
if (r < 0) {
lderr(cct) << "invalid IO request: " << cpp_strerror(r) << dendl;
Expand Down Expand Up @@ -120,7 +120,7 @@ void AioImageRequestWQ::aio_read(AioCompletion *c, uint64_t off, uint64_t len,

if (m_image_ctx.non_blocking_aio || writes_blocked() || !writes_empty() ||
lock_required) {
queue(new AioImageRead(m_image_ctx, c, off, len, buf, pbl, op_flags));
queue(new AioImageRead<>(m_image_ctx, c, off, len, buf, pbl, op_flags));
} else {
c->start_op();
AioImageRequest<>::aio_read(&m_image_ctx, c, off, len, buf, pbl, op_flags);
Expand All @@ -147,7 +147,7 @@ void AioImageRequestWQ::aio_write(AioCompletion *c, uint64_t off, uint64_t len,

RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
if (m_image_ctx.non_blocking_aio || writes_blocked()) {
queue(new AioImageWrite(m_image_ctx, c, off, len, buf, op_flags));
queue(new AioImageWrite<>(m_image_ctx, c, off, len, buf, op_flags));
} else {
c->start_op();
AioImageRequest<>::aio_write(&m_image_ctx, c, off, len, buf, op_flags);
Expand All @@ -173,7 +173,7 @@ void AioImageRequestWQ::aio_discard(AioCompletion *c, uint64_t off,

RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
if (m_image_ctx.non_blocking_aio || writes_blocked()) {
queue(new AioImageDiscard(m_image_ctx, c, off, len));
queue(new AioImageDiscard<>(m_image_ctx, c, off, len));
} else {
c->start_op();
AioImageRequest<>::aio_discard(&m_image_ctx, c, off, len);
Expand All @@ -197,7 +197,7 @@ void AioImageRequestWQ::aio_flush(AioCompletion *c, bool native_async) {

RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
if (m_image_ctx.non_blocking_aio || writes_blocked() || !writes_empty()) {
queue(new AioImageFlush(m_image_ctx, c));
queue(new AioImageFlush<>(m_image_ctx, c));
} else {
AioImageRequest<>::aio_flush(&m_image_ctx, c);
finish_in_flight_op();
Expand Down