#include "include/ceph_assert.h"
#include "common/hobject.h"
+#include "crimson/common/errorator.h"
#include "crimson/os/seastore/onode.h"
#include "crimson/os/seastore/seastore_types.h"
-#include "crimson/os/seastore/transaction_manager.h"
#include "crimson/osd/exceptions.h"
namespace crimson::os::seastore {
class OnodeManager {
- using base_ertr = TransactionManager::base_ertr;
+ using base_ertr = crimson::errorator<
+ crimson::ct_error::eagain>;
+
public:
- using mkfs_ertr = TransactionManager::mkfs_ertr;
+ using mkfs_ertr = base_ertr;
using mkfs_ret = mkfs_ertr::future<>;
virtual mkfs_ret mkfs(Transaction &t) = 0;
Transaction &trans,
const ghobject_t &hoid)
{
- return tree.contains(
- trans, hoid
- ).handle_error(
- contains_onode_ertr::pass_further{},
- crimson::ct_error::assert_all{
- "Invalid error in FLTreeOnodeManager::contains_onode"
- }
- );
+ return tree.contains(trans, hoid);
}
FLTreeOnodeManager::get_onode_ret FLTreeOnodeManager::get_onode(
return seastar::make_ready_future<OnodeRef>(
val
);
- }).handle_error(
- get_onode_ertr::pass_further{},
- crimson::ct_error::assert_all{
- "Invalid error in FLTreeOnodeManager::get_onode"
- }
- );
+ });
}
FLTreeOnodeManager::get_or_create_onode_ret
return seastar::make_ready_future<OnodeRef>(
val
);
- }).handle_error(
- get_or_create_onode_ertr::pass_further{},
- crimson::ct_error::assert_all{
- "Invalid error in FLTreeOnodeManager::get_or_create_onode"
- }
- );
+ });
}
FLTreeOnodeManager::get_or_create_onodes_ret
default:
__builtin_unreachable();
}
- }).handle_error(
- write_dirty_ertr::pass_further{},
- crimson::ct_error::assert_all{
- "Invalid error in FLTreeOnodeManager::write_dirty"
- }
- );
+ });
}
FLTreeOnodeManager::erase_onode_ret FLTreeOnodeManager::erase_onode(
std::move(ret));
});
});
- }).handle_error(
- list_onodes_ertr::pass_further{},
- crimson::ct_error::assert_all{
- "Invalid error in FLTreeOnodeManager::list_onodes"
- }
- );
+ });
}
FLTreeOnodeManager::~FLTreeOnodeManager() {}
tm, laddr_t{})) {}
mkfs_ret mkfs(Transaction &t) {
- return tree.mkfs(t
- ).handle_error(
- mkfs_ertr::pass_further{},
- crimson::ct_error::assert_all{
- "Invalid error in FLTreeOnodeManager::mkfs"
- }
- );
+ return tree.mkfs(t);
}
contains_onode_ret contains_onode(
return seastar::do_with(
RetType(),
[this, start, end, limit] (auto& ret) {
- return repeat_eagain([this, start, end, limit, &ret] {
+ return repeat_eagain2([this, start, end, limit, &ret] {
return seastar::do_with(
transaction_manager->create_transaction(),
[this, start, end, limit, &ret] (auto& t) {
ret = std::move(_ret);
});
});
- }).safe_then([&ret] {
+ }).then([&ret] {
return std::move(ret);
});
- }).handle_error(
- crimson::ct_error::assert_all{
- "Invalid error in SeaStore::list_objects"
- }
- );
+ });
}
seastar::future<CollectionRef> SeaStore::create_new_collection(const coll_t& cid)
});
}
+// non-errorated version
+template <typename F>
+auto repeat_eagain2(F &&f) {
+ LOG_PREFIX("repeat_eagain");
+ return seastar::do_with(
+ std::forward<F>(f),
+ [FNAME](auto &f) {
+ return seastar::repeat(
+ [FNAME, &f] {
+ return std::invoke(f
+ ).safe_then([] {
+ return seastar::stop_iteration::yes;
+ }).handle_error(
+ [FNAME](const crimson::ct_error::eagain &e) {
+ DEBUG("hit eagain, restarting");
+ return seastar::make_ready_future<seastar::stop_iteration>(
+ seastar::stop_iteration::no);
+ }
+ );
+ });
+ });
+}
+
/**
* TransactionManager
*