#include "include/int_types.h"
#include "include/buffer.h"
+#include "include/neorados/RADOS.hpp"
#include "include/rados/librados.hpp"
-#include "common/snap_types.h"
#include "common/zipkin_trace.h"
#include "librbd/ObjectMap.h"
+#include "librbd/Types.h"
#include "librbd/io/Types.h"
#include <map>
class Context;
class ObjectExtent;
+namespace neorados { struct WriteOp; }
+
namespace librbd {
struct ImageCtx;
public:
static ObjectRequest* create_write(
ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
- ceph::bufferlist&& data, const ::SnapContext &snapc, int op_flags,
+ ceph::bufferlist&& data, IOContext io_context, int op_flags,
+ int write_flags, std::optional<uint64_t> assert_version,
const ZTracer::Trace &parent_trace, Context *completion);
static ObjectRequest* create_discard(
ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
- uint64_t object_len, const ::SnapContext &snapc, int discard_flags,
+ uint64_t object_len, IOContext io_context, int discard_flags,
const ZTracer::Trace &parent_trace, Context *completion);
static ObjectRequest* create_write_same(
ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
- uint64_t object_len, ceph::bufferlist&& data, const ::SnapContext &snapc,
+ uint64_t object_len, ceph::bufferlist&& data, IOContext io_context,
int op_flags, const ZTracer::Trace &parent_trace, Context *completion);
static ObjectRequest* create_compare_and_write(
ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
ceph::bufferlist&& cmp_data, ceph::bufferlist&& write_data,
- const ::SnapContext &snapc, uint64_t *mismatch_offset, int op_flags,
+ IOContext io_context, uint64_t *mismatch_offset, int op_flags,
const ZTracer::Trace &parent_trace, Context *completion);
- ObjectRequest(ImageCtxT *ictx, uint64_t objectno, uint64_t off, uint64_t len,
- librados::snap_t snap_id, const char *trace_name,
- const ZTracer::Trace &parent_trace, Context *completion);
+ ObjectRequest(ImageCtxT *ictx, uint64_t objectno, IOContext io_context,
+ const char *trace_name, const ZTracer::Trace &parent_trace,
+ Context *completion);
virtual ~ObjectRequest() {
m_trace.event("finish");
}
static void add_write_hint(ImageCtxT& image_ctx,
- librados::ObjectWriteOperation *wr);
+ neorados::WriteOp *wr);
virtual void send() = 0;
bool compute_parent_extents(Extents *parent_extents, bool read_request);
ImageCtxT *m_ictx;
- uint64_t m_object_no, m_object_off, m_object_len;
- librados::snap_t m_snap_id;
+ uint64_t m_object_no;
+ IOContext m_io_context;
Context *m_completion;
ZTracer::Trace m_trace;
template <typename ImageCtxT = ImageCtx>
class ObjectReadRequest : public ObjectRequest<ImageCtxT> {
public:
- typedef std::map<uint64_t, uint64_t> ExtentMap;
-
static ObjectReadRequest* create(
- ImageCtxT *ictx, uint64_t objectno, uint64_t offset, uint64_t len,
- librados::snap_t snap_id, int op_flags,
- const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
- ExtentMap* extent_map, Context *completion) {
- return new ObjectReadRequest(ictx, objectno, offset, len,
- snap_id, op_flags, parent_trace, read_data,
- extent_map, completion);
+ ImageCtxT *ictx, uint64_t objectno, ReadExtents* extents,
+ IOContext io_context, int op_flags, int read_flags,
+ const ZTracer::Trace &parent_trace, uint64_t* version,
+ Context *completion) {
+ return new ObjectReadRequest(ictx, objectno, extents, io_context, op_flags,
+ read_flags, parent_trace, version, completion);
}
ObjectReadRequest(
- ImageCtxT *ictx, uint64_t objectno, uint64_t offset, uint64_t len,
- librados::snap_t snap_id, int op_flags,
- const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
- ExtentMap* extent_map, Context *completion);
+ ImageCtxT *ictx, uint64_t objectno, ReadExtents* extents,
+ IOContext io_context, int op_flags, int read_flags,
+ const ZTracer::Trace &parent_trace, uint64_t* version,
+ Context *completion);
void send() override;
* @endverbatim
*/
+ ReadExtents* m_extents;
int m_op_flags;
-
- ceph::bufferlist* m_read_data;
- ExtentMap* m_extent_map;
+ int m_read_flags;
+ uint64_t* m_version;
void read_object();
void handle_read_object(int r);
public:
AbstractObjectWriteRequest(
ImageCtxT *ictx, uint64_t object_no, uint64_t object_off, uint64_t len,
- const ::SnapContext &snapc, const char *trace_name,
+ IOContext io_context, const char *trace_name,
const ZTracer::Trace &parent_trace, Context *completion);
virtual bool is_empty_write_op() const {
return OBJECT_EXISTS;
}
- virtual void add_copyup_ops(librados::ObjectWriteOperation *wr) {
+ virtual void add_copyup_ops(neorados::WriteOp *wr) {
add_write_ops(wr);
}
void send() override;
protected:
+ uint64_t m_object_off;
+ uint64_t m_object_len;
bool m_full_object = false;
bool m_copyup_enabled = true;
return false;
}
- virtual void add_write_hint(librados::ObjectWriteOperation *wr);
- virtual void add_write_ops(librados::ObjectWriteOperation *wr) = 0;
+ virtual void add_write_hint(neorados::WriteOp *wr);
+ virtual void add_write_ops(neorados::WriteOp *wr) = 0;
virtual int filter_write_result(int r) const {
return r;
}
+ virtual Extents get_copyup_overwrite_extents() const {
+ return {{m_object_off, m_object_len}};
+ }
+
private:
/**
* @verbatim
* @endverbatim
*/
- uint64_t m_snap_seq;
- std::vector<librados::snap_t> m_snaps;
-
Extents m_parent_extents;
bool m_object_may_exist = false;
bool m_copyup_in_progress = false;
public:
ObjectWriteRequest(
ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
- ceph::bufferlist&& data, const ::SnapContext &snapc, int op_flags,
+ ceph::bufferlist&& data, IOContext io_context, int op_flags,
+ int write_flags, std::optional<uint64_t> assert_version,
const ZTracer::Trace &parent_trace, Context *completion)
: AbstractObjectWriteRequest<ImageCtxT>(ictx, object_no, object_off,
- data.length(), snapc, "write",
+ data.length(), io_context, "write",
parent_trace, completion),
- m_write_data(std::move(data)), m_op_flags(op_flags) {
+ m_write_data(std::move(data)), m_op_flags(op_flags),
+ m_write_flags(write_flags), m_assert_version(assert_version) {
}
bool is_empty_write_op() const override {
}
protected:
- void add_write_ops(librados::ObjectWriteOperation *wr) override;
+ void add_write_ops(neorados::WriteOp *wr) override;
+ void add_write_hint(neorados::WriteOp *wr) override;
private:
ceph::bufferlist m_write_data;
int m_op_flags;
+ int m_write_flags;
+ std::optional<uint64_t> m_assert_version;
};
template <typename ImageCtxT = ImageCtx>
public:
ObjectDiscardRequest(
ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
- uint64_t object_len, const ::SnapContext &snapc, int discard_flags,
+ uint64_t object_len, IOContext io_context, int discard_flags,
const ZTracer::Trace &parent_trace, Context *completion)
: AbstractObjectWriteRequest<ImageCtxT>(ictx, object_no, object_off,
- object_len, snapc, "discard",
+ object_len, io_context, "discard",
parent_trace, completion),
m_discard_flags(discard_flags) {
if (this->m_full_object) {
} else {
m_discard_action = DISCARD_ACTION_TRUNCATE;
}
- this->m_object_len = 0;
} else {
m_discard_action = DISCARD_ACTION_REMOVE;
}
return (m_discard_action == DISCARD_ACTION_REMOVE);
}
- void add_write_hint(librados::ObjectWriteOperation *wr) override {
+ void add_write_hint(neorados::WriteOp *wr) override {
// no hint for discard
}
- void add_write_ops(librados::ObjectWriteOperation *wr) override {
- switch (m_discard_action) {
- case DISCARD_ACTION_REMOVE:
- wr->remove();
- break;
- case DISCARD_ACTION_REMOVE_TRUNCATE:
- wr->create(false);
- // fall through
- case DISCARD_ACTION_TRUNCATE:
- wr->truncate(this->m_object_off);
- break;
- case DISCARD_ACTION_ZERO:
- wr->zero(this->m_object_off, this->m_object_len);
- break;
- default:
- ceph_abort();
- break;
- }
- }
+ void add_write_ops(neorados::WriteOp *wr) override;
private:
enum DiscardAction {
public:
ObjectWriteSameRequest(
ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
- uint64_t object_len, ceph::bufferlist&& data, const ::SnapContext &snapc,
+ uint64_t object_len, ceph::bufferlist&& data, IOContext io_context,
int op_flags, const ZTracer::Trace &parent_trace, Context *completion)
: AbstractObjectWriteRequest<ImageCtxT>(ictx, object_no, object_off,
- object_len, snapc, "writesame",
+ object_len, io_context, "writesame",
parent_trace, completion),
m_write_data(std::move(data)), m_op_flags(op_flags) {
}
}
protected:
- void add_write_ops(librados::ObjectWriteOperation *wr) override;
+ void add_write_ops(neorados::WriteOp *wr) override;
private:
ceph::bufferlist m_write_data;
ObjectCompareAndWriteRequest(
ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
ceph::bufferlist&& cmp_bl, ceph::bufferlist&& write_bl,
- const ::SnapContext &snapc, uint64_t *mismatch_offset, int op_flags,
+ IOContext io_context, uint64_t *mismatch_offset, int op_flags,
const ZTracer::Trace &parent_trace, Context *completion)
: AbstractObjectWriteRequest<ImageCtxT>(ictx, object_no, object_off,
- cmp_bl.length(), snapc,
+ cmp_bl.length(), io_context,
"compare_and_write", parent_trace,
completion),
m_cmp_bl(std::move(cmp_bl)), m_write_bl(std::move(write_bl)),
return "compare_and_write";
}
- void add_copyup_ops(librados::ObjectWriteOperation *wr) override {
+ void add_copyup_ops(neorados::WriteOp *wr) override {
// no-op on copyup
}
return true;
}
- void add_write_ops(librados::ObjectWriteOperation *wr) override;
+ void add_write_ops(neorados::WriteOp *wr) override;
int filter_write_result(int r) const override;
+ Extents get_copyup_overwrite_extents() const override {
+ return {};
+ }
+
private:
ceph::bufferlist m_cmp_bl;
ceph::bufferlist m_write_bl;
int m_op_flags;
};
+template <typename ImageCtxT = ImageCtx>
+class ObjectListSnapsRequest : public ObjectRequest<ImageCtxT> {
+public:
+ static ObjectListSnapsRequest* create(
+ ImageCtxT *ictx, uint64_t objectno, Extents&& object_extents,
+ SnapIds&& snap_ids, int list_snaps_flags,
+ const ZTracer::Trace &parent_trace, SnapshotDelta* snapshot_delta,
+ Context *completion) {
+ return new ObjectListSnapsRequest(ictx, objectno,
+ std::move(object_extents),
+ std::move(snap_ids), list_snaps_flags,
+ parent_trace, snapshot_delta, completion);
+ }
+
+ ObjectListSnapsRequest(
+ ImageCtxT *ictx, uint64_t objectno, Extents&& object_extents,
+ SnapIds&& snap_ids, int list_snaps_flags,
+ const ZTracer::Trace &parent_trace, SnapshotDelta* snapshot_delta,
+ Context *completion);
+
+ void send() override;
+
+ const char *get_op_type() const override {
+ return "snap_list";
+ }
+
+private:
+ Extents m_object_extents;
+ SnapIds m_snap_ids;
+ int m_list_snaps_flags;
+ SnapshotDelta* m_snapshot_delta;
+
+ neorados::SnapSet m_snap_set;
+ boost::system::error_code m_ec;
+
+ SnapshotDelta m_parent_snapshot_delta;
+
+ void list_snaps();
+ void handle_list_snaps(int r);
+
+ void list_from_parent();
+ void handle_list_from_parent(int r);
+
+ void zero_extent(uint64_t snap_id, bool dne);
+};
+
} // namespace io
} // namespace librbd
extern template class librbd::io::ObjectDiscardRequest<librbd::ImageCtx>;
extern template class librbd::io::ObjectWriteSameRequest<librbd::ImageCtx>;
extern template class librbd::io::ObjectCompareAndWriteRequest<librbd::ImageCtx>;
+extern template class librbd::io::ObjectListSnapsRequest<librbd::ImageCtx>;
#endif // CEPH_LIBRBD_IO_OBJECT_REQUEST_H