5 #ifndef __BTREE_PAGE_H_H 6 #define __BTREE_PAGE_H_H 206 char c[
sizeof(int16_t)];
207 int16_t is_ghost : 1,
240 return page()->btree_root;
255 PageID pid0_opaqueptr()
const;
261 bool is_leaf()
const;
264 bool is_node()
const;
271 bool is_leaf_parent()
const;
274 PageID get_foster()
const;
277 PageID get_foster_opaqueptr()
const;
280 const char* get_prefix_key()
const;
283 int16_t get_prefix_length()
const;
286 const char* get_fence_low_key()
const;
289 int16_t get_fence_low_length()
const;
307 const char* get_fence_high_key_noprefix()
const;
310 int16_t get_fence_high_length()
const;
314 return get_fence_high_length() - get_prefix_length();
320 get_fence_high_key_noprefix(),
321 get_fence_high_length_noprefix());
326 return get_prefix_length() == 0 && get_fence_high_key_noprefix()[0] ==
SIGN_POSINF;
330 const char* get_chain_fence_high_key()
const;
333 int16_t get_chain_fence_high_length()
const;
351 int compare_with_fence_low(
const w_keystr_t& key)
const;
354 int compare_with_fence_low(
const char* key,
size_t key_len)
const;
357 int compare_with_fence_low_noprefix(
const char* key,
size_t key_len)
const;
364 int compare_with_fence_high(
const w_keystr_t& key)
const;
367 int compare_with_fence_high(
const char* key,
size_t key_len)
const;
370 int compare_with_fence_high_noprefix(
const char* key,
size_t key_len)
const;
377 int compare_with_chain_fence_high(
const w_keystr_t& key)
const;
380 int compare_with_chain_fence_high(
const char* key,
size_t key_len)
const;
392 void accept_empty_child(
lsn_t new_lsn,
PageID new_page_id,
const bool f_redo);
414 bool set_foster_child(
PageID foster_child_pid,
417 void delete_range(
int from,
int to);
459 bool steal_src2_pid0 =
false,
460 const bool full_logging =
false,
461 const bool log_src_1 =
false,
464 const bool ghost =
false 471 const bool full_logging);
479 const bool set_chain,
const w_keystr_t& chain_fence_high,
480 const bool set_pid0,
const PageID new_pid0,
481 const bool set_emlsn,
const lsn_t new_pid0_emlsn,
482 const bool set_foster,
const PageID foster_pid0,
483 const bool set_foster_emlsn,
const lsn_t foster_emlsn,
484 const int remove_count = 0);
495 bool check_chance_for_norecord_split(
const w_keystr_t& key_to_insert)
const;
520 const char* element(
int slot,
smsize_t& len,
bool& ghost)
const;
532 bool copy_element(
int slot,
char* out_buffer,
smsize_t& len,
bool& ghost)
const;
556 PageID* page_pointer_address(
int offset);
563 size_t get_rec_space(
int slot)
const;
566 int16_t calculate_prefix_length(int16_t existing_prefix_len,
575 rc_t copy_records(
const int rec_count,
583 rc_t insert_records_dest_redo(
const int16_t prefix_len,
584 const int32_t move_count,
585 const int16_t record_data_len,
586 const char* record_data);
613 void search(
const char* key_raw,
size_t key_raw_len,
614 bool& found_key,
slotid_t& return_slot)
const;
687 int new_prefix_length = -1);
726 void reserve_ghost(
const char* key_raw,
size_t key_raw_len,
size_t element_length);
746 bool _is_enough_spacious_ghost(
755 bool check_space_for_insert_leaf(
const w_keystr_t& trunc_key,
const cvec_t& el);
757 bool check_space_for_insert_leaf(
size_t trunc_key_length,
size_t element_length);
760 bool check_space_for_insert_node(
const w_keystr_t& key);
774 void suggest_fence_for_split(
780 bool is_insertion_extremely_skewed_right()
const;
782 bool is_insertion_skewed_right()
const;
784 bool is_insertion_skewed_left()
const;
801 rc_t defrag(
const bool full_logging_redo =
false);
817 void print(
bool print_elem =
false);
831 bool is_consistent(
bool check_keyorder =
false,
bool check_space =
false)
const;
849 const lsn_t& get_foster_emlsn()
const;
852 const lsn_t& get_pid0_emlsn()
const;
874 max_key_length = (1 << (
sizeof(key_length_t) * 8 - 1)) - 1,
888 void _pack_node_record(
cvec_t& out,
const cvec_t& trunc_key,
const lsn_t& emlsn)
const;
905 void _pack_leaf_record(
cvec_t& out, pack_scratch_t& out_scratch,
907 const char* element,
size_t element_len)
const;
924 void _pack_leaf_record_prefix(
cvec_t& out, pack_scratch_t& out_scratch,
925 const cvec_t& trunc_key)
const;
947 int new_prefix_len)
const;
953 size_t _predict_leaf_data_length(
int trunc_key_length,
int element_length)
const;
964 poor_man_key _extract_poor_man_key(
const void* trunc_key,
size_t trunc_key_len)
const;
967 poor_man_key _extract_poor_man_key(
const cvec_t& trunc_key)
const;
970 poor_man_key _extract_poor_man_key(
const void* key_with_prefix,
971 size_t key_len_with_prefix,
size_t prefix_len)
const;
979 poor_man_key _poor(
int slot)
const;
986 const char* _leaf_key_noprefix(
slotid_t slot,
size_t& len)
const;
993 const char* _node_key_noprefix(
slotid_t slot,
size_t& len)
const;
1002 size_t _element_offset(
int slot)
const;
1005 int _compare_key_noprefix(
slotid_t slot,
const void* key_noprefix,
size_t key_len)
const;
1009 int _compare_slot_with_key(
int slot,
const void* key_noprefix,
size_t key_len, poor_man_key poor)
const;
1016 bool _is_consistent_keyorder()
const;
1019 bool _is_consistent_poormankey()
const;
1022 void _update_btree_consecutive_skewed_insertions(
slotid_t slot);
1029 bool _check_space_for_insert(
size_t data_length);
1036 PageID foster_pid,
lsn_t foster_emlsn, int16_t btree_level,
1038 const w_keystr_t& chain_fence_high,
const bool ghost);
1064 _mode = _source->
_mode;
1072 _source->
_mode = _mode;
1076 _bufferpool_managed =
false;
1105 void print(ostream&,
const char*)
const;
1127 void print(ostream&,
const char*)
const;
1169 void print(ostream&,
const char*)
const;
1178 return page()->btree_root;
1182 return page()->btree_level;
1186 return page()->btree_pid0;
1190 return level() == 1;
1194 return level() == 2;
1202 return page()->btree_foster;
1206 return page()->btree_prefix_length;
1210 return page()->btree_fence_low_length;
1214 return page()->btree_fence_high_length;
1218 return page()->btree_chain_fence_high_length;
1222 return page()->item_data(0);
1226 return page()->item_data(0) + get_fence_low_length();
1230 return page()->item_data(0) + get_fence_low_length() + get_fence_high_length_noprefix();
1234 return get_fence_low_key();
1238 return page()->number_of_items() - 1;
1242 return page()->number_of_ghosts();
1246 return key.
compare_keystr(get_fence_low_key(), get_fence_low_length());
1255 get_fence_low_length() - get_prefix_length());
1263 size_t prefix_len = get_prefix_length();
1264 if (prefix_len > key_len) {
1274 get_fence_high_key_noprefix(), get_fence_high_length_noprefix());
1283 return key.
compare_keystr(get_chain_fence_high_key(), get_chain_fence_high_length());
1292 if (compare_with_fence_low(key) < 0) {
1296 if (!is_fence_high_supremum() && compare_with_fence_high(key) >= 0) {
1304 int ins = page()->btree_consecutive_skewed_insertions;
1306 || ins > nrecs() * 9 / 10
1307 || (ins > 1 && ins >= nrecs() - 1);
1311 return page()->btree_consecutive_skewed_insertions > 5;
1315 return page()->btree_consecutive_skewed_insertions < -5;
1322 return page()->item_child(slot + 1);
1327 return &page()->btree_foster;
1331 w_assert1(-2 < offset && offset < nrecs());
1334 return &page()->btree_pid0;
1338 return &page()->item_child(offset + 1);
1343 return page()->item_space(slot + 1);
1347 return page()->is_ghost(slot + 1);
1352 return data_sz - page()->usable_space();
1357 return page()->usable_space();
1366 const lsn_t& emlsn)
const {
1373 const cvec_t& trunc_key)
const {
1375 out_scratch = trunc_key.
size();
1376 out.
put(&out_scratch,
sizeof(out_scratch));
1382 const char* element,
size_t element_len)
const {
1383 _pack_leaf_record_prefix(out, out_scratch, trunc_key);
1384 out.
put(element, element_len);
1390 int new_prefix_len)
const {
1392 if (new_prefix_len >= 0) {
1394 prefix_len = new_prefix_len;
1421 int element_length)
const {
1422 return sizeof(
key_length_t) + trunc_key_length + element_length;
1426 size_t trunc_key_len)
const {
1427 if (trunc_key_len == 0) {
1429 }
else if (trunc_key_len == 1) {
1430 return (*reinterpret_cast<const unsigned char*>(trunc_key)) << 8;
1440 return _extract_poor_man_key(start, trunc_key.
size());
1445 size_t prefix_len)
const {
1446 w_assert1(prefix_len <= key_len_with_prefix);
1447 return _extract_poor_man_key(((
const char*)key_with_prefix) + prefix_len, key_len_with_prefix - prefix_len);
1457 return page()->item_poor(slot + 1);
1466 return (
const char*)data;
1473 len = page()->item_length(slot + 1) -
sizeof(
lsn_t);
1474 return page()->item_data(slot + 1);
1481 size_t key_noprefix_length;
1482 (void)_leaf_key_noprefix(slot, key_noprefix_length);
1488 size_t key_len)
const {
1492 curkey = _leaf_key_noprefix(slot, curkey_len);
1494 curkey = _node_key_noprefix(slot, curkey_len);
1506 return &page()->btree_pid0_emlsn;
1509 return &page()->btree_foster_emlsn;
1513 char* data = page()->item_data(pos);
1514 size_t len = page()->item_length(pos);
1516 len -=
sizeof(
lsn_t);
1517 return reinterpret_cast<lsn_t*
>(data + len);
1522 return *(
const_cast<btree_page_h*
>(
this)->emlsn_address(pos));
1526 *emlsn_address(pos) = lsn;
1530 return page()->btree_foster_emlsn;
1534 return page()->btree_pid0_emlsn;
1537 #endif // __BTREE_PAGE_H_H bool is_leaf() const
Is associated page a leaf?
Definition: btree_page_h.h:1189
Definition: btree_page_h.h:1110
base_stat_t used_bs
Definition: btree_page_h.h:1111
PageID btree_root() const
Definition: btree_page_h.h:239
Definition: logdef_gen.h:353
cvec_t & put(const cvec_t &v, size_t offset, size_t nbytes)
w_keystr_len_t common_leading_bytes(const w_keystr_t &r) const
Definition: w_key.h:399
bool is_ghost(slotid_t slot) const
Returns if the specified record is a ghost record.
Definition: btree_page_h.h:1346
bool _ghost_record
Definition: btree_page_h.h:76
fixable_page_h * _source
Definition: btree_page_h.h:1055
smsize_t usable_space() const
Definition: btree_page_h.h:1356
void copy_fence_high_key(w_keystr_t &buffer) const
Constructs w_keystr_t object containing the low-fence key of this page.
Definition: btree_page_h.h:318
size of region available to store items
Definition: btree_page.h:46
~btree_page_h()
Definition: btree_page_h.h:226
latch_mode_t _mode
Definition: fixable_page_h.h:255
base_stat_t unalloc_pg_cnt
Definition: btree_page_h.h:1152
const lsn_t & get_pid0_emlsn() const
Definition: btree_page_h.h:1533
cvec_t _elem
Definition: btree_page_h.h:87
size_t _element_offset(int slot) const
Definition: btree_page_h.h:1477
#define w_assert1(x)
Level 1 should not add significant extra time.
Definition: w_base.h:198
uint32_t smsize_t
Definition: basics.h:41
int compare_with_fence_high(const w_keystr_t &key) const
Definition: btree_page_h.h:1258
const unsigned char SIGN_POSINF
Definition: w_key.h:21
PageID * page_pointer_address(int offset)
Definition: btree_page_h.h:1325
int nghosts() const
Returns the number of ghosts records in this page.
Definition: btree_page_h.h:1241
w_base_t::base_stat_t base_stat_t
Definition: btree_page_h.h:16
int compare_with_fence_low_noprefix(const char *key, size_t key_len) const
used when the prefix part is already checked key/key_len must be WITHOUT prefix.
Definition: btree_page_h.h:1253
int16_t general_recordid_t
An integer to point to any record in B-tree pages.
Definition: basics.h:71
Page handle for B-Tree data page.
Definition: btree_page_h.h:185
void copy_fence_low_key(w_keystr_t &buffer) const
Constructs w_keystr_t object containing the low-fence key of this page.
Definition: btree_page_h.h:292
bool _bufferpool_managed
is our associated page managed by the buffer pool?
Definition: fixable_page_h.h:254
uint32_t StoreID
Definition: basics.h:47
base_stat_t unique_cnt
Definition: btree_page_h.h:1091
const lsn_t & get_emlsn_general(general_recordid_t pos) const
Definition: btree_page_h.h:1521
bool is_ghost_record() const
Definition: btree_page_h.h:69
Key string class which can represent a few special values.
Definition: w_key.h:47
btrec_t()
Definition: btree_page_h.h:39
_internal
Definition: btree_page_h.h:872
int16_t get_prefix_length() const
Returns the length of prefix key (0 means no prefix compression).
Definition: btree_page_h.h:1205
bool fence_contains(const w_keystr_t &key) const
Definition: btree_page_h.h:1290
const cvec_t & elem() const
Definition: btree_page_h.h:56
q_ticket_t _Q_ticket
Definition: fixable_page_h.h:257
uint16_t key_length_t
A field to hold a B-tree key length.
Definition: btree_page_h.h:870
static int compare_bin_str(const void *str1, int len1, const void *str2, int len2)
Definition: w_key.h:386
The internal implementation class which actually implements the functions of btree_m.
Definition: btree_impl.h:66
bool is_insertion_skewed_right() const
Definition: btree_page_h.h:1310
base_stat_t int_pg_cnt
Definition: btree_page_h.h:1138
uint64_t get_key(int sf, int specificPrefix, int tspread)
Definition: ycsb.cpp:29
base_stat_t data_bs
Definition: btree_page_h.h:1085
const char * get_prefix_key() const
Returns the prefix which is removed from all entries in this page.
Definition: btree_page_h.h:1233
A constant vec_t (meaning things pointed to cannot be changed).
Definition: vec_t.h:95
bool construct_from_keystr(const void *keystr, w_keystr_len_t length)
Definition: w_key.h:320
int32_t base_stat_t
Definition: w_base.h:296
Definition: btree_page_h.h:1133
int _compare_key_noprefix(slotid_t slot, const void *key_noprefix, size_t key_len) const
returns compare(specified-key, key_noprefix)
Definition: btree_page_h.h:1487
const char * get_fence_high_key_noprefix() const
Definition: btree_page_h.h:1225
bool is_insertion_extremely_skewed_right() const
Definition: btree_page_h.h:1302
Definition: logrec_support.h:19
size_t copy_to(void *p, size_t limit=0x7fffffff) const
int level() const
Returns 1 if leaf, >1 if non-leaf.
Definition: btree_page_h.h:1181
bool is_node() const
Returns if this page is NOT a leaf.
Definition: btree_page_h.h:1197
uint16_t poor_man_key
Poor man's normalized key type.
Definition: btree_page_h.h:961
btree_lf_stats_t()
Definition: btree_page_h.h:1093
btree_stats_t()
Definition: btree_page_h.h:1155
Represents a record in BTree.
Definition: btree_page_h.h:37
poor_man_key _extract_poor_man_key(const void *trunc_key, size_t trunc_key_len) const
Returns the value of poor-man's normalized key for the given key string WITHOUT prefix.
Definition: btree_page_h.h:1425
int compare_with_fence_low(const w_keystr_t &key) const
Definition: btree_page_h.h:1245
PageID i
Definition: btree_page_h.h:214
bool is_fence_low_infimum() const
Returns if the low-fence key is infimum.
Definition: btree_page_h.h:297
uint32_t PageID
Definition: basics.h:45
key_length_t pack_scratch_t
type of scratch space needed by _pack_leaf_record
Definition: btree_page_h.h:891
btree_page * page() const
Definition: btree_page_h.h:195
base_stat_t unlink_pg_cnt
Definition: btree_page_h.h:1139
size of all header fields combined
Definition: btree_page.h:41
uint16_t deserialize16_ho(const void *buf)
Definition: w_endian.h:82
poor_man_key _poor(int slot) const
Return poor man's key data for given slot.
Definition: btree_page_h.h:1455
Log Sequence Number. See Log Sequence Numbers (LSN).
Definition: lsn.h:243
btrec_t & operator=(const btrec_t &)
fixable_page_h & operator=(fixable_page_h &p)
Definition: fixable_page_h.h:45
int _pack_fence_rec(cvec_t &out, const w_keystr_t &low, const w_keystr_t &high, const w_keystr_t &chain, int new_prefix_len) const
Definition: btree_page_h.h:1387
bool is_leaf_parent() const
Definition: btree_page_h.h:1193
Handle class for pages that may be fixed (i.e., paged in by the main buffer manager, zero::buffer_pool::BufferPool)
Definition: fixable_page_h.h:26
base_stat_t entry_cnt
Definition: btree_page_h.h:1089
bool is_constructed() const
Definition: w_key.h:382
void _pack_leaf_record(cvec_t &out, pack_scratch_t &out_scratch, const cvec_t &trunc_key, const char *element, size_t element_len) const
Definition: btree_page_h.h:1380
btree page
Definition: generic_page.h:90
void set_emlsn_general(general_recordid_t pos, const lsn_t &lsn)
Sets the Expected Child LSN of pid0, foster-child, or real child.
Definition: btree_page_h.h:1525
Definition: btree_page_h.h:212
int16_t get_fence_high_length_noprefix() const
Returns the length of high fence key without prefix.
Definition: btree_page_h.h:313
void _pack_node_record(cvec_t &out, const cvec_t &trunc_key, const lsn_t &emlsn) const
Definition: btree_page_h.h:1365
borrowed_btree_page_h(fixable_page_h *source)
Definition: btree_page_h.h:1058
base_stat_t key_bs
Definition: btree_page_h.h:1084
~borrowed_btree_page_h()
Definition: btree_page_h.h:1069
int compare_keystr(const void *keystr, w_keystr_len_t length) const
Definition: w_key.h:428
void _pack_leaf_record_prefix(cvec_t &out, pack_scratch_t &out_scratch, const cvec_t &trunc_key) const
Definition: btree_page_h.h:1372
Definition: logdef_gen.h:322
base_stat_t entry_overhead_bs
Definition: btree_page_h.h:1086
size_t size() const
returns # bytes this vector references
Definition: vec_t.h:174
Return code for most functions and methods.
Definition: w_rc.h:87
base_stat_t leaf_pg_cnt
Definition: btree_page_h.h:1137
~btrec_t()
Definition: btree_page_h.h:43
int16_t slotid_t
Definition: basics.h:53
w_keystr_len_t get_length_as_keystr() const
Definition: w_key.h:508
const char * _node_key_noprefix(slotid_t slot, size_t &len) const
Definition: btree_page_h.h:1469
const unsigned char SIGN_NEGINF
Definition: w_key.h:17
btree_int_stats_t()
Definition: btree_page_h.h:1115
std::ostream & operator<<(std::ostream &os, const ConfigFile &cf)
Definition: confparser.cpp:83
void reserve_ghost(const w_keystr_t &key, size_t element_length)
Definition: btree_page_h.h:721
lsn_t * emlsn_address(general_recordid_t pos)
Definition: btree_page_h.h:1504
const w_keystr_t & key() const
Definition: btree_page_h.h:52
btree_int_stats_t int_pg
Definition: btree_page_h.h:1135
PageID root() const
Returns root page; used for recovery.
Definition: btree_page_h.h:1177
base_stat_t unused_bs
Definition: btree_page_h.h:1087
btree_page_h & operator=(btree_page_h &p)
Definition: btree_page_h.h:228
bool is_fence_high_supremum() const
Returns if the high-fence key is supremum.
Definition: btree_page_h.h:325
void copy_chain_fence_high_key(w_keystr_t &buffer) const
Constructs w_keystr_t object containing the low-fence key of this page.
Definition: btree_page_h.h:336
btree_page_h(const btree_page_h &p)
Definition: btree_page_h.h:224
Definition: btree_page_h.h:1082
const char * _leaf_key_noprefix(slotid_t slot, size_t &len) const
Definition: btree_page_h.h:1460
size_t _predict_leaf_data_length(int trunc_key_length, int element_length) const
Definition: btree_page_h.h:1420
base_stat_t level_cnt
Definition: btree_page_h.h:1153
size_t get_rec_space(int slot) const
Definition: btree_page_h.h:1341
const char * get_fence_low_key() const
Returns the low fence key, which is same OR smaller than all entries in this page and its descendants...
Definition: btree_page_h.h:1221
const char * get_chain_fence_high_key() const
Returns the high fence key of foster chain.
Definition: btree_page_h.h:1229
bool is_insertion_skewed_left() const
Definition: btree_page_h.h:1314
const lsn_t & get_foster_emlsn() const
Definition: btree_page_h.h:1529
PageID child_opaqueptr(slotid_t slot) const
Return the opaque child pointer of record in slot.
Definition: btree_page_h.h:1318
lsn_t _child_emlsn
Definition: btree_page_h.h:85
smsize_t used_space() const
Definition: btree_page_h.h:1351
smsize_t elen() const
Definition: btree_page_h.h:48
btree_lf_stats_t leaf_pg
Definition: btree_page_h.h:1134
const void * buffer_as_keystr() const
Definition: w_key.h:504
void search(const w_keystr_t &key, bool &found_key, slotid_t &return_slot) const
Definition: btree_page_h.h:600
PageID get_foster_opaqueptr() const
Returns opaque pointer of B-link page (0 if not linked).
Definition: btree_page_h.h:1201
generic_page * get_generic_page() const
return pointer to underlying page
Definition: generic_page.h:142
w_keystr_t _key
Definition: btree_page_h.h:78
Specialized variant of btree_page_h that borrows a B-tree page from a fixable_page_h.
Definition: btree_page_h.h:1054
btree_page_h()
Definition: btree_page_h.h:222
generic_page * _pp
The actual page we are handling; may be NULL for fixable pages.
Definition: generic_page.h:173
Definition: btree_logrec.h:140
PageID pid0_opaqueptr() const
Returns left-most opaque pointer (used only in non-leaf nodes).
Definition: btree_page_h.h:1185
static smsize_t max_entry_size
Definition: btree_page_h.h:862
int nrecs() const
Returns the number of records in this page.
Definition: btree_page_h.h:1237
int16_t get_fence_high_length() const
Returns the length of high fence key with prefix.
Definition: btree_page_h.h:1213
PageID _child
Definition: btree_page_h.h:80
base_stat_t hdr_bs
Definition: btree_page_h.h:1083
PageID child() const
returns the opaque version
Definition: btree_page_h.h:61
base_stat_t unused_bs
Definition: btree_page_h.h:1113
B-tree page.
Definition: btree_page.h:518
int16_t get_fence_low_length() const
Returns the length of low fence key.
Definition: btree_page_h.h:1209
int compare_with_chain_fence_high(const w_keystr_t &key) const
Definition: btree_page_h.h:1282
int16_t get_chain_fence_high_length() const
Returns the length of high fence key of foster chain.
Definition: btree_page_h.h:1217
const lsn_t & child_emlsn() const
Definition: btree_page_h.h:65
Definition: logdef_gen.h:309
Definition: btree_page_h.h:205
int compare_with_fence_high_noprefix(const char *key, size_t key_len) const
used when the prefix part is already checked key/key_len must be WITHOUT prefix.
Definition: btree_page_h.h:1278