2323#include " crimson/os/seastore/logging.h"
2424#include " crimson/os/seastore/seastore_types.h"
2525#include " crimson/os/seastore/cache.h"
26+ #include " crimson/os/seastore/root_meta.h"
2627#include " crimson/os/seastore/lba_manager.h"
2728#include " crimson/os/seastore/backref_manager.h"
2829#include " crimson/os/seastore/journal.h"
@@ -303,10 +304,6 @@ class TransactionManager : public ExtentCallbackInterface {
303304 len,
304305 placement_hint,
305306 INIT_GENERATION);
306- if (!ext) {
307- SUBERRORT (seastore_tm, " insufficient space!" , t);
308- return crimson::ct_error::enospc::make ();
309- }
310307 return lba_manager->alloc_extent (
311308 t,
312309 laddr_hint,
@@ -342,10 +339,6 @@ class TransactionManager : public ExtentCallbackInterface {
342339 len,
343340 placement_hint,
344341 INIT_GENERATION);
345- if (exts.empty ()) {
346- SUBERRORT (seastore_tm, " insufficient space!" , t);
347- return crimson::ct_error::enospc::make ();
348- }
349342 return lba_manager->alloc_extents (
350343 t,
351344 laddr_hint,
@@ -690,9 +683,11 @@ class TransactionManager : public ExtentCallbackInterface {
690683 const std::string &key) {
691684 return cache->get_root (
692685 t
693- ).si_then ([&key, &t](auto root) {
686+ ).si_then ([&t, this ](auto root) {
687+ return read_extent<RootMetaBlock>(t, root->root .meta );
688+ }).si_then ([key, &t](auto mblock) {
694689 LOG_PREFIX (TransactionManager::read_root_meta);
695- auto meta = root-> root . get_meta ();
690+ auto meta = mblock-> get_meta ();
696691 auto iter = meta.find (key);
697692 if (iter == meta.end ()) {
698693 SUBDEBUGT (seastore_tm, " {} -> nullopt" , t, key);
@@ -701,7 +696,35 @@ class TransactionManager : public ExtentCallbackInterface {
701696 SUBDEBUGT (seastore_tm, " {} -> {}" , t, key, iter->second );
702697 return seastar::make_ready_future<read_root_meta_bare>(iter->second );
703698 }
704- });
699+ }).handle_error_interruptible (
700+ crimson::ct_error::input_output_error::pass_further{},
701+ crimson::ct_error::assert_all{" unexpected error!" }
702+ );
703+ }
704+
705+ /* *
706+ * init_root_meta
707+ *
708+ * create the root meta block
709+ */
710+ using init_root_meta_iertr = base_iertr;
711+ using init_root_meta_ret = init_root_meta_iertr::future<>;
712+ init_root_meta_ret init_root_meta (Transaction &t) {
713+ return alloc_non_data_extent<RootMetaBlock>(
714+ t, L_ADDR_MIN, RootMetaBlock::SIZE
715+ ).si_then ([this , &t](auto meta) {
716+ meta->set_meta (RootMetaBlock::meta_t {});
717+ return cache->get_root (t
718+ ).si_then ([this , &t, meta](auto root) {
719+ auto mroot = cache->duplicate_for_write (
720+ t, root)->template cast <RootBlock>();
721+ mroot->root .meta = meta->get_laddr ();
722+ return seastar::now ();
723+ });
724+ }).handle_error_interruptible (
725+ crimson::ct_error::input_output_error::pass_further{},
726+ crimson::ct_error::assert_all{" unexpected error!" }
727+ );
705728 }
706729
707730 /* *
@@ -719,15 +742,21 @@ class TransactionManager : public ExtentCallbackInterface {
719742 SUBDEBUGT (seastore_tm, " seastore_tm, {} -> {} ..." , t, key, value);
720743 return cache->get_root (
721744 t
722- ).si_then ([this , &t, &key, &value](RootBlockRef root) {
723- root = cache->duplicate_for_write (t, root)->cast <RootBlock>();
745+ ).si_then ([this , &t](RootBlockRef root) {
746+ return read_extent<RootMetaBlock>(t, root->root .meta );
747+ }).si_then ([this , key, value, &t](auto mblock) {
748+ mblock = get_mutable_extent (t, mblock
749+ )->template cast <RootMetaBlock>();
724750
725- auto meta = root-> root . get_meta ();
751+ auto meta = mblock-> get_meta ();
726752 meta[key] = value;
727753
728- root-> root . set_meta (meta);
754+ mblock-> set_meta (meta);
729755 return seastar::now ();
730- });
756+ }).handle_error_interruptible (
757+ crimson::ct_error::input_output_error::pass_further{},
758+ crimson::ct_error::assert_all{" unexpected error!" }
759+ );
731760 }
732761
733762 /* *
0 commit comments