Zero  0.1.0
stnode_page.h
Go to the documentation of this file.
1 /*
2  * (c) Copyright 2011-2013, Hewlett-Packard Development Company, LP
3  */
4 
5 #ifndef __STNODE_PAGE_H
6 #define __STNODE_PAGE_H
7 
8 #include <vector>
9 
10 #include "generic_page.h"
11 #include "latches.h"
12 #include "w_defines.h"
13 #include "sm_base.h"
14 #include "alloc_page.h"
15 
23 struct alignas(8) stnode_t {
25  stnode_t() : root(0),
26  last_extent(0),
27  clustered(false) {}
28 
35 
43 
48  bool clustered;
49 
50  bool is_used() const {
51  return root != 0;
52  }
53 };
54 
60 public:
61 
64  static constexpr size_t max =
65  (page_sz - sizeof(generic_page_header)) / sizeof(stnode_t);
66 
67  // Page ID used by the stnode page
68  static constexpr PageID stpid = 1;
69 
70  stnode_t get(size_t index) const {
71  w_assert1(index < max);
72  return stnode[index];
73  }
74 
75  void set_root(size_t index, PageID root) {
76  w_assert1(index < max);
77  stnode[index].root = root;
78  }
79 
80  void set_last_extent(size_t index, extent_id_t ext) {
81  w_assert1(index < max);
82  w_assert1(index == 0 || stnode[index].is_used());
83  stnode[index].last_extent = ext;
84  }
85 
86  extent_id_t get_last_extent(size_t index) {
87  w_assert1(index < max);
88  return stnode[index].last_extent;
89  }
90 
91  void format_empty() {
92  memset(this, 0, sizeof(generic_page_header));
93  pid = stnode_page::stpid;
94  tag = t_stnode_p;
95 
96  memset(&stnode, 0, sizeof(stnode_t) * max);
97  }
98 
99  // Used to generate page_img_format log records.
100  char* unused_part(size_t& length) {
101  size_t first_unused = 0;
102  for (size_t i = 1; i < stnode_page::max; ++i) {
103  if (!stnode[i].is_used()) {
104  first_unused = i;
105  break;
106  }
107  }
108  std::cout << "first unused store: " << first_unused << std::endl;
109  char* unused = reinterpret_cast<char*>(&(stnode[first_unused]));
110  char* page_begin = reinterpret_cast<char*>(this);
111  length = (page_begin + sizeof(stnode_page)) - unused;
112  return unused;
113  }
114 
115 private:
117  stnode_t stnode[max];
118 };
119 
121 
138 public:
139  stnode_cache_t(bool virgin);
140 
146  PageID get_root_pid(StoreID store) const;
147 
148  lsn_t get_root_elmsn(StoreID store) const;
149 
150  bool is_allocated(StoreID store) const;
151 
153  stnode_t get_stnode(StoreID store) const;
154 
156  void get_used_stores(std::vector<StoreID>&) const;
157 
158  rc_t sx_create_store(PageID root_pid, StoreID& snum) const;
159 
160  rc_t sx_append_extent(StoreID store, extent_id_t ext) const;
161 
162  void dump(std::ostream& out) const;
163 
164  extent_id_t get_last_extent(StoreID stid) const;
165 
166 private:
170  StoreID get_min_unused_stid(stnode_page* spage) const;
171 };
172 
173 #endif // __STNODE_PAGE_H
Persistent structure representing metadata for a store.
Definition: stnode_page.h:23
extent_id_t get_last_extent(size_t index)
Definition: stnode_page.h:86
static constexpr size_t max
Definition: stnode_page.h:64
PageID root
Definition: stnode_page.h:34
#define w_assert1(x)
Level 1 should not add significant extra time.
Definition: w_base.h:198
uint32_t StoreID
Definition: basics.h:47
Page headers shared by all Zero pages.
Definition: generic_page.h:34
void set_last_extent(size_t index, extent_id_t ext)
Definition: stnode_page.h:80
uint32_t extent_id_t
Definition: alloc_page.h:12
extent_id_t last_extent
Definition: stnode_page.h:42
uint32_t PageID
Definition: basics.h:45
Log Sequence Number. See Log Sequence Numbers (LSN).
Definition: lsn.h:243
const T max(const T x, const T y)
Definition: w_minmax.h:45
Store creation/destroy/query interface.
Definition: stnode_page.h:137
void set_root(size_t index, PageID root)
Definition: stnode_page.h:75
char * unused_part(size_t &length)
Definition: stnode_page.h:100
Return code for most functions and methods.
Definition: w_rc.h:87
BOOST_STATIC_ASSERT(sizeof(stnode_page)==generic_page_header::page_sz)
bool clustered
Definition: stnode_page.h:48
static constexpr PageID stpid
Definition: stnode_page.h:68
Store-node page that contains one stnode_t for each (possibly deleted or uncreated) store belonging t...
Definition: stnode_page.h:59
store node page
Definition: generic_page.h:89
void format_empty()
Definition: stnode_page.h:91
stnode_t()
also okay to initialize via memset
Definition: stnode_page.h:25
static const size_t page_sz
Size of all Zero pages.
Definition: generic_page.h:37
bool is_used() const
Definition: stnode_page.h:50