From 19fcec84d8d7d21e796c7624e521b60d28ee21ed Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 20:45:59 +0200 Subject: Adding upstream version 16.2.11+ds. Signed-off-by: Daniel Baumann --- src/crimson/osd/pg_backend.h | 235 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 src/crimson/osd/pg_backend.h (limited to 'src/crimson/osd/pg_backend.h') diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h new file mode 100644 index 000000000..d8fa8b2ac --- /dev/null +++ b/src/crimson/osd/pg_backend.h @@ -0,0 +1,235 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#pragma once + +#include +#include +#include +#include +#include + +#include "crimson/os/futurized_store.h" +#include "crimson/os/futurized_collection.h" +#include "crimson/osd/acked_peers.h" +#include "crimson/osd/pg.h" +#include "crimson/common/shared_lru.h" +#include "messages/MOSDOp.h" +#include "messages/MOSDOpReply.h" +#include "os/Transaction.h" +#include "osd/osd_types.h" +#include "crimson/osd/object_context.h" +#include "crimson/osd/osd_operation.h" +#include "crimson/osd/osd_operations/osdop_params.h" + +struct hobject_t; + +namespace ceph::os { + class Transaction; +} + +namespace crimson::osd { + class ShardServices; +} + +class PGBackend +{ +protected: + using CollectionRef = crimson::os::CollectionRef; + using ec_profile_t = std::map; + // low-level read errorator + using ll_read_errorator = crimson::os::FuturizedStore::read_errorator; + +public: + using load_metadata_ertr = crimson::errorator< + crimson::ct_error::object_corrupted>; + PGBackend(shard_id_t shard, CollectionRef coll, crimson::os::FuturizedStore* store); + virtual ~PGBackend() = default; + static std::unique_ptr create(pg_t pgid, + const pg_shard_t pg_shard, + const pg_pool_t& pool, + crimson::os::CollectionRef coll, + crimson::osd::ShardServices& shard_services, + const ec_profile_t& ec_profile); + using attrs_t = + std::map>; + using read_errorator = ll_read_errorator::extend< + crimson::ct_error::object_corrupted>; + read_errorator::future<> read( + const ObjectState& os, + OSDOp& osd_op); + read_errorator::future<> sparse_read( + const ObjectState& os, + OSDOp& osd_op); + using checksum_errorator = ll_read_errorator::extend< + crimson::ct_error::object_corrupted, + crimson::ct_error::invarg>; + checksum_errorator::future<> checksum( + const ObjectState& os, + OSDOp& osd_op); + using cmp_ext_errorator = ll_read_errorator::extend< + crimson::ct_error::invarg>; + cmp_ext_errorator::future<> cmp_ext( + const ObjectState& os, + OSDOp& osd_op); + using stat_errorator = crimson::errorator; + stat_errorator::future<> stat( + const ObjectState& os, + OSDOp& osd_op); + + // TODO: switch the entire write family to errorator. + using write_ertr = crimson::errorator< + crimson::ct_error::file_too_large>; + seastar::future<> create( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans); + seastar::future<> remove( + ObjectState& os, + ceph::os::Transaction& txn); + seastar::future<> write( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); + seastar::future<> write_same( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); + seastar::future<> writefull( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); + using append_errorator = crimson::errorator< + crimson::ct_error::invarg>; + append_errorator::future<> append( + ObjectState& os, + OSDOp& osd_op, + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); + write_ertr::future<> truncate( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); + write_ertr::future<> zero( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); + seastar::future mutate_object( + std::set pg_shards, + crimson::osd::ObjectContextRef &&obc, + ceph::os::Transaction&& txn, + const osd_op_params_t& osd_op_p, + epoch_t min_epoch, + epoch_t map_epoch, + std::vector&& log_entries); + seastar::future, hobject_t>> list_objects( + const hobject_t& start, + uint64_t limit) const; + seastar::future<> setxattr( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans); + using get_attr_errorator = crimson::os::FuturizedStore::get_attr_errorator; + get_attr_errorator::future<> getxattr( + const ObjectState& os, + OSDOp& osd_op) const; + get_attr_errorator::future getxattr( + const hobject_t& soid, + std::string_view key) const; + get_attr_errorator::future<> get_xattrs( + const ObjectState& os, + OSDOp& osd_op) const; + using rm_xattr_ertr = crimson::errorator; + rm_xattr_ertr::future<> rm_xattr( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans); + seastar::future stat( + CollectionRef c, + const ghobject_t& oid) const; + seastar::future> fiemap( + CollectionRef c, + const ghobject_t& oid, + uint64_t off, + uint64_t len); + + // OMAP + ll_read_errorator::future<> omap_get_keys( + const ObjectState& os, + OSDOp& osd_op) const; + ll_read_errorator::future<> omap_get_vals( + const ObjectState& os, + OSDOp& osd_op) const; + ll_read_errorator::future<> omap_get_vals_by_keys( + const ObjectState& os, + OSDOp& osd_op) const; + seastar::future<> omap_set_vals( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); + ll_read_errorator::future omap_get_header( + const crimson::os::CollectionRef& c, + const ghobject_t& oid) const; + ll_read_errorator::future<> omap_get_header( + const ObjectState& os, + OSDOp& osd_op) const; + seastar::future<> omap_set_header( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans); + seastar::future<> omap_remove_range( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans); + using omap_clear_ertr = crimson::errorator; + omap_clear_ertr::future<> omap_clear( + ObjectState& os, + OSDOp& osd_op, + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); + + virtual void got_rep_op_reply(const MOSDRepOpReply&) {} + virtual seastar::future<> stop() = 0; + struct peering_info_t { + bool is_primary; + }; + virtual void on_actingset_changed(peering_info_t pi) = 0; + virtual void on_activate_complete(); +protected: + const shard_id_t shard; + CollectionRef coll; + crimson::os::FuturizedStore* store; + bool stopping = false; + std::optional peering; +public: + struct loaded_object_md_t { + ObjectState os; + std::optional ss; + using ref = std::unique_ptr; + }; + load_metadata_ertr::future load_metadata( + const hobject_t &oid); + +private: + virtual ll_read_errorator::future _read( + const hobject_t& hoid, + size_t offset, + size_t length, + uint32_t flags) = 0; + + bool maybe_create_new_object(ObjectState& os, ceph::os::Transaction& txn); + virtual seastar::future + _submit_transaction(std::set&& pg_shards, + const hobject_t& hoid, + ceph::os::Transaction&& txn, + const osd_op_params_t& osd_op_p, + epoch_t min_epoch, epoch_t max_epoch, + std::vector&& log_entries) = 0; + friend class ReplicatedRecoveryBackend; +}; -- cgit v1.2.3