BtreeLBAManager::refresh_lba_mapping_ret
BtreeLBAManager::refresh_lba_mapping(Transaction &t, LBAMapping mapping)
{
- assert(mapping.is_linked_direct());
if (mapping.is_viewable()) {
return refresh_lba_mapping_iertr::make_ready_future<
LBAMapping>(std::move(mapping));
std::move(mapping),
[c, this](LBABtree &btree, LBAMapping &mapping) mutable
{
- return refresh_lba_cursor(c, btree, *mapping.direct_cursor
- ).si_then([c, this, &btree, &mapping] {
+ return seastar::futurize_invoke([c, this, &btree, &mapping] {
+ if (mapping.direct_cursor) {
+ return refresh_lba_cursor(c, btree, *mapping.direct_cursor);
+ }
+ return refresh_lba_cursor_iertr::make_ready_future();
+ }).si_then([c, this, &btree, &mapping] {
if (mapping.indirect_cursor) {
return refresh_lba_cursor(c, btree, *mapping.indirect_cursor);
}
std::ostream &operator<<(std::ostream &out, const LBAMapping &rhs)
{
out << "LBAMapping(" << rhs.get_key()
- << "~0x" << std::hex << rhs.get_length() << std::dec
- << "->" << rhs.get_val();
- if (rhs.is_indirect()) {
+ << "~0x" << std::hex << rhs.get_length();
+ if (rhs.is_complete()) {
+ out << std::dec
+ << "->" << rhs.get_val();
+ } else {
+ out << std::dec << "->" << rhs.indirect_cursor->val;
+ }
+ if (rhs.is_complete_indirect()) {
out << ",indirect(" << rhs.get_intermediate_base()
<< "~0x" << std::hex << rhs.get_intermediate_length()
<< "@0x" << rhs.get_intermediate_offset() << std::dec
: direct_cursor(std::move(direct)),
indirect_cursor(std::move(indirect))
{
- assert(is_linked_direct());
- assert(!direct_cursor->is_indirect());
+ assert(!is_linked_direct() || !direct_cursor->is_indirect());
assert(!indirect_cursor || indirect_cursor->is_indirect());
}
}
bool is_indirect() const {
- assert(is_linked_direct());
+ assert(!is_null());
return (bool)indirect_cursor;
}
bool is_viewable() const {
- assert(is_linked_direct());
- return direct_cursor->is_viewable()
- && (!indirect_cursor || indirect_cursor->is_viewable());
+ assert(!is_null());
+ return is_indirect()
+ ? indirect_cursor->is_viewable()
+ : direct_cursor->is_viewable();
}
// For reserved mappings, the return values are
}
extent_len_t get_length() const {
- assert(is_linked_direct());
+ assert(!is_null());
if (is_indirect()) {
return indirect_cursor->get_length();
}
}
laddr_t get_key() const {
- assert(is_linked_direct());
+ assert(!is_null());
if (is_indirect()) {
return indirect_cursor->get_laddr();
}
};
return LBAMapping(dup_iter(direct_cursor), dup_iter(indirect_cursor));
}
-
private:
friend lba::BtreeLBAManager;
+ friend class TransactionManager;
+ friend std::ostream &operator<<(std::ostream&, const LBAMapping&);
+
+ LBACursor& get_effective_cursor() {
+ if (is_indirect()) {
+ return *indirect_cursor;
+ }
+ return *direct_cursor;
+ }
+
+ bool is_null() const {
+ return !indirect_cursor && !direct_cursor;
+ }
+
+ bool is_complete_indirect() const {
+ assert(!is_null());
+ return (bool)indirect_cursor && (bool)direct_cursor;
+ }
+
+ bool is_complete() const {
+ return !is_indirect() || is_complete_indirect();
+ }
// To support cloning, there are two kinds of lba mappings:
// 1. direct lba mapping: the pladdr in the value of which is the paddr of