no need for sm_disk and sm_metadata subclasses now
This commit is contained in:
parent
0bd9aa33bf
commit
4db58e0294
@ -212,13 +212,13 @@ namespace {
|
|||||||
|
|
||||||
unsigned const ENTRIES_PER_BLOCK = (MD_BLOCK_SIZE - sizeof(bitmap_header)) * 4;
|
unsigned const ENTRIES_PER_BLOCK = (MD_BLOCK_SIZE - sizeof(bitmap_header)) * 4;
|
||||||
|
|
||||||
class sm_disk_base : public checked_space_map {
|
class sm_disk : public checked_space_map {
|
||||||
public:
|
public:
|
||||||
typedef boost::shared_ptr<sm_disk_base> ptr;
|
typedef boost::shared_ptr<sm_disk> ptr;
|
||||||
typedef transaction_manager::read_ref read_ref;
|
typedef transaction_manager::read_ref read_ref;
|
||||||
typedef transaction_manager::write_ref write_ref;
|
typedef transaction_manager::write_ref write_ref;
|
||||||
|
|
||||||
sm_disk_base(index_store::ptr indexes,
|
sm_disk(index_store::ptr indexes,
|
||||||
transaction_manager::ptr tm)
|
transaction_manager::ptr tm)
|
||||||
: tm_(tm),
|
: tm_(tm),
|
||||||
indexes_(indexes),
|
indexes_(indexes),
|
||||||
@ -227,7 +227,7 @@ namespace {
|
|||||||
ref_counts_(tm_, ref_count_traits::ref_counter()) {
|
ref_counts_(tm_, ref_count_traits::ref_counter()) {
|
||||||
}
|
}
|
||||||
|
|
||||||
sm_disk_base(index_store::ptr indexes,
|
sm_disk(index_store::ptr indexes,
|
||||||
transaction_manager::ptr tm,
|
transaction_manager::ptr tm,
|
||||||
sm_root const &root)
|
sm_root const &root)
|
||||||
: tm_(tm),
|
: tm_(tm),
|
||||||
@ -348,7 +348,7 @@ namespace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct look_aside_iterator : public iterator {
|
struct look_aside_iterator : public iterator {
|
||||||
look_aside_iterator(sm_disk_base const &smd, iterator &it)
|
look_aside_iterator(sm_disk const &smd, iterator &it)
|
||||||
: smd_(smd),
|
: smd_(smd),
|
||||||
it_(it) {
|
it_(it) {
|
||||||
}
|
}
|
||||||
@ -357,7 +357,7 @@ namespace {
|
|||||||
it_(b, c == 3 ? smd_.lookup_ref_count(b) : c);
|
it_(b, c == 3 ? smd_.lookup_ref_count(b) : c);
|
||||||
}
|
}
|
||||||
|
|
||||||
sm_disk_base const &smd_;
|
sm_disk const &smd_;
|
||||||
iterator &it_;
|
iterator &it_;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -386,10 +386,10 @@ namespace {
|
|||||||
if (len < sizeof(d))
|
if (len < sizeof(d))
|
||||||
throw runtime_error("root too small");
|
throw runtime_error("root too small");
|
||||||
|
|
||||||
v.nr_blocks_ = sm_disk_base::get_nr_blocks();
|
v.nr_blocks_ = sm_disk::get_nr_blocks();
|
||||||
v.nr_allocated_ = sm_disk_base::get_nr_allocated();
|
v.nr_allocated_ = sm_disk::get_nr_allocated();
|
||||||
v.bitmap_root_ = get_index_store()->get_root();
|
v.bitmap_root_ = get_index_store()->get_root();
|
||||||
v.ref_count_root_ = sm_disk_base::get_ref_count_root();
|
v.ref_count_root_ = sm_disk::get_ref_count_root();
|
||||||
|
|
||||||
sm_root_traits::pack(v, d);
|
sm_root_traits::pack(v, d);
|
||||||
::memcpy(dest, &d, sizeof(d));
|
::memcpy(dest, &d, sizeof(d));
|
||||||
@ -577,20 +577,6 @@ namespace {
|
|||||||
btree<1, index_entry_traits> bitmaps_;
|
btree<1, index_entry_traits> bitmaps_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class sm_disk : public sm_disk_base {
|
|
||||||
public:
|
|
||||||
typedef boost::shared_ptr<sm_disk> ptr;
|
|
||||||
|
|
||||||
sm_disk(transaction_manager::ptr tm)
|
|
||||||
: sm_disk_base(index_store::ptr(new btree_index_store(tm)), tm) {
|
|
||||||
}
|
|
||||||
|
|
||||||
sm_disk(transaction_manager::ptr tm,
|
|
||||||
sm_root const &root)
|
|
||||||
: sm_disk_base(index_store::ptr(new btree_index_store(tm, root.bitmap_root_)), tm, root) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class metadata_index_store : public index_store {
|
class metadata_index_store : public index_store {
|
||||||
public:
|
public:
|
||||||
typedef boost::shared_ptr<metadata_index_store> ptr;
|
typedef boost::shared_ptr<metadata_index_store> ptr;
|
||||||
@ -642,6 +628,7 @@ namespace {
|
|||||||
virtual void check(block_counter &counter, block_address nr_index_entries) const {
|
virtual void check(block_counter &counter, block_address nr_index_entries) const {
|
||||||
counter.inc(bitmap_root_);
|
counter.inc(bitmap_root_);
|
||||||
for (unsigned i = 0; i < entries_.size(); i++)
|
for (unsigned i = 0; i < entries_.size(); i++)
|
||||||
|
// FIXME: this looks like a hack
|
||||||
if (entries_[i].blocknr_ != 0) // superblock
|
if (entries_[i].blocknr_ != 0) // superblock
|
||||||
counter.inc(entries_[i].blocknr_);
|
counter.inc(entries_[i].blocknr_);
|
||||||
}
|
}
|
||||||
@ -660,26 +647,6 @@ namespace {
|
|||||||
block_address bitmap_root_;
|
block_address bitmap_root_;
|
||||||
std::vector<index_entry> entries_;
|
std::vector<index_entry> entries_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class sm_metadata : public sm_disk_base {
|
|
||||||
public:
|
|
||||||
typedef boost::shared_ptr<sm_metadata> ptr;
|
|
||||||
|
|
||||||
sm_metadata(transaction_manager::ptr tm)
|
|
||||||
: sm_disk_base(index_store::ptr(new metadata_index_store(tm)), tm) {
|
|
||||||
}
|
|
||||||
|
|
||||||
sm_metadata(transaction_manager::ptr tm,
|
|
||||||
sm_root const &root)
|
|
||||||
: sm_disk_base(mk_index_store(tm, root.bitmap_root_, root.nr_blocks_), tm, root) {
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
index_store::ptr mk_index_store(transaction_manager::ptr tm, block_address root, block_address nr_blocks) const {
|
|
||||||
block_address nr_indexes = div_up<block_address>(nr_blocks, ENTRIES_PER_BLOCK);
|
|
||||||
return index_store::ptr(new metadata_index_store(tm, root, nr_indexes));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------
|
//----------------------------------------------------------------
|
||||||
@ -688,7 +655,8 @@ checked_space_map::ptr
|
|||||||
persistent_data::create_disk_sm(transaction_manager::ptr tm,
|
persistent_data::create_disk_sm(transaction_manager::ptr tm,
|
||||||
block_address nr_blocks)
|
block_address nr_blocks)
|
||||||
{
|
{
|
||||||
checked_space_map::ptr sm(new sm_disk(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->extend(nr_blocks);
|
||||||
return sm;
|
return sm;
|
||||||
}
|
}
|
||||||
@ -701,13 +669,15 @@ persistent_data::open_disk_sm(transaction_manager::ptr tm, void *root)
|
|||||||
|
|
||||||
::memcpy(&d, root, sizeof(d));
|
::memcpy(&d, root, sizeof(d));
|
||||||
sm_root_traits::unpack(d, v);
|
sm_root_traits::unpack(d, v);
|
||||||
return checked_space_map::ptr(new sm_disk(tm, v));
|
index_store::ptr store(new btree_index_store(tm, v.bitmap_root_));
|
||||||
|
return checked_space_map::ptr(new sm_disk(store, tm, v));
|
||||||
}
|
}
|
||||||
|
|
||||||
checked_space_map::ptr
|
checked_space_map::ptr
|
||||||
persistent_data::create_metadata_sm(transaction_manager::ptr tm, block_address nr_blocks)
|
persistent_data::create_metadata_sm(transaction_manager::ptr tm, block_address nr_blocks)
|
||||||
{
|
{
|
||||||
checked_space_map::ptr sm(new sm_metadata(tm));
|
index_store::ptr store(new metadata_index_store(tm));
|
||||||
|
checked_space_map::ptr sm(new sm_disk(store, tm));
|
||||||
sm->extend(nr_blocks);
|
sm->extend(nr_blocks);
|
||||||
return create_recursive_sm(sm);
|
return create_recursive_sm(sm);
|
||||||
}
|
}
|
||||||
@ -720,8 +690,9 @@ persistent_data::open_metadata_sm(transaction_manager::ptr tm, void *root)
|
|||||||
|
|
||||||
::memcpy(&d, root, sizeof(d));
|
::memcpy(&d, root, sizeof(d));
|
||||||
sm_root_traits::unpack(d, v);
|
sm_root_traits::unpack(d, v);
|
||||||
|
block_address nr_indexes = div_up<block_address>(v.nr_blocks_, ENTRIES_PER_BLOCK);
|
||||||
return create_recursive_sm(checked_space_map::ptr(new sm_metadata(tm, v)));
|
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)));
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------
|
//----------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user