Zero  0.1.0
btree_logrec.h
Go to the documentation of this file.
1 /*
2  * (c) Copyright 2011-2014, Hewlett-Packard Development Company, LP
3  */
4 
10 #ifndef __BTREE_LOGREC_H
11 #define __BTREE_LOGREC_H
12 
13 #include "w_defines.h"
14 
15 #define SM_SOURCE
16 #define LOGREC_C
17 
18 #include "sm_base.h"
19 #include "btree_page_h.h"
20 #include "btree_impl.h"
21 #include "lock.h"
22 #include "log_core.h"
23 #include "vec_t.h"
24 #include "tls.h"
25 #include "block_alloc.h"
26 #include "restart.h"
27 
28 #include "logdef_gen.h"
29 
30 
35 DECLARE_TLS(block_alloc<generic_page>, scratch_space_pool);
36 
44  p = new(*scratch_space_pool) generic_page();
45  ::memset(p, 0, sizeof(generic_page));
46  p->tag = t_btree_p;
47  p->store = store;
48  p->pid = pid;
49  p->lsn = lsn_t::null;
50  }
51 
53  scratch_space_pool->destroy_object(p);
54  }
55 
57 };
58 
61 
62  uint16_t klen;
63 
64  uint16_t elen;
65 
66  bool sys_txn; // True if the insertion was from a page rebalance full logging operation
67  char data[logrec_t::max_data_sz - sizeof(PageID) - 2 * sizeof(int16_t) - sizeof(bool)];
68 
69  btree_insert_t(PageID root, const w_keystr_t& key,
70  const cvec_t& el, bool is_sys_txn)
71  : klen(key.get_length_as_keystr()),
72  elen(el.size()) {
73  root_shpid = root;
74  w_assert1((size_t)(klen + elen) < sizeof(data));
75  key.serialize_as_keystr(data);
76  el.copy_to(data + klen);
77  sys_txn = is_sys_txn;
78  }
79 
80  int size() {
81  return sizeof(PageID) + 2 * sizeof(int16_t) + klen + elen + sizeof(bool);
82  }
83 };
84 
87 
88  uint16_t _klen;
89 
90  uint16_t _old_elen;
91 
92  uint16_t _new_elen;
93 
94  char _data[logrec_t::max_data_sz - sizeof(PageID) - 3 * sizeof(int16_t)];
95 
96  btree_update_t(PageID root_pid, const w_keystr_t& key,
97  const char* old_el, int old_elen, const cvec_t& new_el) {
98  _root_shpid = root_pid;
99  _klen = key.get_length_as_keystr();
100  _old_elen = old_elen;
101  _new_elen = new_el.size();
102  key.serialize_as_keystr(_data);
103  ::memcpy(_data + _klen, old_el, old_elen);
104  new_el.copy_to(_data + _klen + _old_elen);
105  }
106 
107  int size() {
108  return sizeof(PageID) + 3 * sizeof(int16_t) + _klen + _old_elen + _new_elen;
109  }
110 };
111 
114 
115  uint16_t _klen;
116 
117  uint16_t _offset;
118 
119  uint16_t _elen;
120 
121  char _data[logrec_t::max_data_sz - sizeof(PageID) - 3 * sizeof(int16_t)];
122 
123  btree_overwrite_t(const btree_page_h& page, const w_keystr_t& key,
124  const char* old_el, const char* new_el, size_t offset, size_t elen) {
125  _root_shpid = page.btree_root();
126  _klen = key.get_length_as_keystr();
127  _offset = offset;
128  _elen = elen;
129  key.serialize_as_keystr(_data);
130  ::memcpy(_data + _klen, old_el + offset, elen);
131  ::memcpy(_data + _klen + elen, new_el, elen);
132  }
133 
134  int size() {
135  return sizeof(PageID) + 3 * sizeof(int16_t) + _klen + _elen * 2;
136  }
137 };
138 
139 template<class PagePtr>
142 
143  uint16_t sys_txn : 1, // 1 if the insertion was from a page rebalance full logging operation
144  cnt : 15;
145 
146  uint16_t prefix_offset;
147 
149 
150  // list of [offset], and then list of [length, string-data WITHOUT prefix]
151  // this is analogous to BTree page structure on purpose.
152  // by doing so, we can guarantee the total size is <data_sz.
153  // because one log should be coming from just one page.
154  char slot_data[logrec_t::max_data_sz - sizeof(PageID)
155  - sizeof(uint16_t) * 2 - sizeof(size_t)];
156 
157  btree_ghost_t(const PagePtr p, const vector<slotid_t>& slots, const bool is_sys_txn) {
158  root_shpid = p->root();
159  cnt = slots.size();
160  if (true == is_sys_txn) {
161  sys_txn = 1;
162  } else {
163  sys_txn = 0;
164  }
165  uint16_t* offsets = reinterpret_cast<uint16_t*>(slot_data);
166  char* current = slot_data + sizeof(uint16_t) * slots.size();
167 
168  // the first data is prefix
169  {
170  uint16_t prefix_len = p->get_prefix_length();
171  prefix_offset = (current - slot_data);
172  // *reinterpret_cast<uint16_t*>(current) = prefix_len; this causes Bus Error on solaris! so, instead:
173  ::memcpy(current, &prefix_len, sizeof(uint16_t));
174  if (prefix_len > 0) {
175  ::memcpy(current + sizeof(uint16_t), p->get_prefix_key(), prefix_len);
176  }
177  current += sizeof(uint16_t) + prefix_len;
178  }
179 
180  for (size_t i = 0; i < slots.size(); ++i) {
181  size_t len;
182  w_assert3(p->is_leaf()); // ghost exists only in leaf
183  const char* key = p->_leaf_key_noprefix(slots[i], len);
184  offsets[i] = (current - slot_data);
185  // *reinterpret_cast<uint16_t*>(current) = len; this causes Bus Error on solaris! so, instead:
186  uint16_t len_u16 = (uint16_t)len;
187  ::memcpy(current, &len_u16, sizeof(uint16_t));
188  ::memcpy(current + sizeof(uint16_t), key, len);
189  current += sizeof(uint16_t) + len;
190  }
191  total_data_size = current - slot_data;
192  w_assert0(logrec_t::max_data_sz >= sizeof(PageID) + sizeof(uint16_t) * 2 + sizeof(size_t) + total_data_size);
193  }
194 
195  w_keystr_t get_key(size_t i) const {
196  w_keystr_t result;
197  uint16_t prefix_len;
198  // = *reinterpret_cast<const uint16_t*>(slot_data + prefix_offset); this causes Bus Error on solaris
199  ::memcpy(&prefix_len, slot_data + prefix_offset, sizeof(uint16_t));
200  w_assert1 (prefix_offset < sizeof(slot_data));
201  w_assert1 (prefix_len < sizeof(slot_data));
202  const char* prefix_key = slot_data + prefix_offset + sizeof(uint16_t);
203  uint16_t offset = reinterpret_cast<const uint16_t*>(slot_data)[i];
204  w_assert1 (offset < sizeof(slot_data));
205  uint16_t len;
206  // = *reinterpret_cast<const uint16_t*>(slot_data + offset); this causes Bus Error on solaris
207  ::memcpy(&len, slot_data + offset, sizeof(uint16_t));
208  w_assert1 (len < sizeof(slot_data));
209  const char* key = slot_data + offset + sizeof(uint16_t);
210  result.construct_from_keystr(prefix_key, prefix_len, key, len);
211  return result;
212  }
213 
214  int size() {
215  return sizeof(PageID) + sizeof(uint16_t) * 2 + sizeof(size_t) + total_data_size;
216  }
217 };
218 
220  uint16_t klen;
221 
222  uint16_t element_length;
223 
224  char data[logrec_t::max_data_sz - sizeof(uint16_t) * 2];
225 
226  btree_ghost_reserve_t(const w_keystr_t& key, int elem_length)
227  : klen(key.get_length_as_keystr()),
228  element_length(elem_length) {
229  key.serialize_as_keystr(data);
230  }
231 
232  int size() {
233  return sizeof(uint16_t) * 2 + klen;
234  }
235 };
236 
241 template<class PagePtr>
243  btree_norec_alloc_t(const PagePtr p,
244  PageID new_page_id, const w_keystr_t& fence, const w_keystr_t& chain_fence_high)
245  : multi_page_log_t(new_page_id) {
246  w_assert1 (smthread_t::xct()->is_single_log_sys_xct());
247  w_assert1 (new_page_id != p->btree_root());
248  w_assert1 (p->latch_mode() != LATCH_NL);
249 
250  _root_pid = p->btree_root();
251  _foster_pid = p->get_foster();
252  _foster_emlsn = p->get_foster_emlsn();
253  _fence_len = (uint16_t)fence.get_length_as_keystr();
254  _chain_high_len = (uint16_t)chain_fence_high.get_length_as_keystr();
255  _btree_level = (int16_t)p->level();
257 
258  fence.serialize_as_keystr(_data);
259  chain_fence_high.serialize_as_keystr(_data + _fence_len);
260  }
261 
262  PageID _root_pid, _foster_pid; // +4+4 => 8
263  lsn_t _foster_emlsn; // +8 => 16
264  uint16_t _fence_len, _chain_high_len; // +2+2 => 20
265  int16_t _btree_level; // +2 => 22
267  char _data[logrec_t::max_data_sz - sizeof(multi_page_log_t) - 22];
268 
269  int size() const {
270  return sizeof(multi_page_log_t) + 22 + _fence_len + _chain_high_len;
271  }
272 };
273 
281  int16_t _new_child_key_len; // +2
282  char _data[logrec_t::max_data_sz - sizeof(multi_page_log_t) - 14];
283 
284  btree_foster_adopt_t(PageID page2_id, PageID new_child_pid,
285  lsn_t new_child_emlsn, const w_keystr_t& new_child_key)
286  : multi_page_log_t(page2_id),
287  _new_child_emlsn(new_child_emlsn),
288  _new_child_pid(new_child_pid) {
289  _new_child_key_len = new_child_key.get_length_as_keystr();
290  new_child_key.serialize_as_keystr(_data);
291  }
292 
293  int size() const {
294  return sizeof(multi_page_log_t) + 14 + _new_child_key_len;
295  }
296 };
297 
304  uint16_t move_count;
305 
307 
308  uint16_t new_chain_len;
309 
311 
313 
314  enum {
315  fields_sz = sizeof(multi_page_log_t)
316  + sizeof(uint16_t) * 4 // 3 uints + fill
317  + sizeof(PageID)
318  };
319 
320  char _data[logrec_t::max_data_sz - fields_sz];
321 
322  btree_bulk_delete_t(PageID foster_parent, PageID new_foster_child,
323  uint16_t move_count, const w_keystr_t& new_high_fence,
324  const w_keystr_t& new_chain)
325  : multi_page_log_t(foster_parent),
326  move_count(move_count),
327  new_foster_child(new_foster_child) {
328  new_high_fence_len = new_high_fence.get_length_as_keystr();
329  new_chain_len = new_chain.get_length_as_keystr();
330 
331  new_high_fence.serialize_as_keystr(_data);
332  new_chain.serialize_as_keystr(_data + new_high_fence_len);
333  }
334 
335  // Constructs empty logrec
336  btree_bulk_delete_t(PageID foster_parent, PageID foster_child) :
337  multi_page_log_t(foster_parent),
338  move_count(0),
339  new_high_fence_len(0),
340  new_chain_len(0),
341  new_foster_child(foster_child) {}
342 
343  size_t size() {
344  return fields_sz + new_high_fence_len + new_chain_len;
345  }
346 
347  void get_keys(w_keystr_t& new_high_fence, w_keystr_t& new_chain) {
348  new_high_fence.construct_from_keystr(_data, new_high_fence_len);
349  new_chain.construct_from_keystr(_data + new_high_fence_len,
350  new_chain_len);
351  }
352 };
353 
354 #endif // __BTREE_LOGREC_H
Definition: btree_logrec.h:42
PageID btree_root() const
Definition: btree_page_h.h:239
fill2 _fill
Definition: btree_logrec.h:310
uint16_t element_length
Definition: btree_logrec.h:222
static xct_t * xct()
return xct this thread is running
Definition: smthread.h:364
int16_t _new_child_key_len
Definition: btree_logrec.h:281
Definition: btree_logrec.h:303
int size() const
Definition: btree_logrec.h:269
lsn_t _new_child_emlsn
Definition: btree_logrec.h:279
#define w_assert1(x)
Level 1 should not add significant extra time.
Definition: w_base.h:198
uint16_t klen
Definition: btree_logrec.h:62
btree_bulk_delete_t(PageID foster_parent, PageID foster_child)
Definition: btree_logrec.h:336
uint16_t _old_elen
Definition: btree_logrec.h:90
int size()
Definition: btree_logrec.h:107
btree_ghost_reserve_t(const w_keystr_t &key, int elem_length)
Definition: btree_logrec.h:226
Page handle for B-Tree data page.
Definition: btree_page_h.h:185
size_t total_data_size
Definition: btree_logrec.h:148
PageID pid
ID of this page.
Definition: generic_page.h:51
#define w_assert3(x)
Level 3 definitely adds significant time.
Definition: w_base.h:214
Definition: latch.h:80
uint32_t StoreID
Definition: basics.h:47
A generic page view: any Zero page can be viewed as being of this type but it only exposes fields sha...
Definition: generic_page.h:121
Key string class which can represent a few special values.
Definition: w_key.h:47
DECLARE_TLS(block_alloc< generic_page >, scratch_space_pool)
Definition: btree_logrec.h:85
Base struct for log records that touch multi-pages.
Definition: logrec.h:463
lsn_t lsn
LSN (Log Sequence Number) of the last write to this page.
Definition: generic_page.h:54
static const lsn_t null
Definition: lsn.h:371
uint16_t _offset
Definition: btree_logrec.h:117
Definition: btree_logrec.h:59
int size()
Definition: btree_logrec.h:232
A constant vec_t (meaning things pointed to cannot be changed).
Definition: vec_t.h:95
btree_insert_t(PageID root, const w_keystr_t &key, const cvec_t &el, bool is_sys_txn)
Definition: btree_logrec.h:69
bool construct_from_keystr(const void *keystr, w_keystr_len_t length)
Definition: w_key.h:320
uint16_t new_chain_len
Definition: btree_logrec.h:308
uint16_t tag
Page type (a page_tag_t)
Definition: generic_page.h:60
PageID _root_shpid
Definition: btree_logrec.h:86
size_t copy_to(void *p, size_t limit=0x7fffffff) const
PageID _root_pid
Definition: btree_logrec.h:262
uint32_t PageID
Definition: basics.h:45
void serialize_as_keystr(void *buffer) const
Definition: w_key.h:495
#define w_assert0(x)
Default assert/debug level is 0.
Definition: w_base.h:175
PageID _new_child_pid
Definition: btree_logrec.h:280
uint16_t new_high_fence_len
Definition: btree_logrec.h:306
Log Sequence Number. See Log Sequence Numbers (LSN).
Definition: lsn.h:243
Definition: logrec.h:259
uint16_t _new_elen
Definition: btree_logrec.h:92
int16_t _btree_level
Definition: btree_logrec.h:265
btree page
Definition: generic_page.h:90
StoreID store
ID of the store to which this page belongs (0 if none)
Definition: generic_page.h:57
int size()
Definition: btree_logrec.h:134
size_t size()
Definition: btree_logrec.h:343
uint16_t _fence_len
Definition: btree_logrec.h:264
uint16_t prefix_offset
Definition: btree_logrec.h:146
btree_ghost_t(const PagePtr p, const vector< slotid_t > &slots, const bool is_sys_txn)
Definition: btree_logrec.h:157
size_t size() const
returns # bytes this vector references
Definition: vec_t.h:174
int size()
Definition: btree_logrec.h:214
btree_update_t(PageID root_pid, const w_keystr_t &key, const char *old_el, int old_elen, const cvec_t &new_el)
Definition: btree_logrec.h:96
uint16_t elen
Definition: btree_logrec.h:64
btree_overwrite_t(const btree_page_h &page, const w_keystr_t &key, const char *old_el, const char *new_el, size_t offset, size_t elen)
Definition: btree_logrec.h:123
uint16_t _elen
Definition: btree_logrec.h:119
w_keystr_len_t get_length_as_keystr() const
Definition: w_key.h:508
PageID root_shpid
Definition: btree_logrec.h:60
lsn_t _foster_emlsn
Definition: btree_logrec.h:263
btree_bulk_delete_t(PageID foster_parent, PageID new_foster_child, uint16_t move_count, const w_keystr_t &new_high_fence, const w_keystr_t &new_chain)
Definition: btree_logrec.h:322
Definition: btree_logrec.h:278
void get_keys(w_keystr_t &new_high_fence, w_keystr_t &new_chain)
Definition: btree_logrec.h:347
Definition: w_fill.h:48
Definition: btree_logrec.h:242
uint16_t klen
Definition: btree_logrec.h:220
int size() const
Definition: btree_logrec.h:293
btree_foster_adopt_t(PageID page2_id, PageID new_child_pid, lsn_t new_child_emlsn, const w_keystr_t &new_child_key)
Definition: btree_logrec.h:284
SprScratchSpace(StoreID store, PageID pid)
Definition: btree_logrec.h:43
PageID _root_shpid
Definition: btree_logrec.h:113
PageID new_foster_child
Definition: btree_logrec.h:312
generic_page * p
Definition: btree_logrec.h:56
Definition: btree_logrec.h:219
uint16_t move_count
Definition: btree_logrec.h:304
Definition: btree_logrec.h:112
w_keystr_t get_key(size_t i) const
Definition: btree_logrec.h:195
~SprScratchSpace()
Definition: btree_logrec.h:52
btree_norec_alloc_t(const PagePtr p, PageID new_page_id, const w_keystr_t &fence, const w_keystr_t &chain_fence_high)
Definition: btree_logrec.h:243
Definition: btree_logrec.h:140
int size()
Definition: btree_logrec.h:80
PageID root_shpid
Definition: btree_logrec.h:141
bool sys_txn
Definition: btree_logrec.h:66
uint16_t _klen
Definition: btree_logrec.h:115
uint16_t _klen
Definition: btree_logrec.h:88