libfoedus-core
FOEDUS Core Library
foedus::storage::masstree::MasstreePage Class Reference

Common base of MasstreeIntermediatePage and MasstreeBorderPage. More...

Detailed Description

Common base of MasstreeIntermediatePage and MasstreeBorderPage.

Do NOT use sizeof on this class because it is smaller than kPageSize. To be a base class of two page types, this class defines only the common properties. Also, as usual, no virtual methods! We just reinterpret byte arrays.

Definition at line 66 of file masstree_page_impl.hpp.

#include <masstree_page_impl.hpp>

Inheritance diagram for foedus::storage::masstree::MasstreePage:
Collaboration diagram for foedus::storage::masstree::MasstreePage:

Public Member Functions

 MasstreePage ()=delete
 
 MasstreePage (const MasstreePage &other)=delete
 
MasstreePageoperator= (const MasstreePage &other)=delete
 
PageHeaderheader ()
 
const PageHeaderheader () const
 
VolatilePagePointer get_volatile_page_id () const
 
SnapshotPagePointer get_snapshot_page_id () const
 
bool is_border () const __attribute__((always_inline))
 
bool is_empty_range () const __attribute__((always_inline))
 An empty-range page, either intermediate or border, never has any entries. More...
 
KeySlice get_low_fence () const __attribute__((always_inline))
 
KeySlice get_high_fence () const __attribute__((always_inline))
 
bool is_high_fence_supremum () const __attribute__((always_inline))
 
bool is_low_fence_infimum () const __attribute__((always_inline))
 
bool is_layer_root () const __attribute__((always_inline))
 
KeySlice get_foster_fence () const __attribute__((always_inline))
 
bool is_foster_minor_null () const __attribute__((always_inline))
 
bool is_foster_major_null () const __attribute__((always_inline))
 
VolatilePagePointer get_foster_minor () const __attribute__((always_inline))
 
VolatilePagePointer get_foster_major () const __attribute__((always_inline))
 
void set_foster_twin (VolatilePagePointer minor, VolatilePagePointer major)
 
void install_foster_twin (VolatilePagePointer minor, VolatilePagePointer major, KeySlice foster_fence)
 
bool within_fences (KeySlice slice) const __attribute__((always_inline))
 
bool within_foster_minor (KeySlice slice) const __attribute__((always_inline))
 
bool within_foster_major (KeySlice slice) const __attribute__((always_inline))
 
bool has_foster_child () const __attribute__((always_inline))
 
uint8_t get_layer () const __attribute__((always_inline))
 Layer-0 stores the first 8 byte slice, Layer-1 next 8 byte... More...
 
uint8_t get_btree_level () const __attribute__((always_inline))
 used only in masstree. More...
 
SlotIndex get_key_count () const __attribute__((always_inline))
 physical key count (those keys might be deleted) in this page. More...
 
void set_key_count (SlotIndex count) __attribute__((always_inline))
 
void increment_key_count () __attribute__((always_inline))
 
void prefetch_general () const __attribute__((always_inline))
 prefetch upto keys/separators, whether this page is border or interior. More...
 
const PageVersionget_version () const __attribute__((always_inline))
 
PageVersionget_version () __attribute__((always_inline))
 
const PageVersionget_version_address () const __attribute__((always_inline))
 
PageVersionget_version_address () __attribute__((always_inline))
 
xct::McsWwLockget_lock_address () __attribute__((always_inline))
 
bool is_locked () const __attribute__((always_inline))
 
bool is_moved () const __attribute__((always_inline))
 
bool is_retired () const __attribute__((always_inline))
 
void set_moved () __attribute__((always_inline))
 
void set_retired () __attribute__((always_inline))
 
void release_pages_recursive_common (const memory::GlobalVolatilePageResolver &page_resolver, memory::PageReleaseBatch *batch)
 
void set_foster_major_offset_unsafe (memory::PagePoolOffset offset) __attribute__((always_inline))
 As the name suggests, this should be used only by composer. More...
 
void set_high_fence_unsafe (KeySlice high_fence) __attribute__((always_inline))
 As the name suggests, this should be used only by composer. More...
 

Protected Member Functions

void initialize_volatile_common (StorageId storage_id, VolatilePagePointer page_id, PageType page_type, uint8_t layer, uint8_t level, KeySlice low_fence, KeySlice high_fence)
 
void initialize_snapshot_common (StorageId storage_id, SnapshotPagePointer page_id, PageType page_type, uint8_t layer, uint8_t level, KeySlice low_fence, KeySlice high_fence)
 

Protected Attributes

PageHeader header_
 
KeySlice low_fence_
 Inclusive low fence of this page. More...
 
KeySlice high_fence_
 Inclusive high fence of this page. More...
 
KeySlice foster_fence_
 Inclusive low_fence of foster child. More...
 
VolatilePagePointer foster_twin_ [2]
 Points to foster children, or tentative child pages. More...
 

Friends

std::ostream & operator<< (std::ostream &o, const MasstreePage &v)
 defined in masstree_page_debug.cpp. More...
 

Constructor & Destructor Documentation

foedus::storage::masstree::MasstreePage::MasstreePage ( )
delete
foedus::storage::masstree::MasstreePage::MasstreePage ( const MasstreePage other)
delete

Member Function Documentation

uint8_t foedus::storage::masstree::MasstreePage::get_btree_level ( ) const
inline

used only in masstree.

Logical B-tree level of the page. Border pages are always level-0 whether they are foster-child or not. Intermediate pages right above border pages are level-1, their parents are level-2, ... Foster-child of an intermediate page has the same level as its foster parent. Again, this is a logical level, not physical.

Our implementation of masstree might have unbalanced sub-trees. In that case, an interemediate page's level is max(child's level) + 1. This imbalance can happen only at the root page of the first layer because of how the masstree composer work. Other than that, all B-tree nodes are balanced.

Todo:
this should be renamed to in_layer_level. now both masstree and hash use this.

Definition at line 146 of file masstree_page_impl.hpp.

References header_, and foedus::storage::PageHeader::masstree_in_layer_level_.

Referenced by foedus::storage::masstree::MasstreeComposer::construct_root(), foedus::storage::masstree::MasstreeComposer::drop_root_volatile(), foedus::storage::masstree::grow_case_b_common(), foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_this_layer_recurse(), foedus::storage::masstree::SplitIntermediate::split_impl_no_error(), foedus::storage::masstree::verify_page_basic(), and foedus::storage::masstree::MasstreeStoragePimpl::verify_single_thread_intermediate().

uint8_t masstree_in_layer_level_
used only in masstree.
Definition: page.hpp:243

Here is the caller graph for this function:

SlotIndex foedus::storage::masstree::MasstreePage::get_key_count ( ) const
inline

physical key count (those keys might be deleted) in this page.

Definition at line 148 of file masstree_page_impl.hpp.

References header_, and foedus::storage::PageHeader::key_count_.

Referenced by foedus::storage::masstree::Adopt::adopt_case_b(), foedus::storage::masstree::MasstreeIntermediatePage::append_minipage_snapshot(), foedus::storage::masstree::MasstreeBorderPage::append_next_layer_snapshot(), foedus::storage::masstree::MasstreeIntermediatePage::append_pointer_snapshot(), foedus::storage::masstree::MasstreeBorderPage::assert_entries_impl(), foedus::storage::masstree::MasstreeBorderPage::available_space(), foedus::storage::masstree::MasstreeBorderPage::can_accomodate_snapshot(), foedus::storage::masstree::MasstreeComposer::construct_root(), foedus::storage::masstree::count_children_approximate(), foedus::storage::masstree::MasstreeStoragePimpl::debugout_single_thread_recurse(), foedus::storage::masstree::SplitBorder::decide_strategy(), foedus::storage::masstree::MasstreeIntermediatePage::extract_separators_common(), foedus::storage::masstree::MasstreeStoragePimpl::fatify_first_root_double(), foedus::storage::masstree::MasstreeBorderPage::find_key(), foedus::storage::masstree::MasstreeBorderPage::find_key_for_snapshot(), foedus::storage::masstree::MasstreeIntermediatePage::find_minipage(), foedus::storage::masstree::MasstreeBorderPage::get_new_slot(), foedus::storage::masstree::MasstreeBorderPage::get_slot(), foedus::storage::masstree::MasstreeStoragePimpl::hcc_reset_all_temperature_stat_recurse(), foedus::storage::masstree::MasstreeBorderPage::initialize_layer_root(), initialize_snapshot_common(), initialize_volatile_common(), foedus::storage::masstree::MasstreeIntermediatePage::is_full_snapshot(), foedus::storage::masstree::MasstreeIntermediatePointerIterator::is_valid(), foedus::storage::masstree::MasstreeStoragePimpl::locate_record_normalized(), foedus::storage::masstree::SplitBorder::lock_existing_records(), foedus::storage::masstree::SplitIntermediate::migrate_pointers(), foedus::storage::masstree::SplitBorder::migrate_records(), foedus::storage::masstree::operator<<(), foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_next_layer(), foedus::storage::masstree::MasstreeStoragePimpl::prefetch_pages_normalized_recurse(), foedus::storage::masstree::MasstreeIntermediatePage::release_pages_recursive(), foedus::storage::masstree::MasstreeBorderPage::release_pages_recursive(), foedus::storage::masstree::MasstreeIntermediatePage::release_pages_recursive_parallel(), foedus::storage::masstree::MasstreeBorderPage::replace_next_layer_snapshot(), foedus::storage::masstree::MasstreeBorderPage::reserve_initially_next_layer(), foedus::storage::masstree::MasstreeStoragePimpl::reserve_record(), foedus::storage::masstree::MasstreeStoragePimpl::reserve_record_normalized(), foedus::storage::masstree::MasstreeBorderPage::reserve_record_space(), foedus::storage::masstree::SplitBorder::run(), foedus::storage::masstree::ReserveRecords::run(), foedus::storage::masstree::SplitIntermediate::split_impl_no_error(), foedus::storage::masstree::MasstreeBorderPage::track_moved_record(), foedus::storage::masstree::MasstreeBorderPage::track_moved_record_next_layer(), foedus::storage::masstree::MasstreeBorderPage::try_expand_record_in_page_physical(), foedus::storage::masstree::MasstreeIntermediatePage::verify_separators(), foedus::storage::masstree::MasstreeStoragePimpl::verify_single_thread_border(), and foedus::storage::masstree::MasstreeStoragePimpl::verify_single_thread_intermediate().

148 { return header_.key_count_; }
uint16_t key_count_
physical key count (those keys might be deleted) in this page.
Definition: page.hpp:219

Here is the caller graph for this function:

uint8_t foedus::storage::masstree::MasstreePage::get_layer ( ) const
inline

Layer-0 stores the first 8 byte slice, Layer-1 next 8 byte...

Definition at line 144 of file masstree_page_impl.hpp.

References header_, and foedus::storage::PageHeader::masstree_layer_.

Referenced by foedus::storage::masstree::MasstreeBorderPage::compare_key(), foedus::storage::masstree::MasstreeCursor::copy_combined_key(), foedus::storage::masstree::MasstreeCursor::copy_combined_key_part(), foedus::storage::masstree::MasstreeStoragePimpl::get_first_root(), foedus::storage::masstree::grow_case_b_common(), foedus::storage::masstree::MasstreeBorderPage::initialize_as_layer_root_physical(), foedus::storage::masstree::MasstreeBorderPage::ltgt_key(), foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_next_layer(), foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_this_layer(), foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_this_layer_recurse(), foedus::storage::masstree::GrowFirstLayerRoot::run(), foedus::storage::masstree::SplitBorder::run(), foedus::storage::masstree::ReserveRecords::run(), foedus::storage::masstree::SplitIntermediate::split_impl_no_error(), foedus::storage::masstree::MasstreeBorderPage::track_moved_record_next_layer(), foedus::storage::masstree::MasstreeStoragePimpl::verify_single_thread_border(), foedus::storage::masstree::MasstreeStoragePimpl::verify_single_thread_intermediate(), foedus::storage::masstree::MasstreeStoragePimpl::verify_single_thread_layer(), foedus::storage::masstree::MasstreeBorderPage::will_conflict(), and foedus::storage::masstree::MasstreeBorderPage::will_contain_next_layer().

144 { return header_.masstree_layer_; }
uint8_t masstree_layer_
used only in masstree.
Definition: page.hpp:226

Here is the caller graph for this function:

xct::McsWwLock* foedus::storage::masstree::MasstreePage::get_lock_address ( )
inline

Definition at line 166 of file masstree_page_impl.hpp.

References header_, foedus::storage::PageVersion::lock_, and foedus::storage::PageHeader::page_version_.

166 { return &header_.page_version_.lock_; }
xct::McsWwLock lock_
Definition: page.hpp:171
PageVersion page_version_
Used in several storage types as concurrency control mechanism for the page.
Definition: page.hpp:272
KeySlice foedus::storage::masstree::MasstreePage::get_low_fence ( ) const
inline

Definition at line 98 of file masstree_page_impl.hpp.

References low_fence_.

Referenced by foedus::storage::masstree::Adopt::adopt_case_a(), foedus::storage::masstree::MasstreeIntermediatePage::append_pointer_snapshot(), foedus::storage::masstree::SplitIntermediate::decide_strategy(), foedus::storage::masstree::describe_masstree_page_common(), foedus::storage::masstree::MasstreeIntermediatePage::extract_separators_common(), foedus::storage::masstree::MasstreeStoragePimpl::fatify_first_root_double(), foedus::storage::masstree::MasstreeStoragePimpl::find_border_physical(), foedus::storage::masstree::MasstreeStoragePimpl::get_first_root(), foedus::storage::masstree::MasstreeIntermediatePointerIterator::get_low_key(), foedus::storage::masstree::grow_case_a_common(), foedus::storage::masstree::operator<<(), foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_next_layer(), foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_this_layer(), foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_this_layer_recurse(), foedus::storage::masstree::GrowFirstLayerRoot::run(), foedus::storage::masstree::Adopt::run(), foedus::storage::masstree::GrowNonFirstLayerRoot::run(), foedus::storage::masstree::SplitBorder::run(), foedus::storage::masstree::MasstreeBorderPage::track_moved_record_next_layer(), and foedus::storage::masstree::verify_page_basic().

98 { return low_fence_; }
KeySlice low_fence_
Inclusive low fence of this page.

Here is the caller graph for this function:

SnapshotPagePointer foedus::storage::masstree::MasstreePage::get_snapshot_page_id ( ) const
inline

Definition at line 79 of file masstree_page_impl.hpp.

References ASSERT_ND, header_, foedus::storage::PageHeader::page_id_, and foedus::storage::PageHeader::snapshot_.

79  {
81  return static_cast<SnapshotPagePointer>(header_.page_id_);
82  }
uint64_t SnapshotPagePointer
Page ID of a snapshot page.
Definition: storage_id.hpp:79
bool snapshot_
Whether this page image is of a snapshot page.
Definition: page.hpp:211
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72
uint64_t page_id_
Page ID of this page.
Definition: page.hpp:191
const PageVersion& foedus::storage::masstree::MasstreePage::get_version ( ) const
inline

Definition at line 162 of file masstree_page_impl.hpp.

References header_, and foedus::storage::PageHeader::page_version_.

Referenced by foedus::storage::masstree::MasstreeStoragePimpl::locate_record(), and foedus::storage::masstree::MasstreeStoragePimpl::locate_record_normalized().

162 { return header_.page_version_; }
PageVersion page_version_
Used in several storage types as concurrency control mechanism for the page.
Definition: page.hpp:272

Here is the caller graph for this function:

PageVersion& foedus::storage::masstree::MasstreePage::get_version ( )
inline

Definition at line 163 of file masstree_page_impl.hpp.

References header_, and foedus::storage::PageHeader::page_version_.

163 { return header_.page_version_; }
PageVersion page_version_
Used in several storage types as concurrency control mechanism for the page.
Definition: page.hpp:272
const PageVersion* foedus::storage::masstree::MasstreePage::get_version_address ( ) const
inline
PageVersion* foedus::storage::masstree::MasstreePage::get_version_address ( )
inline

Definition at line 165 of file masstree_page_impl.hpp.

References header_, and foedus::storage::PageHeader::page_version_.

165 { return &header_.page_version_; }
PageVersion page_version_
Used in several storage types as concurrency control mechanism for the page.
Definition: page.hpp:272
VolatilePagePointer foedus::storage::masstree::MasstreePage::get_volatile_page_id ( ) const
inline
PageHeader& foedus::storage::masstree::MasstreePage::header ( )
inline

Definition at line 73 of file masstree_page_impl.hpp.

References header_.

Referenced by foedus::storage::masstree::Adopt::adopt_case_a(), foedus::storage::masstree::allocate_new_border_page(), foedus::storage::masstree::MasstreeBorderPage::append_next_layer_snapshot(), foedus::storage::masstree::MasstreeComposer::construct_root(), foedus::storage::masstree::SplitIntermediate::decide_strategy(), foedus::storage::masstree::MasstreeStoragePimpl::delete_general(), foedus::storage::masstree::describe_masstree_page_common(), foedus::storage::masstree::design_partition_first_parallel_recurse(), foedus::storage::masstree::MasstreeStoragePimpl::fatify_first_root_double(), foedus::storage::masstree::MasstreeStoragePimpl::get_first_root(), foedus::storage::masstree::grow_case_a_common(), foedus::storage::masstree::grow_case_b_common(), foedus::storage::masstree::MasstreeStoragePimpl::hcc_reset_all_temperature_stat_recurse(), foedus::storage::masstree::MasstreeStoragePimpl::increment_general(), foedus::storage::masstree::MasstreeStoragePimpl::insert_general(), foedus::storage::masstree::MasstreeStoragePimpl::locate_record(), foedus::storage::masstree::MasstreeStoragePimpl::locate_record_normalized(), foedus::storage::masstree::SplitBorder::lock_existing_records(), foedus::storage::masstree::MasstreeIntermediatePointerIterator::MasstreeIntermediatePointerIterator(), foedus::storage::masstree::MasstreeStoragePimpl::overwrite_general(), foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_next_layer(), foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_this_layer(), foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_this_layer_recurse(), foedus::storage::masstree::MasstreeIntermediatePage::release_pages_recursive(), foedus::storage::masstree::MasstreeBorderPage::release_pages_recursive(), foedus::storage::masstree::MasstreeIntermediatePage::release_pages_recursive_parallel(), foedus::storage::masstree::MasstreeBorderPage::replace_next_layer_snapshot(), foedus::storage::masstree::MasstreeBorderPage::reserve_initially_next_layer(), foedus::storage::masstree::MasstreeBorderPage::reserve_record_space(), foedus::storage::masstree::Adopt::run(), foedus::storage::masstree::GrowNonFirstLayerRoot::run(), foedus::storage::masstree::SplitBorder::run(), foedus::storage::masstree::ReserveRecords::run(), foedus::storage::masstree::SplitIntermediate::split_impl_no_error(), foedus::storage::masstree::MasstreeBorderPage::track_moved_record(), foedus::storage::masstree::MasstreeBorderPage::track_moved_record_next_layer(), foedus::storage::masstree::MasstreeStoragePimpl::upsert_general(), and foedus::storage::masstree::verify_page_basic().

Here is the caller graph for this function:

const PageHeader& foedus::storage::masstree::MasstreePage::header ( ) const
inline

Definition at line 74 of file masstree_page_impl.hpp.

References header_.

void foedus::storage::masstree::MasstreePage::increment_key_count ( )
inline

Definition at line 150 of file masstree_page_impl.hpp.

References header_, and foedus::storage::PageHeader::increment_key_count().

Referenced by foedus::storage::masstree::Adopt::adopt_case_b(), and foedus::storage::masstree::ReserveRecords::run().

void increment_key_count() __attribute__((always_inline))
Definition: page.hpp:318

Here is the call graph for this function:

Here is the caller graph for this function:

void foedus::storage::masstree::MasstreePage::initialize_snapshot_common ( StorageId  storage_id,
SnapshotPagePointer  page_id,
PageType  page_type,
uint8_t  layer,
uint8_t  level,
KeySlice  low_fence,
KeySlice  high_fence 
)
protected

Definition at line 68 of file masstree_page_impl.cpp.

References ASSERT_ND, foster_fence_, foster_twin_, get_key_count(), header_, high_fence_, foedus::storage::PageHeader::init_snapshot(), foedus::storage::kMasstreeIntermediatePageType, low_fence_, foedus::storage::PageHeader::masstree_in_layer_level_, foedus::storage::PageHeader::masstree_layer_, and foedus::storage::VolatilePagePointer::word.

Referenced by foedus::storage::masstree::MasstreeIntermediatePage::initialize_snapshot_page(), and foedus::storage::masstree::MasstreeBorderPage::initialize_snapshot_page().

75  {
76  header_.init_snapshot(page_id, storage_id, page_type);
77  header_.masstree_layer_ = layer;
79  ASSERT_ND((page_type == kMasstreeIntermediatePageType) == (level > 0));
80  high_fence_ = high_fence;
81  low_fence_ = low_fence;
82  foster_fence_ = low_fence;
83  foster_twin_[0].word = 0;
84  foster_twin_[1].word = 0;
85  ASSERT_ND(get_key_count() == 0);
86 }
KeySlice high_fence_
Inclusive high fence of this page.
SlotIndex get_key_count() const __attribute__((always_inline))
physical key count (those keys might be deleted) in this page.
KeySlice low_fence_
Inclusive low fence of this page.
uint8_t masstree_layer_
used only in masstree.
Definition: page.hpp:226
KeySlice foster_fence_
Inclusive low_fence of foster child.
VolatilePagePointer foster_twin_[2]
Points to foster children, or tentative child pages.
uint8_t masstree_in_layer_level_
used only in masstree.
Definition: page.hpp:243
void init_snapshot(SnapshotPagePointer page_id, StorageId storage_id, PageType page_type) __attribute__((always_inline))
Definition: page.hpp:301
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72

Here is the call graph for this function:

Here is the caller graph for this function:

void foedus::storage::masstree::MasstreePage::initialize_volatile_common ( StorageId  storage_id,
VolatilePagePointer  page_id,
PageType  page_type,
uint8_t  layer,
uint8_t  level,
KeySlice  low_fence,
KeySlice  high_fence 
)
protected

Definition at line 47 of file masstree_page_impl.cpp.

References ASSERT_ND, foster_fence_, foster_twin_, get_key_count(), header_, high_fence_, foedus::storage::PageHeader::init_volatile(), foedus::storage::kMasstreeIntermediatePageType, low_fence_, foedus::storage::PageHeader::masstree_in_layer_level_, foedus::storage::PageHeader::masstree_layer_, and foedus::storage::VolatilePagePointer::word.

Referenced by foedus::storage::masstree::MasstreeIntermediatePage::initialize_volatile_page(), and foedus::storage::masstree::MasstreeBorderPage::initialize_volatile_page().

54  {
55  // std::memset(this, 0, kPageSize); // expensive
56  header_.init_volatile(page_id, storage_id, page_type);
57  header_.masstree_layer_ = layer;
59  ASSERT_ND((page_type == kMasstreeIntermediatePageType) == (level > 0));
60  high_fence_ = high_fence;
61  low_fence_ = low_fence;
62  foster_fence_ = low_fence;
63  foster_twin_[0].word = 0;
64  foster_twin_[1].word = 0;
65  ASSERT_ND(get_key_count() == 0);
66 }
KeySlice high_fence_
Inclusive high fence of this page.
SlotIndex get_key_count() const __attribute__((always_inline))
physical key count (those keys might be deleted) in this page.
void init_volatile(VolatilePagePointer page_id, StorageId storage_id, PageType page_type) __attribute__((always_inline))
Definition: page.hpp:284
KeySlice low_fence_
Inclusive low fence of this page.
uint8_t masstree_layer_
used only in masstree.
Definition: page.hpp:226
KeySlice foster_fence_
Inclusive low_fence of foster child.
VolatilePagePointer foster_twin_[2]
Points to foster children, or tentative child pages.
uint8_t masstree_in_layer_level_
used only in masstree.
Definition: page.hpp:243
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72

Here is the call graph for this function:

Here is the caller graph for this function:

void foedus::storage::masstree::MasstreePage::install_foster_twin ( VolatilePagePointer  minor,
VolatilePagePointer  major,
KeySlice  foster_fence 
)
inline

Definition at line 118 of file masstree_page_impl.hpp.

References foster_fence_, and set_foster_twin().

Referenced by foedus::storage::masstree::SplitBorder::run(), and foedus::storage::masstree::SplitIntermediate::split_impl_no_error().

121  {
122  set_foster_twin(minor, major);
123  foster_fence_ = foster_fence;
124  }
KeySlice foster_fence_
Inclusive low_fence of foster child.
void set_foster_twin(VolatilePagePointer minor, VolatilePagePointer major)

Here is the call graph for this function:

Here is the caller graph for this function:

bool foedus::storage::masstree::MasstreePage::is_border ( ) const
inline

Definition at line 84 of file masstree_page_impl.hpp.

References ASSERT_ND, foedus::storage::PageHeader::get_page_type(), header_, foedus::storage::kMasstreeBorderPageType, and foedus::storage::kMasstreeIntermediatePageType.

Referenced by foedus::storage::masstree::as_border(), foedus::storage::masstree::as_intermediate(), foedus::storage::masstree::MasstreeComposer::construct_root(), foedus::storage::masstree::MasstreeStoragePimpl::debugout_single_thread_recurse(), foedus::storage::masstree::MasstreePartitioner::design_partition(), foedus::storage::masstree::design_partition_first_parallel_recurse(), foedus::storage::masstree::MasstreeIntermediatePage::extract_separators_common(), foedus::storage::masstree::MasstreeStoragePimpl::fatify_first_root_double(), foedus::storage::masstree::MasstreeStoragePimpl::hcc_reset_all_temperature_stat_recurse(), foedus::storage::masstree::operator<<(), foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_next_layer(), foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_this_layer(), foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_this_layer_recurse(), foedus::storage::masstree::MasstreeStoragePimpl::prefetch_pages_normalized_recurse(), foedus::storage::masstree::GrowNonFirstLayerRoot::run(), foedus::storage::masstree::MasstreeCursor::Route::setup_order(), foedus::storage::masstree::MasstreeStoragePimpl::track_moved_record(), foedus::storage::masstree::MasstreeBorderPage::track_moved_record_next_layer(), foedus::storage::masstree::verify_page_basic(), foedus::storage::masstree::MasstreeStoragePimpl::verify_single_thread(), and foedus::storage::masstree::MasstreeStoragePimpl::verify_single_thread_layer().

84  {
88  }
PageType get_page_type() const
Definition: page.hpp:280
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72

Here is the call graph for this function:

Here is the caller graph for this function:

bool foedus::storage::masstree::MasstreePage::is_empty_range ( ) const
inline

An empty-range page, either intermediate or border, never has any entries.

Such a page exists for short duration after a special page-split for record compaction/expansion and page restructuring. Such a page always appears as one of foster-twins: it will be never adopted to be a real child. Also guaranteed to not have any foster twins under it. Wan safely skip such a page while following foster twins.

Definition at line 97 of file masstree_page_impl.hpp.

References high_fence_, and low_fence_.

Referenced by foedus::storage::masstree::Adopt::adopt_case_a(), foedus::storage::masstree::grow_case_a_common(), foedus::storage::masstree::MasstreeIntermediatePointerIterator::MasstreeIntermediatePointerIterator(), foedus::storage::masstree::operator<<(), foedus::storage::masstree::MasstreeStoragePimpl::prefetch_pages_normalized_recurse(), foedus::storage::masstree::MasstreeIntermediatePage::release_pages_recursive(), foedus::storage::masstree::SplitBorder::run(), foedus::storage::masstree::SplitIntermediate::split_impl_no_error(), foedus::storage::masstree::MasstreeIntermediatePage::verify_separators(), and foedus::storage::masstree::MasstreeStoragePimpl::verify_single_thread_intermediate().

97 { return low_fence_ == high_fence_; }
KeySlice high_fence_
Inclusive high fence of this page.
KeySlice low_fence_
Inclusive low fence of this page.

Here is the caller graph for this function:

bool foedus::storage::masstree::MasstreePage::is_foster_major_null ( ) const
inline

Definition at line 111 of file masstree_page_impl.hpp.

References foster_twin_, and foedus::storage::VolatilePagePointer::is_null().

Referenced by foedus::storage::masstree::MasstreeBorderPage::track_moved_record(), and foedus::storage::masstree::verify_page_basic().

111 { return foster_twin_[1].is_null(); }
VolatilePagePointer foster_twin_[2]
Points to foster children, or tentative child pages.

Here is the call graph for this function:

Here is the caller graph for this function:

bool foedus::storage::masstree::MasstreePage::is_foster_minor_null ( ) const
inline

Definition at line 110 of file masstree_page_impl.hpp.

References foster_twin_, and foedus::storage::VolatilePagePointer::is_null().

Referenced by foedus::storage::masstree::MasstreeBorderPage::track_moved_record(), and foedus::storage::masstree::verify_page_basic().

110 { return foster_twin_[0].is_null(); }
VolatilePagePointer foster_twin_[2]
Points to foster children, or tentative child pages.

Here is the call graph for this function:

Here is the caller graph for this function:

bool foedus::storage::masstree::MasstreePage::is_layer_root ( ) const
inline

Definition at line 106 of file masstree_page_impl.hpp.

References is_high_fence_supremum(), and is_low_fence_infimum().

Referenced by foedus::storage::masstree::GrowFirstLayerRoot::run(), and foedus::storage::masstree::GrowNonFirstLayerRoot::run().

106  {
108  }
bool is_high_fence_supremum() const __attribute__((always_inline))
bool is_low_fence_infimum() const __attribute__((always_inline))

Here is the call graph for this function:

Here is the caller graph for this function:

bool foedus::storage::masstree::MasstreePage::is_locked ( ) const
inline

Definition at line 168 of file masstree_page_impl.hpp.

References header_, foedus::storage::PageVersion::is_locked(), and foedus::storage::PageHeader::page_version_.

Referenced by foedus::storage::masstree::Adopt::adopt_case_a(), foedus::storage::masstree::MasstreeBorderPage::assert_entries_impl(), foedus::storage::masstree::SplitBorder::decide_strategy(), foedus::storage::masstree::SplitIntermediate::decide_strategy(), foedus::storage::masstree::MasstreeStoragePimpl::find_border_physical(), foedus::storage::masstree::grow_case_a_common(), foedus::storage::masstree::grow_case_b_common(), foedus::storage::masstree::MasstreeBorderPage::initialize_as_layer_root_physical(), foedus::storage::masstree::MasstreeBorderPage::initialize_layer_root(), foedus::storage::masstree::SplitBorder::lock_existing_records(), foedus::storage::masstree::SplitBorder::migrate_records(), foedus::storage::masstree::MasstreeBorderPage::reserve_initially_next_layer(), foedus::storage::masstree::MasstreeBorderPage::reserve_record_space(), foedus::storage::masstree::GrowFirstLayerRoot::run(), foedus::storage::masstree::GrowNonFirstLayerRoot::run(), foedus::storage::masstree::ReserveRecords::run(), foedus::storage::masstree::MasstreeBorderPage::try_expand_record_in_page_physical(), and foedus::storage::masstree::verify_page_basic().

168 { return header_.page_version_.is_locked(); }
PageVersion page_version_
Used in several storage types as concurrency control mechanism for the page.
Definition: page.hpp:272
bool is_locked() const __attribute__((always_inline))
Definition: page.hpp:138

Here is the call graph for this function:

Here is the caller graph for this function:

bool foedus::storage::masstree::MasstreePage::is_low_fence_infimum ( ) const
inline

Definition at line 103 of file masstree_page_impl.hpp.

References foedus::storage::masstree::kInfimumSlice, and low_fence_.

Referenced by is_layer_root().

103  {
104  return low_fence_ == kInfimumSlice;
105  }
const KeySlice kInfimumSlice
KeySlice low_fence_
Inclusive low fence of this page.

Here is the caller graph for this function:

bool foedus::storage::masstree::MasstreePage::is_moved ( ) const
inline

Definition at line 169 of file masstree_page_impl.hpp.

References header_, foedus::storage::PageVersion::is_moved(), and foedus::storage::PageHeader::page_version_.

Referenced by foedus::storage::masstree::SplitIntermediate::decide_strategy(), foedus::storage::masstree::MasstreeStoragePimpl::fatify_first_root_double(), foedus::storage::masstree::MasstreeBorderPage::initialize_as_layer_root_physical(), foedus::storage::masstree::MasstreeIntermediatePage::release_pages_recursive(), foedus::storage::masstree::GrowFirstLayerRoot::run(), foedus::storage::masstree::Adopt::run(), foedus::storage::masstree::GrowNonFirstLayerRoot::run(), foedus::storage::masstree::ReserveRecords::run(), foedus::storage::masstree::MasstreeStoragePimpl::track_moved_record(), foedus::storage::masstree::MasstreeBorderPage::track_moved_record(), foedus::storage::masstree::MasstreeBorderPage::try_expand_record_in_page_physical(), foedus::storage::masstree::verify_page_basic(), foedus::storage::masstree::MasstreeIntermediatePage::verify_separators(), foedus::storage::masstree::MasstreeStoragePimpl::verify_single_thread_border(), and foedus::storage::masstree::MasstreeStoragePimpl::verify_single_thread_intermediate().

169 { return header_.page_version_.is_moved(); }
bool is_moved() const __attribute__((always_inline))
Definition: page.hpp:139
PageVersion page_version_
Used in several storage types as concurrency control mechanism for the page.
Definition: page.hpp:272

Here is the call graph for this function:

Here is the caller graph for this function:

bool foedus::storage::masstree::MasstreePage::is_retired ( ) const
inline
MasstreePage& foedus::storage::masstree::MasstreePage::operator= ( const MasstreePage other)
delete
void foedus::storage::masstree::MasstreePage::prefetch_general ( ) const
inline

prefetch upto keys/separators, whether this page is border or interior.

Use this to prefetch a page that is not sure border or interior. Checking the page type itself has to read the header, so just do it conservatively. 4 cachelines too much? that's a different argument...

Definition at line 158 of file masstree_page_impl.hpp.

References foedus::assorted::prefetch_cachelines().

Referenced by foedus::storage::masstree::MasstreeStoragePimpl::find_border_physical(), and foedus::storage::masstree::MasstreeStoragePimpl::peek_volatile_page_boundaries_next_layer().

158  {
159  assorted::prefetch_cachelines(this, 4); // max(border's prefetch, interior's prefetch)
160  }
void prefetch_cachelines(const void *address, int cacheline_count)
Prefetch multiple contiguous cachelines to L1 cache.
Definition: cacheline.hpp:66

Here is the call graph for this function:

Here is the caller graph for this function:

void foedus::storage::masstree::MasstreePage::release_pages_recursive_common ( const memory::GlobalVolatilePageResolver page_resolver,
memory::PageReleaseBatch batch 
)

Definition at line 164 of file masstree_page_impl.cpp.

References ASSERT_ND, foedus::storage::PageHeader::get_page_type(), header_, foedus::storage::kMasstreeBorderPageType, foedus::storage::kMasstreeIntermediatePageType, foedus::storage::masstree::MasstreeIntermediatePage::release_pages_recursive(), and foedus::storage::masstree::MasstreeBorderPage::release_pages_recursive().

Referenced by foedus::storage::masstree::MasstreeIntermediatePage::release_pages_recursive(), foedus::storage::masstree::MasstreeBorderPage::release_pages_recursive(), and foedus::storage::masstree::release_parallel().

166  {
168  MasstreeBorderPage* casted = reinterpret_cast<MasstreeBorderPage*>(this);
169  casted->release_pages_recursive(page_resolver, batch);
170  } else {
172  MasstreeIntermediatePage* casted = reinterpret_cast<MasstreeIntermediatePage*>(this);
173  casted->release_pages_recursive(page_resolver, batch);
174  }
175 }
PageType get_page_type() const
Definition: page.hpp:280
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72

Here is the call graph for this function:

Here is the caller graph for this function:

void foedus::storage::masstree::MasstreePage::set_foster_major_offset_unsafe ( memory::PagePoolOffset  offset)
inline

As the name suggests, this should be used only by composer.

foster twin should be immutable

Definition at line 180 of file masstree_page_impl.hpp.

References ASSERT_ND, foster_twin_, header_, foedus::storage::VolatilePagePointer::set_offset_unsafe(), and foedus::storage::PageHeader::snapshot_.

180  {
182  foster_twin_[1].set_offset_unsafe(offset);
183  }
VolatilePagePointer foster_twin_[2]
Points to foster children, or tentative child pages.
void set_offset_unsafe(memory::PagePoolOffset offset)
This is used only in special places (snapshot composer).
Definition: storage_id.hpp:207
bool snapshot_
Whether this page image is of a snapshot page.
Definition: page.hpp:211
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72

Here is the call graph for this function:

void foedus::storage::masstree::MasstreePage::set_foster_twin ( VolatilePagePointer  minor,
VolatilePagePointer  major 
)
inline

Definition at line 114 of file masstree_page_impl.hpp.

References foster_twin_.

Referenced by install_foster_twin().

114  {
115  foster_twin_[0] = minor;
116  foster_twin_[1] = major;
117  }
VolatilePagePointer foster_twin_[2]
Points to foster children, or tentative child pages.

Here is the caller graph for this function:

void foedus::storage::masstree::MasstreePage::set_high_fence_unsafe ( KeySlice  high_fence)
inline

As the name suggests, this should be used only by composer.

fence should be immutable

Definition at line 185 of file masstree_page_impl.hpp.

References ASSERT_ND, header_, high_fence_, and foedus::storage::PageHeader::snapshot_.

185  {
187  high_fence_ = high_fence;
188  }
KeySlice high_fence_
Inclusive high fence of this page.
bool snapshot_
Whether this page image is of a snapshot page.
Definition: page.hpp:211
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72
void foedus::storage::masstree::MasstreePage::set_key_count ( SlotIndex  count)
inline
void foedus::storage::masstree::MasstreePage::set_moved ( )
inline

Definition at line 171 of file masstree_page_impl.hpp.

References header_, foedus::storage::PageHeader::page_version_, and foedus::storage::PageVersion::set_moved().

Referenced by foedus::storage::masstree::SplitIntermediate::split_impl_no_error().

PageVersion page_version_
Used in several storage types as concurrency control mechanism for the page.
Definition: page.hpp:272
void set_moved() __attribute__((always_inline))
Definition: page.hpp:146

Here is the call graph for this function:

Here is the caller graph for this function:

void foedus::storage::masstree::MasstreePage::set_retired ( )
inline
bool foedus::storage::masstree::MasstreePage::within_foster_major ( KeySlice  slice) const
inline

Definition at line 134 of file masstree_page_impl.hpp.

References ASSERT_ND, foster_fence_, has_foster_child(), and within_fences().

134  {
135  ASSERT_ND(within_fences(slice));
137  return slice >= foster_fence_;
138  }
KeySlice foster_fence_
Inclusive low_fence of foster child.
bool has_foster_child() const __attribute__((always_inline))
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72
bool within_fences(KeySlice slice) const __attribute__((always_inline))

Here is the call graph for this function:

bool foedus::storage::masstree::MasstreePage::within_foster_minor ( KeySlice  slice) const
inline

Definition at line 129 of file masstree_page_impl.hpp.

References ASSERT_ND, foster_fence_, has_foster_child(), and within_fences().

Referenced by foedus::storage::masstree::MasstreeStoragePimpl::reserve_record(), and foedus::storage::masstree::MasstreeStoragePimpl::reserve_record_normalized().

129  {
130  ASSERT_ND(within_fences(slice));
132  return slice < foster_fence_;
133  }
KeySlice foster_fence_
Inclusive low_fence of foster child.
bool has_foster_child() const __attribute__((always_inline))
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72
bool within_fences(KeySlice slice) const __attribute__((always_inline))

Here is the call graph for this function:

Here is the caller graph for this function:

Friends And Related Function Documentation

std::ostream& operator<< ( std::ostream &  o,
const MasstreePage v 
)
friend

defined in masstree_page_debug.cpp.

Definition at line 30 of file masstree_page_debug.cpp.

30  {
31  if (v.is_border()) {
32  o << reinterpret_cast<const MasstreeBorderPage&>(v);
33  } else {
34  o << reinterpret_cast<const MasstreeIntermediatePage&>(v);
35  }
36  return o;
37 }

Member Data Documentation

KeySlice foedus::storage::masstree::MasstreePage::foster_fence_
protected

Inclusive low_fence of foster child.

undefined if foster child is not set

Definition at line 201 of file masstree_page_impl.hpp.

Referenced by get_foster_fence(), initialize_snapshot_common(), initialize_volatile_common(), install_foster_twin(), within_foster_major(), and within_foster_minor().

VolatilePagePointer foedus::storage::masstree::MasstreePage::foster_twin_[2]
protected

Points to foster children, or tentative child pages.

Null if has_foster_child of page_version is false. This is core of the foster-twin protocol.

[0]: Left-half of this page, or minor foster child. [1]: Right-half of this page, or major foster child.

Definition at line 211 of file masstree_page_impl.hpp.

Referenced by get_foster_major(), get_foster_minor(), initialize_snapshot_common(), initialize_volatile_common(), is_foster_major_null(), is_foster_minor_null(), foedus::storage::masstree::MasstreeIntermediatePage::release_pages_recursive(), foedus::storage::masstree::MasstreeBorderPage::release_pages_recursive(), foedus::storage::masstree::MasstreeIntermediatePage::release_pages_recursive_parallel(), set_foster_major_offset_unsafe(), and set_foster_twin().

PageHeader foedus::storage::masstree::MasstreePage::header_
protected

Definition at line 194 of file masstree_page_impl.hpp.

Referenced by foedus::storage::masstree::MasstreeIntermediatePage::append_minipage_snapshot(), foedus::storage::masstree::MasstreeIntermediatePage::append_pointer_snapshot(), foedus::storage::masstree::MasstreeBorderPage::assert_entries_impl(), foedus::storage::masstree::MasstreeBorderPage::can_accomodate_snapshot(), foedus::storage::masstree::MasstreeIntermediatePage::extract_separators_snapshot(), foedus::storage::masstree::MasstreeIntermediatePage::extract_separators_volatile(), foedus::storage::masstree::MasstreeBorderPage::find_key_for_snapshot(), get_btree_level(), get_key_count(), get_layer(), get_lock_address(), get_snapshot_page_id(), get_version(), get_version_address(), get_volatile_page_id(), has_foster_child(), header(), increment_key_count(), foedus::storage::masstree::MasstreeBorderPage::initialize_as_layer_root_physical(), foedus::storage::masstree::MasstreeBorderPage::initialize_layer_root(), initialize_snapshot_common(), initialize_volatile_common(), is_border(), is_locked(), is_moved(), is_retired(), foedus::storage::masstree::SplitIntermediate::migrate_pointers(), foedus::storage::masstree::MasstreeIntermediatePage::release_pages_recursive(), foedus::storage::masstree::MasstreeBorderPage::release_pages_recursive(), release_pages_recursive_common(), foedus::storage::masstree::MasstreeIntermediatePage::release_pages_recursive_parallel(), set_foster_major_offset_unsafe(), set_high_fence_unsafe(), set_key_count(), set_moved(), set_retired(), and foedus::storage::masstree::MasstreeBorderPage::try_expand_record_in_page_physical().


The documentation for this class was generated from the following files: