CUBRID Engine  latest
page_buffer.h
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 
20 /*
21  * page_buffer.h - PAGE BUFFER MANAGMENT MODULE (AT SERVER)
22  */
23 
24 #ifndef _PAGE_BUFFER_H_
25 #define _PAGE_BUFFER_H_
26 
27 #ident "$Id$"
28 
29 #include "config.h"
30 
31 #include "error_manager.h"
32 #include "disk_manager.h"
33 #include "lock_manager.h"
34 #include "log_lsa.hpp"
35 #include "mem_block.hpp"
36 #include "perf_monitor.h"
37 #include "storage_common.h"
38 #include "tde.h"
39 
40 #define FREE true /* Free page buffer */
41 #define DONT_FREE false /* Don't free the page buffer */
42 
43 extern const VPID vpid_Null_vpid;
44 
45 /* Get page VPID for OID */
46 #define VPID_GET_FROM_OID(vpid_ptr, oid_ptr) \
47  VPID_SET (vpid_ptr, (oid_ptr)->volid, (oid_ptr)->pageid);
48 /* Check if OID's are on the same page */
49 #define VPID_EQ_FOR_OIDS(oid_ptr1, oid_ptr2) \
50  (((oid_ptr1)->volid == (oid_ptr2)->volid) \
51  && ((oid_ptr1)->pageid == (oid_ptr2)->pageid))
52 
53 #define PGBUF_PAGE_VPID_AS_ARGS(pg) pgbuf_get_volume_id (pg), pgbuf_get_page_id (pg)
54 #define PGBUF_PAGE_LSA_AS_ARGS(pg) (long long int) pgbuf_get_lsa (pg)->pageid, (int) pgbuf_get_lsa (pg)->offset
55 
56 #define PGBUF_PAGE_STATE_MSG(name) name " { VPID = %d|%d, crt_lsa = %lld|%d } "
57 #define PGBUF_PAGE_STATE_ARGS(pg) PGBUF_PAGE_VPID_AS_ARGS (pg), PGBUF_PAGE_LSA_AS_ARGS (pg)
58 
59 #define PGBUF_PAGE_MODIFY_MSG(name) name " { VPID = %d|%d, prev_lsa = %lld|%d, crt_lsa = %lld|%d } "
60 #define PGBUF_PAGE_MODIFY_ARGS(pg, prev_lsa) \
61  PGBUF_PAGE_VPID_AS_ARGS (pg), LSA_AS_ARGS (prev_lsa), PGBUF_PAGE_LSA_AS_ARGS (pg)
62 
63 #define pgbuf_unfix_and_init(thread_p, pgptr) \
64  do { \
65  pgbuf_unfix ((thread_p), (pgptr)); \
66  (pgptr) = NULL; \
67  } while (0)
68 
69 #define pgbuf_ordered_unfix_and_init(thread_p, page, pg_watcher) \
70  do { \
71  if ((pg_watcher) != NULL) \
72  { \
73  assert ((page) == (pg_watcher)->pgptr); \
74  pgbuf_ordered_unfix ((thread_p), (pg_watcher)); \
75  (pg_watcher)->pgptr = NULL; \
76  } \
77  else \
78  { \
79  pgbuf_unfix_and_init ((thread_p), (page)); \
80  } \
81  (page) = NULL; \
82  } while (0)
83 
84 #define PGBUF_WATCHER_MAGIC_NUMBER 0x12345678
85 #define PGBUF_ORDERED_NULL_HFID (pgbuf_ordered_null_hfid)
86 
87 #define PGBUF_WATCHER_SET_GROUP(w,hfid) \
88  do { \
89  if ((hfid) == NULL || (hfid)->vfid.volid == NULL_VOLID \
90  || (hfid)->hpgid == NULL_PAGEID || HFID_IS_NULL (hfid)) \
91  { \
92  VPID_SET_NULL (&((w)->group_id)); \
93  } \
94  else \
95  { \
96  (w)->group_id.volid = (hfid)->vfid.volid; \
97  (w)->group_id.pageid = (hfid)->hpgid; \
98  } \
99  } while (0)
100 
101 #define PGBUF_WATCHER_COPY_GROUP(w_dst,w_src) \
102  do { \
103  assert ((w_src) != NULL); \
104  assert ((w_dst) != NULL); \
105  assert (!VPID_ISNULL (&((w_src)->group_id))); \
106  VPID_COPY (&((w_dst)->group_id), &((w_src)->group_id)); \
107  } while (0)
108 
109 #define PGBUF_WATCHER_RESET_RANK(w,rank) \
110  do { \
111  (w)->initial_rank = (rank); \
112  } while (0)
113 
114 #if !defined(NDEBUG)
115 #define PGBUF_CLEAR_WATCHER(w) \
116  do { \
117  (w)->next = NULL; \
118  (w)->prev = NULL; \
119  (w)->pgptr = NULL; \
120  pgbuf_watcher_init_debug ((w), __FILE__, __LINE__, false); \
121  } while (0)
122 
123 #define PGBUF_INIT_WATCHER(w,rank,hfid) \
124  do { \
125  PGBUF_CLEAR_WATCHER (w); \
126  (w)->latch_mode = PGBUF_NO_LATCH; \
127  (w)->page_was_unfixed = false; \
128  (w)->initial_rank = (rank); \
129  (w)->curr_rank = PGBUF_ORDERED_RANK_UNDEFINED; \
130  PGBUF_WATCHER_SET_GROUP ((w), (hfid)); \
131  (w)->watched_at[0] = '\0'; \
132  (w)->magic = PGBUF_WATCHER_MAGIC_NUMBER; \
133  } while (0)
134 #else
135 #define PGBUF_CLEAR_WATCHER(w) \
136  do { \
137  (w)->next = NULL; \
138  (w)->prev = NULL; \
139  (w)->pgptr = NULL; \
140  } while (0)
141 
142 #define PGBUF_INIT_WATCHER(w,rank,hfid) \
143  do { \
144  PGBUF_CLEAR_WATCHER (w); \
145  (w)->latch_mode = PGBUF_NO_LATCH; \
146  (w)->page_was_unfixed = false; \
147  (w)->initial_rank = (rank); \
148  (w)->curr_rank = PGBUF_ORDERED_RANK_UNDEFINED; \
149  PGBUF_WATCHER_SET_GROUP ((w), (hfid)); \
150  } while (0)
151 #endif
152 
153 #define PGBUF_IS_CLEAN_WATCHER(w) (((w) != NULL && (w)->next == NULL \
154  && (w)->prev == NULL && (w)->pgptr == NULL) ? true : false)
155 
156 #define PGBUF_IS_ORDERED_PAGETYPE(ptype) \
157  ((ptype) == PAGE_HEAP || (ptype) == PAGE_OVERFLOW)
158 
159 
160 typedef enum
161 {
162  OLD_PAGE = 0, /* Fetch page that should be allocated and already existing either in page buffer or on
163  * disk. Must pass validation test and must be fixed from disk if it doesn't exist in
164  * buffer. */
165  NEW_PAGE, /* Fetch newly allocated page. Must pass validation test but it can be created directly
166  * in buffer without fixing from disk. */
167  OLD_PAGE_IF_IN_BUFFER, /* Fetch existing page only if is valid and if it exists in page buffer. Page may be
168  * deallocated or flushed and invalidated from buffer, in which case fixing page is not
169  * necessary. */
170  OLD_PAGE_PREVENT_DEALLOC, /* Fetch existing page and mark its memory buffer, to prevent deallocation. */
171  OLD_PAGE_DEALLOCATED, /* Fetch page that has been deallocated. */
172  OLD_PAGE_MAYBE_DEALLOCATED, /* Fetch page that maybe was deallocated. */
174 
175 /* public page latch mode */
176 typedef enum
177 {
181  PGBUF_LATCH_FLUSH, /* this is only used as block mode. page can never be fixed with flush latch mode. */
184 
185 typedef enum
186 {
190 
191 typedef enum
192 {
196 
197 typedef enum
198 {
204 
205 /* priority of ordered page fix:
206  * this allows us to keep pages with more priority fixed even when VPID order
207  * would require to make unfix, reorder and fix in VPID order */
208 typedef enum
209 {
213 
216 
218 
221 {
225  PGBUF_ORDERED_GROUP group_id; /* VPID of group (HEAP header) */
226  unsigned latch_mode:7;
227  unsigned page_was_unfixed:1; /* set true if any refix occurs in this page */
228  unsigned initial_rank:4; /* rank of page at init (before fix) */
229  unsigned curr_rank:4; /* current rank of page (after fix) */
230 #if !defined (NDEBUG)
231  unsigned int magic;
232  char watched_at[128];
233  char init_at[256];
234 #endif
235 };
236 
237 // *INDENT-OFF*
240 // *INDENT-ON*
241 
243 
245 
246 extern unsigned int pgbuf_hash_vpid (const void *key_vpid, unsigned int htsize);
247 extern int pgbuf_compare_vpid (const void *key_vpid1, const void *key_vpid2);
248 extern int pgbuf_initialize (void);
249 extern void pgbuf_finalize (void);
251  PGBUF_LATCH_MODE request_mode, int retry);
252 extern void pgbuf_flush (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, bool free_page);
253 #if !defined(NDEBUG)
254 
255 #define pgbuf_fix(thread_p, vpid, fetch_mode, requestmode, condition) \
256  pgbuf_fix_debug(thread_p, vpid, fetch_mode, requestmode, condition, \
257  __FILE__, __LINE__)
258 extern PAGE_PTR pgbuf_fix_debug (THREAD_ENTRY * thread_p, const VPID * vpid, PAGE_FETCH_MODE fetch_mode,
259  PGBUF_LATCH_MODE requestmode, PGBUF_LATCH_CONDITION condition, const char *caller_file,
260  int caller_line);
261 #define pgbuf_ordered_fix(thread_p, req_vpid, fetch_mode, requestmode,\
262  req_watcher) \
263  pgbuf_ordered_fix_debug(thread_p, req_vpid, fetch_mode, requestmode, \
264  req_watcher, __FILE__, __LINE__)
265 
266 extern int pgbuf_ordered_fix_debug (THREAD_ENTRY * thread_p, const VPID * req_vpid, PAGE_FETCH_MODE fetch_mode,
267  const PGBUF_LATCH_MODE requestmode, PGBUF_WATCHER * req_watcher,
268  const char *caller_file, int caller_line);
269 
270 #define pgbuf_promote_read_latch(thread_p, pgptr_p, condition) \
271  pgbuf_promote_read_latch_debug(thread_p, pgptr_p, condition, \
272  __FILE__, __LINE__)
273 extern int pgbuf_promote_read_latch_debug (THREAD_ENTRY * thread_p, PAGE_PTR * pgptr_p,
274  PGBUF_PROMOTE_CONDITION condition, const char *caller_file, int caller_line);
275 
276 #define pgbuf_unfix(thread_p, pgptr) \
277  pgbuf_unfix_debug(thread_p, pgptr, __FILE__, __LINE__)
278 extern void pgbuf_unfix_debug (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, const char *caller_file, int caller_line);
279 
280 #define pgbuf_ordered_unfix(thread_p, watcher_object) \
281  pgbuf_ordered_unfix_debug(thread_p, watcher_object, \
282  __FILE__, __LINE__)
283 extern void pgbuf_ordered_unfix_debug (THREAD_ENTRY * thread_p, PGBUF_WATCHER * watcher_object, const char *caller_file,
284  int caller_line);
285 
286 #define pgbuf_invalidate_all(thread_p, volid) \
287  pgbuf_invalidate_all_debug(thread_p, volid, __FILE__, __LINE__)
288 extern int pgbuf_invalidate_all_debug (THREAD_ENTRY * thread_p, VOLID volid, const char *caller_file, int caller_line);
289 
290 #define pgbuf_invalidate(thread_p, pgptr) \
291  pgbuf_invalidate_debug(thread_p, pgptr, __FILE__, __LINE__)
292 extern int pgbuf_invalidate_debug (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, const char *caller_file, int caller_line);
293 #else /* NDEBUG */
294 #define pgbuf_fix_without_validation(thread_p, vpid, fetch_mode, \
295  requestmode, condition) \
296  pgbuf_fix_without_validation_release(thread_p, vpid, fetch_mode, \
297  requestmode, condition)
298 extern PAGE_PTR pgbuf_fix_without_validation_release (THREAD_ENTRY * thread_p, const VPID * vpid,
300  PGBUF_LATCH_CONDITION condition);
301 #define pgbuf_fix(thread_p, vpid, fetch_mode, requestmode, condition) \
302  pgbuf_fix_release(thread_p, vpid, fetch_mode, requestmode, condition)
303 extern PAGE_PTR pgbuf_fix_release (THREAD_ENTRY * thread_p, const VPID * vpid, PAGE_FETCH_MODE fetch_mode,
304  PGBUF_LATCH_MODE requestmode, PGBUF_LATCH_CONDITION condition);
305 
306 #define pgbuf_ordered_fix(thread_p, req_vpid, fetch_mode, requestmode, \
307  req_watcher) \
308  pgbuf_ordered_fix_release(thread_p, req_vpid, fetch_mode, requestmode, \
309  req_watcher)
310 
311 extern int pgbuf_ordered_fix_release (THREAD_ENTRY * thread_p, const VPID * req_vpid, PAGE_FETCH_MODE fetch_mode,
312  const PGBUF_LATCH_MODE requestmode, PGBUF_WATCHER * watcher_object);
313 
314 #define pgbuf_promote_read_latch(thread_p, pgptr_p, condition) \
315  pgbuf_promote_read_latch_release(thread_p, pgptr_p, condition)
316 extern int pgbuf_promote_read_latch_release (THREAD_ENTRY * thread_p, PAGE_PTR * pgptr_p,
317  PGBUF_PROMOTE_CONDITION condition);
318 
319 extern void pgbuf_unfix (THREAD_ENTRY * thread_p, PAGE_PTR pgptr);
320 
321 extern void pgbuf_ordered_unfix (THREAD_ENTRY * thread_p, PGBUF_WATCHER * watcher_object);
322 
323 extern int pgbuf_invalidate_all (THREAD_ENTRY * thread_p, VOLID volid);
324 extern int pgbuf_invalidate (THREAD_ENTRY * thread_p, PAGE_PTR pgptr);
325 #endif /* NDEBUG */
327 extern void pgbuf_flush_if_requested (THREAD_ENTRY * thread_p, PAGE_PTR page);
328 extern int pgbuf_flush_victim_candidates (THREAD_ENTRY * thread_p, float flush_ratio,
329  PERF_UTIME_TRACKER * time_tracker, bool * stop);
330 extern int pgbuf_flush_checkpoint (THREAD_ENTRY * thread_p, const LOG_LSA * flush_upto_lsa,
331  const LOG_LSA * prev_chkpt_redo_lsa, LOG_LSA * smallest_lsa, int *flushed_page_cnt);
332 extern int pgbuf_flush_all (THREAD_ENTRY * thread_p, VOLID volid);
333 extern int pgbuf_flush_all_unfixed (THREAD_ENTRY * thread_p, VOLID volid);
334 extern int pgbuf_flush_all_unfixed_and_set_lsa_as_null (THREAD_ENTRY * thread_p, VOLID volid);
335 
336 #if !defined(NDEBUG)
337 #define pgbuf_replace_watcher(thread_p, old_watcher, new_watcher) \
338  pgbuf_replace_watcher_debug(thread_p, old_watcher, new_watcher, \
339  __FILE__, __LINE__)
340 extern void pgbuf_replace_watcher_debug (THREAD_ENTRY * thread_p, PGBUF_WATCHER * old_watcher,
341  PGBUF_WATCHER * new_watcher, const char *caller_file, const int caller_line);
342 #else /* NDEBUG */
343 extern void pgbuf_replace_watcher (THREAD_ENTRY * thread_p, PGBUF_WATCHER * old_watcher, PGBUF_WATCHER * new_watcher);
344 #endif /* NDEBUG */
345 extern void *pgbuf_copy_to_area (THREAD_ENTRY * thread_p, const VPID * vpid, int start_offset, int length, void *area,
346  bool do_fetch);
347 extern void *pgbuf_copy_from_area (THREAD_ENTRY * thread_p, const VPID * vpid, int start_offset, int length, void *area,
348  bool do_fetch, TDE_ALGORITHM tde_algo);
349 
350 extern void pgbuf_set_dirty (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, bool free_page);
351 #define pgbuf_set_dirty_and_free(thread_p, pgptr) pgbuf_set_dirty (thread_p, pgptr, FREE); pgptr = NULL
352 
354 extern int pgbuf_page_has_changed (PAGE_PTR pgptr, LOG_LSA * ref_lsa);
355 extern const LOG_LSA *pgbuf_set_lsa (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, const LOG_LSA * lsa_ptr);
356 extern void pgbuf_reset_temp_lsa (PAGE_PTR pgptr);
357 extern void pgbuf_set_tde_algorithm (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, TDE_ALGORITHM tde_algo,
358  bool skip_logging);
359 extern int pgbuf_rv_set_tde_algorithm (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
361 extern void pgbuf_get_vpid (PAGE_PTR pgptr, VPID * vpid);
367 extern const char *pgbuf_get_volume_label (PAGE_PTR pgptr);
368 extern void pgbuf_force_to_check_for_interrupts (void);
369 extern bool pgbuf_is_log_check_for_interrupts (THREAD_ENTRY * thread_p);
370 extern void pgbuf_unfix_all (THREAD_ENTRY * thread_p);
371 extern void pgbuf_set_lsa_as_temporary (THREAD_ENTRY * thread_p, PAGE_PTR pgptr);
372 extern void pgbuf_set_page_ptype (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PAGE_TYPE ptype);
374 extern bool pgbuf_check_page_ptype (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PAGE_TYPE ptype);
375 extern bool pgbuf_check_page_type_no_error (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PAGE_TYPE ptype);
376 extern DISK_ISVALID pgbuf_is_valid_page (THREAD_ENTRY * thread_p, const VPID * vpid, bool no_error,
377  DISK_ISVALID (*fun) (const VPID * vpid, void *args), void *args);
378 
379 #if defined(CUBRID_DEBUG)
380 extern void pgbuf_dump_if_any_fixed (void);
381 #endif
382 
383 extern bool pgbuf_has_perm_pages_fixed (THREAD_ENTRY * thread_p);
384 extern void pgbuf_ordered_set_dirty_and_free (THREAD_ENTRY * thread_p, PGBUF_WATCHER * pg_watcher);
385 extern int pgbuf_get_condition_for_ordered_fix (const VPID * vpid_new_page, const VPID * vpid_fixed_page,
386  const HFID * hfid);
387 #if !defined(NDEBUG)
388 extern void pgbuf_watcher_init_debug (PGBUF_WATCHER * watcher, const char *caller_file, const int caller_line,
389  bool add);
390 extern bool pgbuf_is_page_fixed_by_thread (THREAD_ENTRY * thread_p, const VPID * vpid_p);
391 #endif
392 
393 #if !defined (NDEBUG)
394 #define pgbuf_attach_watcher(...) \
395  pgbuf_attach_watcher_debug (__VA_ARGS__, ARG_FILE_LINE)
396 
398  HFID * hfid, PGBUF_WATCHER * watcher, const char *file, const int line);
399 #else /* NDEBUG */
401  PGBUF_WATCHER * watcher);
402 #endif /* NDEBUG */
403 
404 extern bool pgbuf_has_any_waiters (PAGE_PTR pgptr);
407 extern void pgbuf_peek_stats (UINT64 * fixed_cnt, UINT64 * dirty_cnt, UINT64 * lru1_cnt, UINT64 * lru2_cnt,
408  UINT64 * lru3_cnt, UINT64 * vict_candidates, UINT64 * avoid_dealloc_cnt,
409  UINT64 * avoid_victim_cnt, UINT64 * private_quota, UINT64 * private_cnt,
410  UINT64 * alloc_bcb_waiter_high, UINT64 * alloc_bcb_waiter_med,
411  UINT64 * alloc_bcb_waiter_low, UINT64 * lfcq_big_prv_num, UINT64 * lfcq_prv_num,
412  UINT64 * lfcq_shr_num);
413 extern void pgbuf_daemons_get_stats (UINT64 * stats_out);
414 
415 extern int pgbuf_flush_control_from_dirty_ratio (void);
416 
417 extern int pgbuf_rv_flush_page (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
418 extern void pgbuf_rv_flush_page_dump (FILE * fp, int length, void *data);
419 
420 extern int pgbuf_get_fix_count (PAGE_PTR pgptr);
421 extern int pgbuf_get_hold_count (THREAD_ENTRY * thread_p);
422 
424 
425 extern void pgbuf_log_new_page (THREAD_ENTRY * thread_p, PAGE_PTR page_new, int data_size, PAGE_TYPE ptype_new);
426 extern void pgbuf_log_redo_new_page (THREAD_ENTRY * thread_p, PAGE_PTR page_new, int data_size, PAGE_TYPE ptype_new);
427 extern int pgbuf_rv_new_page_redo (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
428 extern int pgbuf_rv_new_page_undo (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
429 extern void pgbuf_dealloc_page (THREAD_ENTRY * thread_p, PAGE_PTR page_dealloc);
430 extern int pgbuf_rv_dealloc_redo (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
431 extern int pgbuf_rv_dealloc_undo (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
432 extern int pgbuf_rv_dealloc_undo_compensate (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
433 
434 extern int pgbuf_fix_if_not_deallocated_with_caller (THREAD_ENTRY * thead_p, const VPID * vpid,
436  PAGE_PTR * page, const char *caller_file, int caller_line);
437 #if defined (NDEBUG)
438 #define pgbuf_fix_if_not_deallocated(thread_p, vpid, latch_mode, latch_condition, page) \
439  pgbuf_fix_if_not_deallocated_with_caller (thread_p, vpid, latch_mode, latch_condition, page, NULL, 0)
440 #else /* !NDEBUG */
441 #define pgbuf_fix_if_not_deallocated(thread_p, vpid, latch_mode, latch_condition, page) \
442  pgbuf_fix_if_not_deallocated_with_caller (thread_p, vpid, latch_mode, latch_condition, page, ARG_FILE_LINE)
443 #endif /* !NDEBUG */
444 extern int pgbuf_release_private_lru (THREAD_ENTRY * thread_p, const int private_idx);
445 extern int pgbuf_assign_private_lru (THREAD_ENTRY * thread_p, bool is_vacuum, const int id);
446 extern void pgbuf_adjust_quotas (THREAD_ENTRY * thread_p);
447 
448 #if defined (SERVER_MODE)
449 extern void pgbuf_direct_victims_maintenance (THREAD_ENTRY * thread_p);
450 extern bool pgbuf_keep_victim_flush_thread_running (void);
451 extern bool pgbuf_assign_flushed_pages (THREAD_ENTRY * thread_p);
452 #endif /* !SERVER_MODE */
453 
454 extern void pgbuf_notify_vacuum_follows (THREAD_ENTRY * thread_p, PAGE_PTR page);
455 extern bool pgbuf_is_io_stressful (void);
456 
457 #if defined (SERVER_MODE)
458 extern void pgbuf_daemons_init ();
459 extern void pgbuf_daemons_destroy ();
460 #endif /* SERVER_MODE */
461 
462 extern int pgbuf_start_scan (THREAD_ENTRY * thread_p, int type, DB_VALUE ** arg_values, int arg_cnt, void **ptr);
463 
464 #endif /* _PAGE_BUFFER_H_ */
char * PAGE_PTR
bool pgbuf_check_page_ptype(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PAGE_TYPE ptype)
int pgbuf_get_condition_for_ordered_fix(const VPID *vpid_new_page, const VPID *vpid_fixed_page, const HFID *hfid)
int pgbuf_flush_all_unfixed(THREAD_ENTRY *thread_p, VOLID volid)
Definition: page_buffer.c:3099
#define pgbuf_attach_watcher(...)
Definition: page_buffer.h:394
int pgbuf_flush_all(THREAD_ENTRY *thread_p, VOLID volid)
Definition: page_buffer.c:3083
bool pgbuf_has_any_non_vacuum_waiters(PAGE_PTR pgptr)
int pgbuf_get_fix_count(PAGE_PTR pgptr)
void pgbuf_set_lsa_as_temporary(THREAD_ENTRY *thread_p, PAGE_PTR pgptr)
Definition: page_buffer.c:4790
static const std::int64_t NULL_LOG_PAGEID
Definition: log_lsa.hpp:57
bool pgbuf_is_log_check_for_interrupts(THREAD_ENTRY *thread_p)
Definition: page_buffer.c:4762
PGBUF_DEBUG_PAGE_VALIDATION_LEVEL
Definition: page_buffer.h:197
int pgbuf_rv_new_page_undo(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
int pgbuf_flush_all_unfixed_and_set_lsa_as_null(THREAD_ENTRY *thread_p, VOLID volid)
Definition: page_buffer.c:3116
void pgbuf_replace_watcher_debug(THREAD_ENTRY *thread_p, PGBUF_WATCHER *old_watcher, PGBUF_WATCHER *new_watcher, const char *caller_file, const int caller_line)
int pgbuf_flush_control_from_dirty_ratio(void)
void pgbuf_unfix_debug(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, const char *caller_file, int caller_line)
Definition: page_buffer.c:2444
void * pgbuf_copy_from_area(THREAD_ENTRY *thread_p, const VPID *vpid, int start_offset, int length, void *area, bool do_fetch, TDE_ALGORITHM tde_algo)
Definition: page_buffer.c:4192
DISK_ISVALID pgbuf_is_valid_page(THREAD_ENTRY *thread_p, const VPID *vpid, bool no_error, DISK_ISVALID(*fun)(const VPID *vpid, void *args), void *args)
#define pgbuf_unfix(thread_p, pgptr)
Definition: page_buffer.h:276
#define pgbuf_invalidate(thread_p, pgptr)
Definition: page_buffer.h:290
void pgbuf_log_redo_new_page(THREAD_ENTRY *thread_p, PAGE_PTR page_new, int data_size, PAGE_TYPE ptype_new)
char watched_at[128]
Definition: page_buffer.h:232
void pgbuf_reset_temp_lsa(PAGE_PTR pgptr)
Definition: page_buffer.c:4457
void pgbuf_finalize(void)
Definition: page_buffer.c:1528
int pgbuf_invalidate_debug(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, const char *caller_file, int caller_line)
Definition: page_buffer.c:2748
LOG_LSA * pgbuf_get_lsa(PAGE_PTR pgptr)
Definition: page_buffer.c:4318
void pgbuf_log_new_page(THREAD_ENTRY *thread_p, PAGE_PTR page_new, int data_size, PAGE_TYPE ptype_new)
char init_at[256]
Definition: page_buffer.h:233
PGBUF_ORDERED_RANK
Definition: page_buffer.h:208
INT16 VOLID
PGBUF_ORDERED_GROUP group_id
Definition: page_buffer.h:225
VPID PGBUF_ORDERED_GROUP
Definition: page_buffer.h:217
void pgbuf_get_vpid(PAGE_PTR pgptr, VPID *vpid)
Definition: page_buffer.c:4579
void pgbuf_rv_flush_page_dump(FILE *fp, int length, void *data)
void pgbuf_notify_vacuum_follows(THREAD_ENTRY *thread_p, PAGE_PTR page)
int pgbuf_rv_set_tde_algorithm(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: page_buffer.c:4528
PAGEID pgbuf_get_page_id(PAGE_PTR pgptr)
Definition: page_buffer.c:4657
int pgbuf_rv_new_page_redo(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
int pgbuf_initialize(void)
Definition: page_buffer.c:1311
PAGE_TYPE
bool pgbuf_is_lsa_temporary(PAGE_PTR pgptr)
Definition: page_buffer.c:4885
void pgbuf_unfix_all(THREAD_ENTRY *thread_p)
Definition: page_buffer.c:2656
#define pgbuf_invalidate_all(thread_p, volid)
Definition: page_buffer.h:286
void pgbuf_flush_if_requested(THREAD_ENTRY *thread_p, PAGE_PTR page)
Definition: page_buffer.c:2996
PAGE_PTR pgbuf_flush_with_wal(THREAD_ENTRY *thread_p, PAGE_PTR pgptr)
Definition: page_buffer.c:2956
const VPID vpid_Null_vpid
Definition: page_buffer.c:74
void pgbuf_flush(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, bool free_page)
Definition: page_buffer.c:2933
void THREAD_ENTRY
void pgbuf_adjust_quotas(THREAD_ENTRY *thread_p)
int pgbuf_get_hold_count(THREAD_ENTRY *thread_p)
int pgbuf_promote_read_latch_debug(THREAD_ENTRY *thread_p, PAGE_PTR *pgptr_p, PGBUF_PROMOTE_CONDITION condition, const char *caller_file, int caller_line)
Definition: page_buffer.c:2198
HFID * pgbuf_ordered_null_hfid
Definition: page_buffer.c:805
PAGE_FETCH_MODE
Definition: page_buffer.h:160
static const std::int16_t NULL_LOG_OFFSET
Definition: log_lsa.hpp:58
PGBUF_LATCH_MODE pgbuf_get_latch_mode(PAGE_PTR pgptr)
Definition: page_buffer.c:4633
TDE_ALGORITHM
Definition: tde.h:71
int pgbuf_rv_dealloc_undo(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
PAGE_TYPE pgbuf_get_page_ptype(THREAD_ENTRY *thread_p, PAGE_PTR pgptr)
Definition: page_buffer.c:4675
int pgbuf_invalidate_all_debug(THREAD_ENTRY *thread_p, VOLID volid, const char *caller_file, int caller_line)
Definition: page_buffer.c:2852
const log_lsa PGBUF_TEMP_LSA
Definition: page_buffer.h:244
PGBUF_LATCH_MODE
Definition: page_buffer.h:176
void pgbuf_force_to_check_for_interrupts(void)
Definition: page_buffer.c:4750
bool pgbuf_has_any_waiters(PAGE_PTR pgptr)
PGBUF_LATCH_CONDITION
Definition: page_buffer.h:185
#define pgbuf_replace_watcher(thread_p, old_watcher, new_watcher)
Definition: page_buffer.h:337
TDE_ALGORITHM pgbuf_get_tde_algorithm(PAGE_PTR pgptr)
Definition: page_buffer.c:4548
const char * pgbuf_get_volume_label(PAGE_PTR pgptr)
Definition: page_buffer.c:4731
unsigned latch_mode
Definition: page_buffer.h:226
const LOG_LSA * pgbuf_set_lsa(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, const LOG_LSA *lsa_ptr)
Definition: page_buffer.c:4364
int pgbuf_rv_flush_page(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
void * pgbuf_copy_to_area(THREAD_ENTRY *thread_p, const VPID *vpid, int start_offset, int length, void *area, bool do_fetch)
Definition: page_buffer.c:4067
void pgbuf_attach_watcher_debug(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGBUF_LATCH_MODE latch_mode, HFID *hfid, PGBUF_WATCHER *watcher, const char *file, const int line)
PGBUF_PROMOTE_CONDITION
Definition: page_buffer.h:191
PAGE_PTR pgbuf_fix_debug(THREAD_ENTRY *thread_p, const VPID *vpid, PAGE_FETCH_MODE fetch_mode, PGBUF_LATCH_MODE requestmode, PGBUF_LATCH_CONDITION condition, const char *caller_file, int caller_line)
Definition: page_buffer.c:1789
bool pgbuf_is_io_stressful(void)
int pgbuf_rv_dealloc_undo_compensate(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
bool pgbuf_is_page_fixed_by_thread(THREAD_ENTRY *thread_p, const VPID *vpid_p)
int pgbuf_flush_victim_candidates(THREAD_ENTRY *thread_p, float flush_ratio, PERF_UTIME_TRACKER *time_tracker, bool *stop)
Definition: page_buffer.c:3237
int pgbuf_ordered_fix_debug(THREAD_ENTRY *thread_p, const VPID *req_vpid, PAGE_FETCH_MODE fetch_mode, const PGBUF_LATCH_MODE requestmode, PGBUF_WATCHER *req_watcher, const char *caller_file, int caller_line)
bool pgbuf_check_page_type_no_error(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PAGE_TYPE ptype)
void pgbuf_watcher_init_debug(PGBUF_WATCHER *watcher, const char *caller_file, const int caller_line, bool add)
bool pgbuf_has_prevent_dealloc(PAGE_PTR pgptr)
unsigned int pgbuf_hash_vpid(const void *key_vpid, unsigned int htsize)
Definition: page_buffer.c:1273
int pgbuf_release_private_lru(THREAD_ENTRY *thread_p, const int private_idx)
int pgbuf_start_scan(THREAD_ENTRY *thread_p, int type, DB_VALUE **arg_values, int arg_cnt, void **ptr)
VOLID pgbuf_get_volume_id(PAGE_PTR pgptr)
Definition: page_buffer.c:4707
void pgbuf_set_dirty(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, bool free_page)
Definition: page_buffer.c:4280
unsigned initial_rank
Definition: page_buffer.h:228
bool pgbuf_has_perm_pages_fixed(THREAD_ENTRY *thread_p)
unsigned page_was_unfixed
Definition: page_buffer.h:227
int pgbuf_flush_checkpoint(THREAD_ENTRY *thread_p, const LOG_LSA *flush_upto_lsa, const LOG_LSA *prev_chkpt_redo_lsa, LOG_LSA *smallest_lsa, int *flushed_page_cnt)
Definition: page_buffer.c:3552
PGBUF_WATCHER * next
Definition: page_buffer.h:223
unsigned curr_rank
Definition: page_buffer.h:229
VPID * pgbuf_get_vpid_ptr(PAGE_PTR pgptr)
Definition: page_buffer.c:4609
int pgbuf_page_has_changed(PAGE_PTR pgptr, LOG_LSA *ref_lsa)
Definition: page_buffer.c:4342
unsigned int magic
Definition: page_buffer.h:231
void pgbuf_ordered_set_dirty_and_free(THREAD_ENTRY *thread_p, PGBUF_WATCHER *pg_watcher)
PGBUF_WATCHER * prev
Definition: page_buffer.h:224
void pgbuf_dealloc_page(THREAD_ENTRY *thread_p, PAGE_PTR page_dealloc)
int pgbuf_rv_dealloc_redo(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
INT32 PAGEID
void pgbuf_set_tde_algorithm(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, TDE_ALGORITHM tde_algo, bool skip_logging)
Definition: page_buffer.c:4473
int pgbuf_fix_if_not_deallocated_with_caller(THREAD_ENTRY *thead_p, const VPID *vpid, PGBUF_LATCH_MODE latch_mode, PGBUF_LATCH_CONDITION latch_condition, PAGE_PTR *page, const char *caller_file, int caller_line)
PAGE_PTR pgptr
Definition: page_buffer.h:222
PAGE_PTR pgbuf_fix_with_retry(THREAD_ENTRY *thread_p, const VPID *vpid, PAGE_FETCH_MODE fetch_mode, PGBUF_LATCH_MODE request_mode, int retry)
Definition: page_buffer.c:1723
#define pgbuf_ordered_unfix(thread_p, watcher_object)
Definition: page_buffer.h:280
int pgbuf_compare_vpid(const void *key_vpid1, const void *key_vpid2)
Definition: page_buffer.c:1287
void pgbuf_set_page_ptype(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PAGE_TYPE ptype)
Definition: page_buffer.c:4847
PERF_PAGE_TYPE
Definition: perf_monitor.h:209
void pgbuf_daemons_get_stats(UINT64 *stats_out)
PERF_PAGE_TYPE pgbuf_get_page_type_for_stat(THREAD_ENTRY *thread_p, PAGE_PTR pgptr)
DISK_ISVALID
Definition: disk_manager.h:53
void pgbuf_peek_stats(UINT64 *fixed_cnt, UINT64 *dirty_cnt, UINT64 *lru1_cnt, UINT64 *lru2_cnt, UINT64 *lru3_cnt, UINT64 *vict_candidates, UINT64 *avoid_dealloc_cnt, UINT64 *avoid_victim_cnt, UINT64 *private_quota, UINT64 *private_cnt, UINT64 *alloc_bcb_waiter_high, UINT64 *alloc_bcb_waiter_med, UINT64 *alloc_bcb_waiter_low, UINT64 *lfcq_big_prv_num, UINT64 *lfcq_prv_num, UINT64 *lfcq_shr_num)
int pgbuf_assign_private_lru(THREAD_ENTRY *thread_p, bool is_vacuum, const int id)
void pgbuf_ordered_unfix_debug(THREAD_ENTRY *thread_p, PGBUF_WATCHER *watcher_object, const char *caller_file, int caller_line)