std::string oid;
uint64_t object_no;
uint64_t off;
+ uint64_t length;
bufferlist bl;
SnapContext snapc;
uint64_t journal_tid;
C_WriteJournalCommit(ImageCtx *_image_ctx, const std::string &_oid,
uint64_t _object_no, uint64_t _off,
- const bufferlist &_bl, const SnapContext& _snapc,
+ bufferlist&& _bl, const SnapContext& _snapc,
uint64_t _journal_tid,
const ZTracer::Trace &trace, Context *_req_comp)
: image_ctx(_image_ctx), oid(_oid), object_no(_object_no), off(_off),
- bl(_bl), snapc(_snapc), journal_tid(_journal_tid),
- trace(trace), req_comp(_req_comp) {
+ length(_bl.length()), bl(std::move(_bl)), snapc(_snapc),
+ journal_tid(_journal_tid), trace(trace), req_comp(_req_comp) {
CephContext *cct = image_ctx->cct;
ldout(cct, 20) << this << " C_WriteJournalCommit: "
<< "delaying write until journal tid "
Extents file_extents;
Striper::extent_to_file(cct, &image_ctx->layout, object_no, off,
- bl.length(), file_extents);
+ length, file_extents);
for (Extents::iterator it = file_extents.begin();
it != file_extents.end(); ++it) {
image_ctx->journal->commit_io_event_extent(journal_tid, it->first,
request_sent = true;
auto req = new io::ObjectWriteRequest<>(image_ctx, oid, object_no, off,
- bl, snapc, 0, trace, this);
+ std::move(bl), snapc, 0, trace,
+ this);
req->send();
}
};
// all IO operations are flushed prior to closing the journal
assert(journal_tid == 0 || m_ictx->journal != NULL);
+ bufferlist bl_copy(bl);
if (journal_tid != 0) {
m_ictx->journal->flush_event(
journal_tid, new C_WriteJournalCommit(
- m_ictx, oid.name, object_no, off, bl, snapc, journal_tid, trace,
- req_comp));
+ m_ictx, oid.name, object_no, off, std::move(bl_copy), snapc,
+ journal_tid, trace, req_comp));
} else {
auto req = new io::ObjectWriteRequest<>(
- m_ictx, oid.name, object_no, off, bl, snapc, 0, trace, req_comp);
+ m_ictx, oid.name, object_no, off, std::move(bl_copy), snapc, 0, trace,
+ req_comp);
req->send();
}
return ++m_tid;
assemble_extent(object_extent, &bl);
ObjectRequest<I> *req = ObjectRequest<I>::create_write(
&image_ctx, object_extent.oid.name, object_extent.objectno,
- object_extent.offset, bl, snapc, m_op_flags, this->m_trace, on_finish);
+ object_extent.offset, std::move(bl), snapc, m_op_flags, this->m_trace,
+ on_finish);
return req;
}
req = ObjectRequest<I>::create_writesame(
&image_ctx, object_extent.oid.name, object_extent.objectno,
object_extent.offset, object_extent.length,
- bl, snapc, m_op_flags, this->m_trace, on_finish);
+ std::move(bl), snapc, m_op_flags, this->m_trace, on_finish);
return req;
}
req = ObjectRequest<I>::create_write(
&image_ctx, object_extent.oid.name, object_extent.objectno,
- object_extent.offset, bl, snapc, m_op_flags, this->m_trace, on_finish);
+ object_extent.offset, std::move(bl), snapc, m_op_flags, this->m_trace,
+ on_finish);
return req;
}
Context *on_finish) {
I &image_ctx = this->m_image_ctx;
+ // NOTE: safe to move m_cmp_bl since we only support this op against
+ // a single object
bufferlist bl;
assemble_extent(object_extent, &bl);
ObjectRequest<I> *req = ObjectRequest<I>::create_compare_and_write(
&image_ctx, object_extent.oid.name,
object_extent.objectno, object_extent.offset,
- m_cmp_bl, bl, snapc, m_mismatch_offset,
- m_op_flags, this->m_trace, on_finish);
+ std::move(m_cmp_bl), std::move(bl), snapc,
+ m_mismatch_offset, m_op_flags, this->m_trace,
+ on_finish);
return req;
}
ObjectRequest<I>*
ObjectRequest<I>::create_write(I *ictx, const std::string &oid,
uint64_t object_no, uint64_t object_off,
- const ceph::bufferlist &data,
+ ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace,
Context *completion) {
- return new ObjectWriteRequest<I>(ictx, oid, object_no, object_off, data,
- snapc, op_flags, parent_trace, completion);
+ return new ObjectWriteRequest<I>(ictx, oid, object_no, object_off,
+ std::move(data), snapc, op_flags,
+ parent_trace, completion);
}
template <typename I>
ObjectRequest<I>::create_writesame(I *ictx, const std::string &oid,
uint64_t object_no, uint64_t object_off,
uint64_t object_len,
- const ceph::bufferlist &data,
+ ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace,
Context *completion) {
return new ObjectWriteSameRequest<I>(ictx, oid, object_no, object_off,
- object_len, data, snapc, op_flags,
- parent_trace, completion);
+ object_len, std::move(data), snapc,
+ op_flags, parent_trace, completion);
}
template <typename I>
ObjectRequest<I>::create_compare_and_write(I *ictx, const std::string &oid,
uint64_t object_no,
uint64_t object_off,
- const ceph::bufferlist &cmp_data,
- const ceph::bufferlist &write_data,
+ ceph::bufferlist&& cmp_data,
+ ceph::bufferlist&& write_data,
const ::SnapContext &snapc,
uint64_t *mismatch_offset,
int op_flags,
const ZTracer::Trace &parent_trace,
Context *completion) {
return new ObjectCompareAndWriteRequest<I>(ictx, oid, object_no, object_off,
- cmp_data, write_data, snapc,
+ std::move(cmp_data),
+ std::move(write_data), snapc,
mismatch_offset, op_flags,
parent_trace, completion);
}
static ObjectRequest* create_write(ImageCtxT *ictx, const std::string &oid,
uint64_t object_no,
uint64_t object_off,
- const ceph::bufferlist &data,
+ ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace,
Context *completion);
uint64_t object_no,
uint64_t object_off,
uint64_t object_len,
- const ceph::bufferlist &data,
+ ceph::bufferlist&& data,
const ::SnapContext &snapc,
int op_flags,
const ZTracer::Trace &parent_trace,
const std::string &oid,
uint64_t object_no,
uint64_t object_off,
- const ceph::bufferlist &cmp_data,
- const ceph::bufferlist &write_data,
+ ceph::bufferlist&& cmp_data,
+ ceph::bufferlist&& write_data,
const ::SnapContext &snapc,
uint64_t *mismatch_offset, int op_flags,
const ZTracer::Trace &parent_trace,
public:
ObjectWriteRequest(ImageCtxT *ictx, const std::string &oid,
uint64_t object_no, uint64_t object_off,
- const ceph::bufferlist &data, const ::SnapContext &snapc,
+ ceph::bufferlist&& data, const ::SnapContext &snapc,
int op_flags, const ZTracer::Trace &parent_trace,
Context *completion)
: AbstractObjectWriteRequest<ImageCtxT>(ictx, oid, object_no, object_off,
data.length(), snapc, "write",
parent_trace, completion),
- m_write_data(data), m_op_flags(op_flags) {
+ m_write_data(std::move(data)), m_op_flags(op_flags) {
}
bool is_empty_write_op() const override {
public:
ObjectWriteSameRequest(ImageCtxT *ictx, const std::string &oid,
uint64_t object_no, uint64_t object_off,
- uint64_t object_len, const ceph::bufferlist &data,
+ uint64_t object_len, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace,
Context *completion)
: AbstractObjectWriteRequest<ImageCtxT>(ictx, oid, object_no, object_off,
object_len, snapc, "writesame",
parent_trace, completion),
- m_write_data(data), m_op_flags(op_flags) {
+ m_write_data(std::move(data)), m_op_flags(op_flags) {
}
const char *get_op_type() const override {
public:
ObjectCompareAndWriteRequest(ImageCtxT *ictx, const std::string &oid,
uint64_t object_no, uint64_t object_off,
- const ceph::bufferlist &cmp_bl,
- const ceph::bufferlist &write_bl,
+ ceph::bufferlist&& cmp_bl,
+ ceph::bufferlist&& write_bl,
const ::SnapContext &snapc,
uint64_t *mismatch_offset, int op_flags,
const ZTracer::Trace &parent_trace,
cmp_bl.length(), snapc,
"compare_and_write", parent_trace,
completion),
- m_cmp_bl(cmp_bl), m_write_bl(write_bl),
+ m_cmp_bl(std::move(cmp_bl)), m_write_bl(std::move(write_bl)),
m_mismatch_offset(mismatch_offset), m_op_flags(op_flags) {
}
bufferlist bl;
string oid = image_ctx.get_object_name(m_object_no);
auto req = new io::ObjectWriteRequest<I>(&image_ctx, oid, m_object_no, 0,
- bl, m_snapc, 0, {}, this);
+ std::move(bl), m_snapc, 0, {},
+ this);
if (!req->has_parent()) {
// stop early if the parent went away - it just means
// another flatten finished first or the image was resized
C_SaferCond ctx;
auto req = MockObjectWriteRequest::create_write(
- &mock_image_ctx, ictx->get_object_name(0), 0, 0, bl, mock_image_ctx.snapc,
- 0, {}, &ctx);
+ &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(bl),
+ mock_image_ctx.snapc, 0, {}, &ctx);
req->send();
ASSERT_EQ(0, ctx.wait());
}
C_SaferCond ctx;
auto req = MockObjectWriteRequest::create_write(
- &mock_image_ctx, ictx->get_object_name(0), 0, 0, bl, mock_image_ctx.snapc,
- 0, {}, &ctx);
+ &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(bl),
+ mock_image_ctx.snapc, 0, {}, &ctx);
req->send();
ASSERT_EQ(0, ctx.wait());
}
C_SaferCond ctx;
auto req = MockObjectWriteRequest::create_write(
- &mock_image_ctx, ictx->get_object_name(0), 0, 0, bl, mock_image_ctx.snapc,
- 0, {}, &ctx);
+ &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(bl),
+ mock_image_ctx.snapc, 0, {}, &ctx);
req->send();
ASSERT_EQ(0, ctx.wait());
}
C_SaferCond ctx;
auto req = MockObjectWriteRequest::create_write(
- &mock_image_ctx, ictx->get_object_name(0), 0, 0, bl, mock_image_ctx.snapc,
- 0, {}, &ctx);
+ &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(bl),
+ mock_image_ctx.snapc, 0, {}, &ctx);
req->send();
ASSERT_EQ(-EPERM, ctx.wait());
}
C_SaferCond ctx;
auto req = MockObjectWriteRequest::create_write(
- &mock_image_ctx, ictx->get_object_name(0), 0, 0, bl, mock_image_ctx.snapc,
- 0, {}, &ctx);
+ &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(bl),
+ mock_image_ctx.snapc, 0, {}, &ctx);
req->send();
ASSERT_EQ(0, ctx.wait());
}
C_SaferCond ctx;
auto req = MockObjectWriteRequest::create_write(
- &mock_image_ctx, ictx->get_object_name(0), 0, 0, bl, mock_image_ctx.snapc,
- 0, {}, &ctx);
+ &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(bl),
+ mock_image_ctx.snapc, 0, {}, &ctx);
req->send();
ASSERT_EQ(0, ctx.wait());
}
C_SaferCond ctx;
auto req = MockObjectWriteRequest::create_write(
- &mock_image_ctx, ictx->get_object_name(0), 0, 0, bl, mock_image_ctx.snapc,
- 0, {}, &ctx);
+ &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(bl),
+ mock_image_ctx.snapc, 0, {}, &ctx);
req->send();
ASSERT_EQ(-EPERM, ctx.wait());
}
C_SaferCond ctx;
auto req = MockObjectWriteSameRequest::create_writesame(
- &mock_image_ctx, ictx->get_object_name(0), 0, 0, 4096, bl,
+ &mock_image_ctx, ictx->get_object_name(0), 0, 0, 4096, std::move(bl),
mock_image_ctx.snapc, 0, {}, &ctx);
req->send();
ASSERT_EQ(0, ctx.wait());
C_SaferCond ctx;
uint64_t mismatch_offset;
auto req = MockObjectWriteSameRequest::create_compare_and_write(
- &mock_image_ctx, ictx->get_object_name(0), 0, 0, cmp_bl, bl,
- mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
+ &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(cmp_bl),
+ std::move(bl), mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
req->send();
ASSERT_EQ(0, ctx.wait());
}
C_SaferCond ctx;
uint64_t mismatch_offset;
auto req = MockObjectWriteSameRequest::create_compare_and_write(
- &mock_image_ctx, ictx->get_object_name(0), 0, 0, cmp_bl, bl,
- mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
+ &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(cmp_bl),
+ std::move(bl), mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
req->send();
ASSERT_EQ(0, ctx.wait());
}
C_SaferCond ctx;
uint64_t mismatch_offset;
auto req = MockObjectWriteSameRequest::create_compare_and_write(
- &mock_image_ctx, ictx->get_object_name(0), 0, 0, cmp_bl, bl,
- mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
+ &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(cmp_bl),
+ std::move(bl), mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
req->send();
ASSERT_EQ(0, ctx.wait());
}
C_SaferCond ctx;
uint64_t mismatch_offset;
auto req = MockObjectWriteSameRequest::create_compare_and_write(
- &mock_image_ctx, ictx->get_object_name(0), 0, 0, cmp_bl, bl,
- mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
+ &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(cmp_bl),
+ std::move(bl), mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
req->send();
ASSERT_EQ(-EILSEQ, ctx.wait());
ASSERT_EQ(1ULL, mismatch_offset);