]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/transaction_manager: TransactionManager::alloc_extent(s) may...
authorXuehan Xu <xuxuehan@qianxin.com>
Mon, 6 Nov 2023 10:33:01 +0000 (18:33 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Mon, 5 Feb 2024 08:27:50 +0000 (16:27 +0800)
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/common/errorator.h
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/collection_manager/flat_collection_manager.cc
src/crimson/os/seastore/extent_placement_manager.h
src/crimson/os/seastore/object_data_handler.cc
src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.cc
src/crimson/os/seastore/omap_manager/btree/omap_btree_node_impl.cc
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.h
src/crimson/os/seastore/random_block_manager/block_rb_manager.cc
src/crimson/os/seastore/transaction_manager.h
src/test/crimson/seastore/test_transaction_manager.cc

index c5d63d5b9c1d55252ba912359ff76241e95c656d..656af5813560f165b9ad8f6b96e4c60b685997ba 100644 (file)
@@ -200,6 +200,23 @@ struct unthrowable_wrapper : error_t<unthrowable_wrapper<ErrorT, ErrorV>> {
     }
   };
 
+  class assert_failure {
+    const char* const msg = nullptr;
+  public:
+    template <std::size_t N>
+    assert_failure(const char (&msg)[N])
+      : msg(msg) {
+    }
+    assert_failure() = default;
+
+    void operator()(const unthrowable_wrapper&) {
+      if (msg) {
+        ceph_abort(msg);
+      } else {
+        ceph_abort();
+      }
+    }
+  };
 
 private:
   // can be used only to initialize the `instance` member
index a6aeb357148f443d2b4da510ca237bc6c1338fb6..75463f465fe14c7d68b38701906d8851ab76973e 100644 (file)
@@ -884,17 +884,20 @@ public:
 #else
     auto result = epm.alloc_new_non_data_extent(t, T::TYPE, length, hint, gen);
 #endif
-    auto ret = CachedExtent::make_cached_extent_ref<T>(std::move(result.bp));
+    if (!result) {
+      return nullptr;
+    }
+    auto ret = CachedExtent::make_cached_extent_ref<T>(std::move(result->bp));
     ret->init(CachedExtent::extent_state_t::INITIAL_WRITE_PENDING,
-              result.paddr,
+              result->paddr,
               hint,
-              result.gen,
+              result->gen,
              t.get_trans_id());
     t.add_fresh_extent(ret);
     SUBDEBUGT(seastore_cache,
               "allocated {} {}B extent at {}, hint={}, gen={} -- {}",
-              t, T::TYPE, length, result.paddr,
-              hint, rewrite_gen_printer_t{result.gen}, *ret);
+              t, T::TYPE, length, result->paddr,
+              hint, rewrite_gen_printer_t{result->gen}, *ret);
     return ret;
   }
   /**
index 81353655694ee98912b338b7ff79c018a805fbdd..c32dc66619a0792ee62611ca7e19d05698760f4c 100644 (file)
@@ -88,7 +88,10 @@ FlatCollectionManager::create(coll_root_t &coll_root, Transaction &t,
          }).si_then([] (auto) {
             return create_iertr::make_ready_future<>();
           });
-        });
+        }).handle_error_interruptible(
+         crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+         create_iertr::pass_further{}
+       );
       }
       case CollectionNode::create_result_t::SUCCESS: {
         return create_iertr::make_ready_future<>();
index 70dbc428d10bf405e7947243e1fb21da13726d5b..b1a4de2ef457a83ac82a503927664befe2ed2013 100644 (file)
@@ -279,7 +279,7 @@ public:
     bufferptr bp;
     rewrite_gen_t gen;
   };
-  alloc_result_t alloc_new_non_data_extent(
+  std::optional<alloc_result_t> alloc_new_non_data_extent(
     Transaction& t,
     extent_types_t type,
     extent_len_t length,
@@ -298,11 +298,6 @@ public:
     data_category_t category = get_extent_category(type);
     gen = adjust_generation(category, type, hint, gen);
 
-    // XXX: bp might be extended to point to different memory (e.g. PMem)
-    // according to the allocator.
-    auto bp = ceph::bufferptr(
-      buffer::create_page_aligned(length));
-    bp.zero();
     paddr_t addr;
 #ifdef UNIT_TESTS_BUILT
     if (unlikely(external_paddr.has_value())) {
@@ -320,7 +315,18 @@ public:
          generation_to_writer(gen)]->alloc_paddr(length);
     }
     assert(!(category == data_category_t::DATA));
-    return {addr, std::move(bp), gen};
+
+    if (addr.is_null()) {
+      return std::nullopt;
+    }
+
+    // XXX: bp might be extended to point to different memory (e.g. PMem)
+    // according to the allocator.
+    auto bp = ceph::bufferptr(
+      buffer::create_page_aligned(length));
+    bp.zero();
+
+    return alloc_result_t{addr, std::move(bp), gen};
   }
 
   std::list<alloc_result_t> alloc_new_data_extents(
index 5e49a48a18809cf0ed120805ca9d73dd5f088020..39c0be33d6de4cf28f1855ab392c7ed118afe8ba 100644 (file)
@@ -543,7 +543,10 @@ ObjectDataHandler::write_ret do_insertions(
          auto iter = region.bl->cbegin();
          iter.copy(region.len, extent->get_bptr().c_str());
          return ObjectDataHandler::write_iertr::now();
-       });
+       }).handle_error_interruptible(
+         crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+         ObjectDataHandler::write_iertr::pass_further{}
+       );
       } else if (region.is_zero()) {
        DEBUGT("reserving: {}~{}",
               ctx.t,
@@ -564,7 +567,10 @@ ObjectDataHandler::write_ret do_insertions(
          }
          ceph_assert(pin->get_key() == region.addr);
          return ObjectDataHandler::write_iertr::now();
-       });
+       }).handle_error_interruptible(
+         crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+         ObjectDataHandler::write_iertr::pass_further{}
+       );
       } else {
        ceph_abort("impossible");
        return ObjectDataHandler::write_iertr::now();
@@ -1057,7 +1063,10 @@ ObjectDataHandler::write_ret ObjectDataHandler::prepare_data_reservation(
        pin->get_key(),
        pin->get_length());
       return write_iertr::now();
-    });
+    }).handle_error_interruptible(
+      crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+      write_iertr::pass_further{}
+    );
   }
 }
 
@@ -1677,12 +1686,12 @@ ObjectDataHandler::clone_ret ObjectDataHandler::clone_extents(
          return TransactionManager::reserve_extent_iertr::now();
        });
       });
-    },
+    }
+  ).handle_error_interruptible(
     ObjectDataHandler::write_iertr::pass_further{},
     crimson::ct_error::assert_all{
       "object_data_handler::clone invalid error"
-    }
-  );
+  });
 }
 
 ObjectDataHandler::clone_ret ObjectDataHandler::clone(
index c182965764eecd10b11b8ff70bac83976ec6591d..046cc286208b2286a0489c613639293077f5ccf5 100644 (file)
@@ -32,7 +32,10 @@ BtreeOMapManager::initialize_omap(Transaction &t, laddr_t hint)
       t.get_omap_tree_stats().depth = 1u;
       t.get_omap_tree_stats().extents_num_delta++;
       return initialize_omap_iertr::make_ready_future<omap_root_t>(omap_root);
-  });
+  }).handle_error_interruptible(
+    crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+    TransactionManager::alloc_extent_iertr::pass_further{}
+  );
 }
 
 BtreeOMapManager::get_root_ret
@@ -65,7 +68,10 @@ BtreeOMapManager::handle_root_split(
     oc.t.get_omap_tree_stats().depth = omap_root.depth;
     ++(oc.t.get_omap_tree_stats().extents_num_delta);
     return seastar::now();
-  });
+  }).handle_error_interruptible(
+    crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+    TransactionManager::alloc_extent_iertr::pass_further{}
+  );
 }
 
 BtreeOMapManager::handle_root_merge_ret
index c932f6d590c10e5833e3134560e6e856672a2c8a..96a1e3bdefe7e2d2231b634cb2d8271595c127e8 100644 (file)
@@ -338,7 +338,10 @@ OMapInnerNode:: make_split_children(omap_context_t oc)
       return split_children_ret(
              interruptible::ready_future_marker{},
              std::make_tuple(left, right, split_into(*left, *right)));
-  });
+  }).handle_error_interruptible(
+    crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+    split_children_iertr::pass_further{}
+  );
 }
 
 OMapInnerNode::full_merge_ret
@@ -353,7 +356,10 @@ OMapInnerNode::make_full_merge(omap_context_t oc, OMapNodeRef right)
       return full_merge_ret(
         interruptible::ready_future_marker{},
         std::move(replacement));
-  });
+  }).handle_error_interruptible(
+    crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+    full_merge_iertr::pass_further{}
+  );
 }
 
 OMapInnerNode::make_balanced_ret
@@ -373,7 +379,10 @@ OMapInnerNode::make_balanced(omap_context_t oc, OMapNodeRef _right)
              std::make_tuple(replacement_left, replacement_right,
                              balance_into_new_nodes(*this, right,
                                *replacement_left, *replacement_right)));
-  });
+  }).handle_error_interruptible(
+    crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+    make_balanced_iertr::pass_further{}
+  );
 }
 
 OMapInnerNode::merge_entry_ret
@@ -670,7 +679,10 @@ OMapLeafNode::make_split_children(omap_context_t oc)
       return split_children_ret(
              interruptible::ready_future_marker{},
              std::make_tuple(left, right, split_into(*left, *right)));
-  });
+  }).handle_error_interruptible(
+    crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+    split_children_iertr::pass_further{}
+  );
 }
 
 OMapLeafNode::full_merge_ret
@@ -685,7 +697,10 @@ OMapLeafNode::make_full_merge(omap_context_t oc, OMapNodeRef right)
       return full_merge_ret(
         interruptible::ready_future_marker{},
         std::move(replacement));
-  });
+  }).handle_error_interruptible(
+    crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+    full_merge_iertr::pass_further{}
+  );
 }
 
 OMapLeafNode::make_balanced_ret
@@ -706,7 +721,10 @@ OMapLeafNode::make_balanced(omap_context_t oc, OMapNodeRef _right)
                balance_into_new_nodes(
                  *this, right,
                  *replacement_left, *replacement_right)));
-  });
+  }).handle_error_interruptible(
+    crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+    make_balanced_iertr::pass_further{}
+  );
 }
 
 
index cff67f9cf51f8eac0c2b3bf104f08343b4682f85..fb8fe54271d3ecf158361e3608a9370cf95b5528 100644 (file)
@@ -145,7 +145,10 @@ class SeastoreNodeExtentManager final: public TransactionManagerHandle {
       assert(extent->get_length() == len);
       std::ignore = len;
       return NodeExtentRef(extent);
-    });
+    }).handle_error_interruptible(
+      crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+      alloc_iertr::pass_further{}
+    );
   }
 
   retire_iertr::future<> retire_extent(
index 6bae96f84a5ad4385d075b2ba764a2d27ca92815..cca520a9bfea36e27b992a5d63a3585864fccfec 100644 (file)
@@ -51,6 +51,9 @@ paddr_t BlockRBManager::alloc_extent(size_t size)
   LOG_PREFIX(BlockRBManager::alloc_extent);
   assert(allocator);
   auto alloc = allocator->alloc_extent(size);
+  if (!alloc) {
+    return P_ADDR_NULL;
+  }
   ceph_assert((*alloc).num_intervals() == 1);
   auto extent = (*alloc).begin();
   ceph_assert(size == extent.get_len());
index 4bacd78fe60b473d0997300416967214d89f3616..7720469c28215668423348faca6fc8ea4eb702e9 100644 (file)
@@ -284,7 +284,8 @@ public:
    * Allocates a new block of type T with the minimum lba range of size len
    * greater than laddr_hint.
    */
-  using alloc_extent_iertr = LBAManager::alloc_extent_iertr;
+  using alloc_extent_iertr = LBAManager::alloc_extent_iertr::extend<
+    crimson::ct_error::enospc>;
   template <typename T>
   using alloc_extent_ret = alloc_extent_iertr::future<TCachedExtentRef<T>>;
   template <typename T>
@@ -302,6 +303,9 @@ public:
       len,
       placement_hint,
       INIT_GENERATION);
+    if (!ext) {
+      return crimson::ct_error::enospc::make();
+    }
     return lba_manager->alloc_extent(
       t,
       laddr_hint,
@@ -341,6 +345,9 @@ public:
       len,
       placement_hint,
       INIT_GENERATION);
+    if (exts.empty()) {
+      return crimson::ct_error::enospc::make();
+    }
     return seastar::do_with(
       std::move(exts),
       laddr_hint,
index c33c9ffce4bc50ca2098d8f36054b6c3afa2ca28..378644dafa8404a39ae46fc056502e897c982a55 100644 (file)
@@ -1135,7 +1135,10 @@ struct transaction_manager_test_t :
                     std::move(lpin), std::move(ext), std::move(rpin)));
             });
           });
-        });
+        }).handle_error_interruptible(
+         crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+         crimson::ct_error::pass_further_all{}
+       );
       });
     } else if (new_offset == 0 && o_len != new_offset + new_len) {
       return tm->remap_pin<TestBlock, 1>(
@@ -1164,7 +1167,10 @@ struct transaction_manager_test_t :
                   nullptr, std::move(ext), std::move(rpin)));
           });
         });
-      });
+      }).handle_error_interruptible(
+       crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+       crimson::ct_error::pass_further_all{}
+      );
     } else if (new_offset != 0 && o_len == new_offset + new_len) {
       return tm->remap_pin<TestBlock, 1>(
         t,
@@ -1191,7 +1197,10 @@ struct transaction_manager_test_t :
                   std::move(lpin), std::move(ext), nullptr));
           });
         });
-      });
+      }).handle_error_interruptible(
+       crimson::ct_error::enospc::assert_failure{"unexpected enospc"},
+       crimson::ct_error::pass_further_all{}
+      );
     } else {
       ceph_abort("impossible");
         return _overwrite_pin_iertr::make_ready_future<