reinterpret_cast<map<string,bufferptr>&>(aset));
}).then([&aset] (int r) -> get_attrs_ertr::future<attrs_t> {
if (r == -ENOENT) {
- return crimson::ct_error::enoent::make();;
+ return crimson::ct_error::enoent::make();
} else {
return get_attrs_ertr::make_ready_future<attrs_t>(std::move(aset));
}
});
}
-seastar::future<AlienStore::omap_values_t>
-AlienStore::omap_get_values(CollectionRef ch,
- const ghobject_t& oid,
- const set<string>& keys)
+auto AlienStore::omap_get_values(CollectionRef ch,
+ const ghobject_t& oid,
+ const set<string>& keys)
+ -> read_errorator::future<omap_values_t>
{
logger().debug("{}", __func__);
return seastar::do_with(omap_values_t{}, [=] (auto &values) {
auto c = static_cast<AlienCollection*>(ch.get());
return store->omap_get_values(c->collection, oid, keys,
reinterpret_cast<map<string, bufferlist>*>(&values));
- }).then([&values] (int r) {
- assert(r == 0);
- return seastar::make_ready_future<omap_values_t>(std::move(values));
+ }).then([&values] (int r) -> read_errorator::future<omap_values_t> {
+ if (r == -ENOENT) {
+ return crimson::ct_error::enoent::make();
+ } else if (r < 0){
+ logger().error("omap_get_values: {}", r);
+ return crimson::ct_error::input_output_error::make();
+ } else {
+ return read_errorator::make_ready_future<omap_values_t>(std::move(values));
+ }
});
});
}
-seastar::future<std::tuple<bool, AlienStore::omap_values_t>>
-AlienStore::omap_get_values(CollectionRef ch,
- const ghobject_t &oid,
- const std::optional<string> &start)
+auto AlienStore::omap_get_values(CollectionRef ch,
+ const ghobject_t &oid,
+ const std::optional<string> &start)
+ -> read_errorator::future<std::tuple<bool, omap_values_t>>
{
logger().debug("{} with_start", __func__);
return seastar::do_with(omap_values_t{}, [=] (auto &values) {
auto c = static_cast<AlienCollection*>(ch.get());
return store->omap_get_values(c->collection, oid, start,
reinterpret_cast<map<string, bufferlist>*>(&values));
- }).then([&values] (int r) {
- return seastar::make_ready_future<std::tuple<bool, omap_values_t>>(
- std::make_tuple(true, std::move(values)));
+ }).then([&values] (int r)
+ -> read_errorator::future<std::tuple<bool, omap_values_t>> {
+ if (r == -ENOENT) {
+ return crimson::ct_error::enoent::make();
+ } else if (r < 0){
+ logger().error("omap_get_values(start): {}", r);
+ return crimson::ct_error::input_output_error::make();
+ } else {
+ return read_errorator::make_ready_future<std::tuple<bool, omap_values_t>>(
+ std::make_tuple(true, std::move(values)));
+ }
});
});
}
get_attrs_ertr::future<attrs_t> get_attrs(CollectionRef c,
const ghobject_t& oid) final;
- seastar::future<omap_values_t> omap_get_values(
+ read_errorator::future<omap_values_t> omap_get_values(
CollectionRef c,
const ghobject_t& oid,
const omap_keys_t& keys) final;
- seastar::future<std::tuple<std::vector<ghobject_t>, ghobject_t>> list_objects(
- CollectionRef c,
- const ghobject_t& start,
- const ghobject_t& end,
- uint64_t limit) const final;
-
/// Retrieves paged set of values > start (if present)
- seastar::future<std::tuple<bool, omap_values_t>> omap_get_values(
+ read_errorator::future<std::tuple<bool, omap_values_t>> omap_get_values(
CollectionRef c, ///< [in] collection
const ghobject_t &oid, ///< [in] oid
const std::optional<std::string> &start ///< [in] start, empty for begin
) final; ///< @return <done, values> values.empty() iff done
+ seastar::future<std::tuple<std::vector<ghobject_t>, ghobject_t>> list_objects(
+ CollectionRef c,
+ const ghobject_t& start,
+ const ghobject_t& end,
+ uint64_t limit) const final;
+
seastar::future<CollectionRef> create_new_collection(const coll_t& cid) final;
seastar::future<CollectionRef> open_collection(const coll_t& cid) final;
seastar::future<std::vector<coll_t>> list_collections() final;
return get_attrs_ertr::make_ready_future<attrs_t>(o->xattr);
}
-seastar::future<CyanStore::omap_values_t>
-CyanStore::omap_get_values(CollectionRef ch,
- const ghobject_t& oid,
- const omap_keys_t& keys)
+auto CyanStore::omap_get_values(CollectionRef ch,
+ const ghobject_t& oid,
+ const omap_keys_t& keys)
+ -> read_errorator::future<omap_values_t>
{
auto c = static_cast<Collection*>(ch.get());
- logger().debug("{} {} {}",
- __func__, c->get_cid(), oid);
+ logger().debug("{} {} {}", __func__, c->get_cid(), oid);
auto o = c->get_object(oid);
if (!o) {
- throw std::runtime_error(fmt::format("object does not exist: {}", oid));
+ return crimson::ct_error::enoent::make();
}
omap_values_t values;
for (auto& key : keys) {
return seastar::make_ready_future<omap_values_t>(std::move(values));
}
-seastar::future<std::tuple<bool, CyanStore::omap_values_t>>
-CyanStore::omap_get_values(
- CollectionRef ch,
- const ghobject_t &oid,
- const std::optional<string> &start
- ) {
+auto
+CyanStore::omap_get_values(CollectionRef ch,
+ const ghobject_t &oid,
+ const std::optional<string> &start)
+ -> read_errorator::future<std::tuple<bool, omap_values_t>>
+{
auto c = static_cast<Collection*>(ch.get());
- logger().debug(
- "{} {} {}",
- __func__, c->get_cid(), oid);
+ logger().debug("{} {} {}", __func__, c->get_cid(), oid);
auto o = c->get_object(oid);
if (!o) {
- throw std::runtime_error(fmt::format("object does not exist: {}", oid));
+ return crimson::ct_error::enoent::make();
}
omap_values_t values;
for (auto i = start ? o->omap.upper_bound(*start) : o->omap.begin();
CollectionRef c,
const ghobject_t& oid);
- seastar::future<omap_values_t> omap_get_values(
+ read_errorator::future<omap_values_t> omap_get_values(
CollectionRef c,
const ghobject_t& oid,
const omap_keys_t& keys) final;
- seastar::future<std::tuple<std::vector<ghobject_t>, ghobject_t>> list_objects(
- CollectionRef c,
- const ghobject_t& start,
- const ghobject_t& end,
- uint64_t limit) const final;
-
/// Retrieves paged set of values > start (if present)
- seastar::future<std::tuple<bool, omap_values_t>> omap_get_values(
+ read_errorator::future<std::tuple<bool, omap_values_t>> omap_get_values(
CollectionRef c, ///< [in] collection
const ghobject_t &oid, ///< [in] oid
const std::optional<std::string> &start ///< [in] start, empty for begin
) final; ///< @return <done, values> values.empty() iff done
+ seastar::future<std::tuple<std::vector<ghobject_t>, ghobject_t>> list_objects(
+ CollectionRef c,
+ const ghobject_t& start,
+ const ghobject_t& end,
+ uint64_t limit) const final;
+
seastar::future<ceph::bufferlist> omap_get_header(
CollectionRef c,
const ghobject_t& oid) final;
using omap_values_t = std::map<std::string, bufferlist, std::less<>>;
using omap_keys_t = std::set<std::string>;
- virtual seastar::future<omap_values_t> omap_get_values(
- CollectionRef c,
- const ghobject_t& oid,
- const omap_keys_t& keys) = 0;
+ virtual read_errorator::future<omap_values_t> omap_get_values(
+ CollectionRef c,
+ const ghobject_t& oid,
+ const omap_keys_t& keys) = 0;
virtual seastar::future<std::tuple<std::vector<ghobject_t>, ghobject_t>> list_objects(
CollectionRef c,
const ghobject_t& start,
const ghobject_t& end,
uint64_t limit) const = 0;
- virtual seastar::future<std::tuple<bool, omap_values_t>> omap_get_values(
+ virtual read_errorator::future<std::tuple<bool, omap_values_t>> omap_get_values(
CollectionRef c, ///< [in] collection
const ghobject_t &oid, ///< [in] oid
const std::optional<std::string> &start ///< [in] start, empty for begin
return seastar::make_ready_future<struct stat>(st);
}
-seastar::future<SeaStore::omap_values_t>
-SeaStore::omap_get_values(CollectionRef ch,
- const ghobject_t& oid,
- const omap_keys_t& keys)
-{
- auto c = static_cast<SeastoreCollection*>(ch.get());
- logger().debug("{} {} {}",
- __func__, c->get_cid(), oid);
- return seastar::make_ready_future<omap_values_t>();
-}
-
-
seastar::future<ceph::bufferlist> omap_get_header(
CollectionRef c,
const ghobject_t& oid)
return seastar::make_ready_future<bufferlist>();
}
-seastar::future<std::tuple<bool, SeaStore::omap_values_t>>
+auto
+SeaStore::omap_get_values(
+ CollectionRef ch,
+ const ghobject_t& oid,
+ const omap_keys_t& keys)
+ -> read_errorator::future<omap_values_t>
+{
+ auto c = static_cast<SeastoreCollection*>(ch.get());
+ logger().debug("{} {} {}",
+ __func__, c->get_cid(), oid);
+ return seastar::make_ready_future<omap_values_t>();
+}
+
+auto
SeaStore::omap_get_values(
- CollectionRef ch,
- const ghobject_t &oid,
- const std::optional<string> &start
- ) {
+ CollectionRef ch,
+ const ghobject_t &oid,
+ const std::optional<string> &start)
+ -> read_errorator::future<std::tuple<bool, SeaStore::omap_values_t>>
+{
auto c = static_cast<SeastoreCollection*>(ch.get());
logger().debug(
"{} {} {}",
CollectionRef c,
const ghobject_t& oid) final;
- seastar::future<omap_values_t> omap_get_values(
+ read_errorator::future<omap_values_t> omap_get_values(
CollectionRef c,
const ghobject_t& oid,
const omap_keys_t& keys) final;
+ /// Retrieves paged set of values > start (if present)
+ read_errorator::future<std::tuple<bool, omap_values_t>> omap_get_values(
+ CollectionRef c, ///< [in] collection
+ const ghobject_t &oid, ///< [in] oid
+ const std::optional<std::string> &start ///< [in] start, empty for begin
+ ) final; ///< @return <done, values> values.empty() iff done
+
seastar::future<bufferlist> omap_get_header(
CollectionRef c,
const ghobject_t& oid) final;
const ghobject_t& end,
uint64_t limit) const final;
- /// Retrieves paged set of values > start (if present)
- seastar::future<std::tuple<bool, omap_values_t>> omap_get_values(
- CollectionRef c, ///< [in] collection
- const ghobject_t &oid, ///< [in] oid
- const std::optional<std::string> &start ///< [in] start, empty for begin
- ) final; ///< @return <done, values> values.empty() iff done
-
seastar::future<CollectionRef> create_new_collection(const coll_t& cid) final;
seastar::future<CollectionRef> open_collection(const coll_t& cid) final;
seastar::future<std::vector<coll_t>> list_collections() final;
});
}
-static seastar::future<crimson::os::FuturizedStore::omap_values_t>
+using get_omap_ertr =
+ crimson::os::FuturizedStore::read_errorator::extend<
+ crimson::ct_error::enodata>;
+static
+get_omap_ertr::future<
+ crimson::os::FuturizedStore::omap_values_t>
maybe_get_omap_vals_by_keys(
crimson::os::FuturizedStore* store,
const crimson::os::CollectionRef& coll,
if (oi.is_omap()) {
return store->omap_get_values(coll, ghobject_t{oi.soid}, keys_to_get);
} else {
- return seastar::make_ready_future<crimson::os::FuturizedStore::omap_values_t>(
- crimson::os::FuturizedStore::omap_values_t{});
+ return crimson::ct_error::enodata::make();
}
}
-static seastar::future<std::tuple<bool, crimson::os::FuturizedStore::omap_values_t>>
+static
+get_omap_ertr::future<
+ std::tuple<bool, crimson::os::FuturizedStore::omap_values_t>>
maybe_get_omap_vals(
crimson::os::FuturizedStore* store,
const crimson::os::CollectionRef& coll,
if (oi.is_omap()) {
return store->omap_get_values(coll, ghobject_t{oi.soid}, start_after);
} else {
- return seastar::make_ready_future<std::tuple<bool, crimson::os::FuturizedStore::omap_values_t>>(
- std::make_tuple(true, crimson::os::FuturizedStore::omap_values_t{}));
+ return crimson::ct_error::enodata::make();
}
}
});
}
-seastar::future<> PGBackend::omap_get_keys(
+PGBackend::ll_read_errorator::future<>
+PGBackend::omap_get_keys(
const ObjectState& os,
OSDOp& osd_op) const
{
std::min(max_return, local_conf()->osd_max_omap_entries_per_request);
// TODO: truly chunk the reading
- return maybe_get_omap_vals(store, coll, os.oi, start_after).then(
- [=, &osd_op] (auto ret) {
+ return maybe_get_omap_vals(store, coll, os.oi, start_after).safe_then(
+ [=, &osd_op](auto ret) {
ceph::bufferlist result;
bool truncated = false;
uint32_t num = 0;
- for (auto& [key, val] : std::get<1>(ret)) {
+ for (auto &[key, val] : std::get<1>(ret)) {
if (num >= max_return ||
result.length() >= local_conf()->osd_max_omap_bytes_per_request) {
truncated = true;
osd_op.outdata.claim_append(result);
encode(truncated, osd_op.outdata);
return seastar::now();
- });
-
+ }).handle_error(
+ crimson::ct_error::enodata::handle([&osd_op] {
+ uint32_t num = 0;
+ bool truncated = false;
+ encode(num, osd_op.outdata);
+ encode(truncated, osd_op.outdata);
+ return seastar::now();
+ }),
+ ll_read_errorator::pass_further{}
+ );
// TODO:
//ctx->delta_stats.num_rd_kb += shift_round_up(osd_op.outdata.length(), 10);
//ctx->delta_stats.num_rd++;
}
-seastar::future<> PGBackend::omap_get_vals(
+PGBackend::ll_read_errorator::future<>
+PGBackend::omap_get_vals(
const ObjectState& os,
OSDOp& osd_op) const
{
std::min(max_return, local_conf()->osd_max_omap_entries_per_request);
// TODO: truly chunk the reading
- return maybe_get_omap_vals(store, coll, os.oi, start_after).then(
+ return maybe_get_omap_vals(store, coll, os.oi, start_after).safe_then(
[=, &osd_op] (auto&& ret) {
auto [done, vals] = std::move(ret);
assert(done);
encode(num, osd_op.outdata);
osd_op.outdata.claim_append(result);
encode(truncated, osd_op.outdata);
- return seastar::now();
- });
+ return ll_read_errorator::now();
+ }).handle_error(
+ crimson::ct_error::enodata::handle([&osd_op] {
+ encode(uint32_t{0} /* num */, osd_op.outdata);
+ encode(bool{false} /* truncated */, osd_op.outdata);
+ return ll_read_errorator::now();
+ }),
+ ll_read_errorator::pass_further{}
+ );
// TODO:
//ctx->delta_stats.num_rd_kb += shift_round_up(osd_op.outdata.length(), 10);
//ctx->delta_stats.num_rd++;
}
-seastar::future<> PGBackend::omap_get_vals_by_keys(
+
+PGBackend::ll_read_errorator::future<>
+PGBackend::omap_get_vals_by_keys(
const ObjectState& os,
OSDOp& osd_op) const
{
throw crimson::osd::invalid_argument();
}
- return maybe_get_omap_vals_by_keys(store, coll, os.oi, keys_to_get).then(
- [&osd_op] (crimson::os::FuturizedStore::omap_values_t vals) {
+ return maybe_get_omap_vals_by_keys(store, coll, os.oi, keys_to_get).safe_then(
+ [&osd_op] (crimson::os::FuturizedStore::omap_values_t&& vals) {
encode(vals, osd_op.outdata);
- return seastar::now();
- });
+ return ll_read_errorator::now();
+ }).handle_error(
+ crimson::ct_error::enodata::handle([&osd_op] {
+ uint32_t num = 0;
+ encode(num, osd_op.outdata);
+ return ll_read_errorator::now();
+ }),
+ ll_read_errorator::pass_further{}
+ );
// TODO:
//ctx->delta_stats.num_rd_kb += shift_round_up(osd_op.outdata.length(), 10);
uint64_t len);
// OMAP
- seastar::future<> omap_get_keys(
+ ll_read_errorator::future<> omap_get_keys(
const ObjectState& os,
OSDOp& osd_op) const;
- seastar::future<> omap_get_vals(
+ ll_read_errorator::future<> omap_get_vals(
const ObjectState& os,
OSDOp& osd_op) const;
- seastar::future<> omap_get_vals_by_keys(
+ ll_read_errorator::future<> omap_get_vals_by_keys(
const ObjectState& os,
OSDOp& osd_op) const;
seastar::future<> omap_set_vals(
return std::make_optional(std::move(value));
}
}
+
seastar::future<epoch_t> PGMeta::get_epoch()
{
return store->open_collection(coll_t{pgid}).then([this](auto ch) {
return store->omap_get_values(ch,
pgid.make_pgmeta_oid(),
{string{infover_key},
- string{epoch_key}}).then(
+ string{epoch_key}}).safe_then(
[](auto&& values) {
{
// sanity check
assert(epoch);
return seastar::make_ready_future<epoch_t>(*epoch);
}
+ },
+ FuturizedStore::read_errorator::assert_all{
+ "PGMeta::get_epoch: unable to read pgmeta"
});
});
}
string{info_key},
string{biginfo_key},
string{fastinfo_key}});
- }).then([](auto&& values) {
+ }).safe_then([](auto&& values) {
{
// sanity check
auto infover = find_value<__u8>(values, infover_key);
}
return seastar::make_ready_future<std::tuple<pg_info_t, PastIntervals>>(
std::make_tuple(std::move(info), std::move(past_intervals)));
+ },
+ FuturizedStore::read_errorator::assert_all{
+ "PGMeta::load: unable to read pgmeta"
});
}