static_assert((... && contains_once_v<AllowedErrors>),
"no error type in errorator can be duplicated");
+ struct ready_future_marker{};
+
private:
// see the comment for `using future = _future` below.
template <class>
: base_t(std::move(base)) {
}
+ template <class... A>
+ [[gnu::always_inline]]
+ _future(ready_future_marker, A&&... a)
+ : base_t(::seastar::make_ready_future<ValuesT...>(std::forward<A>(a)...)) {
+ }
+
template <template <class...> class ErroratedFuture,
class = std::void_t<
typename ErroratedFuture<
using type = errorator<AllowedErrors...>;
};
+ template <typename... T, typename... A>
+ static future<T...> make_ready_future(A&&... value) {
+ return future<T...>(ready_future_marker(), std::forward<A>(value)...);
+ }
+
+ static auto now() {
+ return make_ready_future<>();
+ }
+
private:
template <class T, class = std::void_t<T>>
class futurize {
return crimson::ct_error::enoent::make();
}
if (offset >= o->get_size())
- return seastar::make_ready_future<ceph::bufferlist>();
+ return read_errorator::make_ready_future<ceph::bufferlist>();
size_t l = len;
if (l == 0 && offset == 0) // note: len == 0 means read the entire object
l = o->get_size();
else if (offset + l > o->get_size())
l = o->get_size() - offset;
- return seastar::make_ready_future<ceph::bufferlist>(o->read(offset, l));
+ return read_errorator::make_ready_future<ceph::bufferlist>(o->read(offset, l));
}
CyanStore::get_attr_errorator::future<ceph::bufferptr> CyanStore::get_attr(
return crimson::ct_error::enoent::make();
}
if (auto found = o->xattr.find(name); found != o->xattr.end()) {
- return seastar::make_ready_future<ceph::bufferptr>(found->second);
+ return get_attr_errorator::make_ready_future<ceph::bufferptr>(found->second);
} else {
return crimson::ct_error::enodata::make();
}
[&osd_op](ceph::bufferlist&& bl) {
osd_op.rval = bl.length();
osd_op.outdata = std::move(bl);
- return seastar::now();
+ return osd_op_errorator::now();
});
});
case CEPH_OSD_OP_GETXATTR:
return backend.writefull(os, osd_op, txn);
});
case CEPH_OSD_OP_SETALLOCHINT:
- return seastar::now();
+ return osd_op_errorator::now();
case CEPH_OSD_OP_SETXATTR:
return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
return backend.setxattr(os, osd_op, txn);
return backend.omap_get_vals_by_keys(os, osd_op);
});
case CEPH_OSD_OP_OMAPSETVALS:
+#if 0
if (!pg.get_pool().info.supports_omap()) {
return crimson::ct_error::operation_not_supported::make();
}
+#endif
return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
return backend.omap_set_vals(os, osd_op, txn);
});
case CEPH_OSD_OP_WATCH:
return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
logger().warn("CEPH_OSD_OP_WATCH is not implemented yet; ignoring");
- return seastar::now();
+ return osd_op_errorator::now();
});
default:
// decode existing OI_ATTR's value
ceph::bufferlist bl;
bl.push_back(std::move(bp));
- return seastar::make_ready_future<cached_os_t>(
+ return get_os_errorator::make_ready_future<cached_os_t>(
os_cache.insert(oid,
std::make_unique<ObjectState>(object_info_t{bl}, true /* exists */)));
}, crimson::errorator<crimson::ct_error::enoent,
crimson::ct_error::enodata>::all_same_way([oid, this] {
- return seastar::make_ready_future<cached_os_t>(
+ return get_os_errorator::make_ready_future<cached_os_t>(
os_cache.insert(oid,
std::make_unique<ObjectState>(object_info_t{oid}, false)));
}));
// decode existing SS_ATTR's value
ceph::bufferlist bl;
bl.push_back(std::move(bp));
- return seastar::make_ready_future<cached_ss_t>(
+ return get_os_errorator::make_ready_future<cached_ss_t>(
ss_cache.insert(oid, std::make_unique<SnapSet>(bl)));
}, crimson::errorator<crimson::ct_error::enoent,
crimson::ct_error::enodata>::all_same_way([oid, this] {
// `get_attr_errorator::all_same_way(...)`.
// however, this way is more explicit and resilient to unexpected
// changes in the alias definition.
- return seastar::make_ready_future<cached_ss_t>(
+ return get_os_errorator::make_ready_future<cached_ss_t>(
ss_cache.insert(oid, std::make_unique<SnapSet>()));
}));
}
}
if (offset >= size) {
// read size was trimmed to zero and it is expected to do nothing,
- return seastar::make_ready_future<bufferlist>();
+ return read_errorator::make_ready_future<bufferlist>();
}
return _read(oi.soid, offset, length, flags).safe_then(
[&oi](auto&& bl) -> read_errorator::future<ceph::bufferlist> {
if (const bool is_fine = _read_verify_data(oi, bl); is_fine) {
- return seastar::make_ready_future<bufferlist>(std::move(bl));
+ return read_errorator::make_ready_future<bufferlist>(std::move(bl));
} else {
return crimson::ct_error::object_corrupted::make();
}
logger().debug("stat object does not exist");
return crimson::ct_error::enoent::make();
}
- return seastar::now();
+ return stat_errorator::now();
// TODO: ctx->delta_stats.num_rd++;
}
osd_op.outdata.clear();
osd_op.outdata.push_back(std::move(val));
osd_op.op.xattr.value_len = osd_op.outdata.length();
- return seastar::now();
+ return get_attr_errorator::now();
//ctx->delta_stats.num_rd_kb += shift_round_up(osd_op.outdata.length(), 10);
});
//ctx->delta_stats.num_rd++;