diff --git a/space_map_disk.cc b/space_map_disk.cc index 287a97c..a8090a7 100644 --- a/space_map_disk.cc +++ b/space_map_disk.cc @@ -5,6 +5,7 @@ #include "math_utils.h" #include "space_map_disk_structures.h" #include "space_map_recursive.h" +#include "space_map_transactional.h" #include "transaction_manager.h" using namespace boost; @@ -661,6 +662,7 @@ persistent_data::create_disk_sm(transaction_manager::ptr tm, index_store::ptr store(new btree_index_store(tm)); checked_space_map::ptr sm(new sm_disk(store, tm)); sm->extend(nr_blocks); + sm->commit(); return sm; } @@ -682,7 +684,9 @@ persistent_data::create_metadata_sm(transaction_manager::ptr tm, block_address n index_store::ptr store(new metadata_index_store(tm)); checked_space_map::ptr sm(new sm_disk(store, tm)); sm->extend(nr_blocks); - return create_recursive_sm(sm); + sm->commit(); + return create_transactional_sm( + create_recursive_sm(sm)); } checked_space_map::ptr @@ -695,7 +699,9 @@ persistent_data::open_metadata_sm(transaction_manager::ptr tm, void *root) sm_root_traits::unpack(d, v); block_address nr_indexes = div_up(v.nr_blocks_, ENTRIES_PER_BLOCK); index_store::ptr store(new metadata_index_store(tm, v.bitmap_root_, nr_indexes)); - return create_recursive_sm(checked_space_map::ptr(new sm_disk(store, tm, v))); + return create_transactional_sm( + create_recursive_sm( + checked_space_map::ptr(new sm_disk(store, tm, v)))); } //---------------------------------------------------------------- diff --git a/space_map_transactional.cc b/space_map_transactional.cc index dfbec48..cdf5a4f 100644 --- a/space_map_transactional.cc +++ b/space_map_transactional.cc @@ -55,7 +55,7 @@ namespace { if (end <= search_start_) return maybe_block(); - maybe_block mb = sm_->new_block(max(search_start_, begin), end); + maybe_block mb = committed_->new_block(max(search_start_, begin), end); if (mb) { allocated_++; search_start_ = *mb + 1; @@ -73,6 +73,10 @@ namespace { return sm_->extend(extra_blocks); } + virtual void iterate(iterator &it) const { + sm_->iterate(it); + } + virtual size_t root_size() const { return sm_->root_size(); } @@ -81,6 +85,10 @@ namespace { return sm_->copy_root(dest, len); } + virtual void check(block_counter &counter) const { + return sm_->check(counter); + } + virtual checked_space_map::ptr clone() const { return checked_space_map::ptr(new sm_transactional(sm_)); } @@ -93,4 +101,13 @@ namespace { }; } +//---------------------------------------------------------------- + +checked_space_map::ptr +persistent_data::create_transactional_sm(checked_space_map::ptr sm) +{ + return checked_space_map::ptr(new sm_transactional(sm)); +} + + //----------------------------------------------------------------