24 #ifndef _PAGE_BUFFER_H_ 25 #define _PAGE_BUFFER_H_ 41 #define DONT_FREE false 46 #define VPID_GET_FROM_OID(vpid_ptr, oid_ptr) \ 47 VPID_SET (vpid_ptr, (oid_ptr)->volid, (oid_ptr)->pageid); 49 #define VPID_EQ_FOR_OIDS(oid_ptr1, oid_ptr2) \ 50 (((oid_ptr1)->volid == (oid_ptr2)->volid) \ 51 && ((oid_ptr1)->pageid == (oid_ptr2)->pageid)) 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 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) 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) 63 #define pgbuf_unfix_and_init(thread_p, pgptr) \ 65 pgbuf_unfix ((thread_p), (pgptr)); \ 69 #define pgbuf_ordered_unfix_and_init(thread_p, page, pg_watcher) \ 71 if ((pg_watcher) != NULL) \ 73 assert ((page) == (pg_watcher)->pgptr); \ 74 pgbuf_ordered_unfix ((thread_p), (pg_watcher)); \ 75 (pg_watcher)->pgptr = NULL; \ 79 pgbuf_unfix_and_init ((thread_p), (page)); \ 84 #define PGBUF_WATCHER_MAGIC_NUMBER 0x12345678 85 #define PGBUF_ORDERED_NULL_HFID (pgbuf_ordered_null_hfid) 87 #define PGBUF_WATCHER_SET_GROUP(w,hfid) \ 89 if ((hfid) == NULL || (hfid)->vfid.volid == NULL_VOLID \ 90 || (hfid)->hpgid == NULL_PAGEID || HFID_IS_NULL (hfid)) \ 92 VPID_SET_NULL (&((w)->group_id)); \ 96 (w)->group_id.volid = (hfid)->vfid.volid; \ 97 (w)->group_id.pageid = (hfid)->hpgid; \ 101 #define PGBUF_WATCHER_COPY_GROUP(w_dst,w_src) \ 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)); \ 109 #define PGBUF_WATCHER_RESET_RANK(w,rank) \ 111 (w)->initial_rank = (rank); \ 115 #define PGBUF_CLEAR_WATCHER(w) \ 120 pgbuf_watcher_init_debug ((w), __FILE__, __LINE__, false); \ 123 #define PGBUF_INIT_WATCHER(w,rank,hfid) \ 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; \ 135 #define PGBUF_CLEAR_WATCHER(w) \ 142 #define PGBUF_INIT_WATCHER(w,rank,hfid) \ 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)); \ 153 #define PGBUF_IS_CLEAN_WATCHER(w) (((w) != NULL && (w)->next == NULL \ 154 && (w)->prev == NULL && (w)->pgptr == NULL) ? true : false) 156 #define PGBUF_IS_ORDERED_PAGETYPE(ptype) \ 157 ((ptype) == PAGE_HEAP || (ptype) == PAGE_OVERFLOW) 230 #if !defined (NDEBUG) 246 extern unsigned int pgbuf_hash_vpid (
const void *key_vpid,
unsigned int htsize);
255 #define pgbuf_fix(thread_p, vpid, fetch_mode, requestmode, condition) \ 256 pgbuf_fix_debug(thread_p, vpid, fetch_mode, requestmode, condition, \ 261 #define pgbuf_ordered_fix(thread_p, req_vpid, fetch_mode, requestmode,\ 263 pgbuf_ordered_fix_debug(thread_p, req_vpid, fetch_mode, requestmode, \ 264 req_watcher, __FILE__, __LINE__) 268 const char *caller_file,
int caller_line);
270 #define pgbuf_promote_read_latch(thread_p, pgptr_p, condition) \ 271 pgbuf_promote_read_latch_debug(thread_p, pgptr_p, condition, \ 276 #define pgbuf_unfix(thread_p, pgptr) \ 277 pgbuf_unfix_debug(thread_p, pgptr, __FILE__, __LINE__) 280 #define pgbuf_ordered_unfix(thread_p, watcher_object) \ 281 pgbuf_ordered_unfix_debug(thread_p, watcher_object, \ 286 #define pgbuf_invalidate_all(thread_p, volid) \ 287 pgbuf_invalidate_all_debug(thread_p, volid, __FILE__, __LINE__) 290 #define pgbuf_invalidate(thread_p, pgptr) \ 291 pgbuf_invalidate_debug(thread_p, pgptr, __FILE__, __LINE__) 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) 301 #define pgbuf_fix(thread_p, vpid, fetch_mode, requestmode, condition) \ 302 pgbuf_fix_release(thread_p, vpid, fetch_mode, requestmode, condition) 306 #define pgbuf_ordered_fix(thread_p, req_vpid, fetch_mode, requestmode, \ 308 pgbuf_ordered_fix_release(thread_p, req_vpid, fetch_mode, requestmode, \ 314 #define pgbuf_promote_read_latch(thread_p, pgptr_p, condition) \ 315 pgbuf_promote_read_latch_release(thread_p, pgptr_p, condition) 329 PERF_UTIME_TRACKER * time_tracker,
bool * stop);
331 const LOG_LSA * prev_chkpt_redo_lsa,
LOG_LSA * smallest_lsa,
int *flushed_page_cnt);
337 #define pgbuf_replace_watcher(thread_p, old_watcher, new_watcher) \ 338 pgbuf_replace_watcher_debug(thread_p, old_watcher, new_watcher, \ 341 PGBUF_WATCHER * new_watcher,
const char *caller_file,
const int caller_line);
351 #define pgbuf_set_dirty_and_free(thread_p, pgptr) pgbuf_set_dirty (thread_p, pgptr, FREE); pgptr = NULL 379 #if defined(CUBRID_DEBUG) 380 extern void pgbuf_dump_if_any_fixed (
void);
393 #if !defined (NDEBUG) 394 #define pgbuf_attach_watcher(...) \ 395 pgbuf_attach_watcher_debug (__VA_ARGS__, ARG_FILE_LINE) 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);
436 PAGE_PTR * page,
const char *caller_file,
int caller_line);
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) 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) 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);
457 #if defined (SERVER_MODE) 458 extern void pgbuf_daemons_init ();
459 extern void pgbuf_daemons_destroy ();
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)
#define pgbuf_attach_watcher(...)
int pgbuf_flush_all(THREAD_ENTRY *thread_p, VOLID volid)
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)
static const std::int64_t NULL_LOG_PAGEID
bool pgbuf_is_log_check_for_interrupts(THREAD_ENTRY *thread_p)
PGBUF_DEBUG_PAGE_VALIDATION_LEVEL
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)
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)
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)
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)
#define pgbuf_invalidate(thread_p, pgptr)
void pgbuf_log_redo_new_page(THREAD_ENTRY *thread_p, PAGE_PTR page_new, int data_size, PAGE_TYPE ptype_new)
void pgbuf_reset_temp_lsa(PAGE_PTR pgptr)
void pgbuf_finalize(void)
int pgbuf_invalidate_debug(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, const char *caller_file, int caller_line)
LOG_LSA * pgbuf_get_lsa(PAGE_PTR pgptr)
void pgbuf_log_new_page(THREAD_ENTRY *thread_p, PAGE_PTR page_new, int data_size, PAGE_TYPE ptype_new)
PGBUF_ORDERED_GROUP group_id
void pgbuf_get_vpid(PAGE_PTR pgptr, VPID *vpid)
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)
PAGEID pgbuf_get_page_id(PAGE_PTR pgptr)
int pgbuf_rv_new_page_redo(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
int pgbuf_initialize(void)
bool pgbuf_is_lsa_temporary(PAGE_PTR pgptr)
void pgbuf_unfix_all(THREAD_ENTRY *thread_p)
#define pgbuf_invalidate_all(thread_p, volid)
void pgbuf_flush_if_requested(THREAD_ENTRY *thread_p, PAGE_PTR page)
PAGE_PTR pgbuf_flush_with_wal(THREAD_ENTRY *thread_p, PAGE_PTR pgptr)
const VPID vpid_Null_vpid
void pgbuf_flush(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, bool free_page)
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)
HFID * pgbuf_ordered_null_hfid
static const std::int16_t NULL_LOG_OFFSET
PGBUF_LATCH_MODE pgbuf_get_latch_mode(PAGE_PTR pgptr)
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)
int pgbuf_invalidate_all_debug(THREAD_ENTRY *thread_p, VOLID volid, const char *caller_file, int caller_line)
const log_lsa PGBUF_TEMP_LSA
void pgbuf_force_to_check_for_interrupts(void)
bool pgbuf_has_any_waiters(PAGE_PTR pgptr)
#define pgbuf_replace_watcher(thread_p, old_watcher, new_watcher)
TDE_ALGORITHM pgbuf_get_tde_algorithm(PAGE_PTR pgptr)
const char * pgbuf_get_volume_label(PAGE_PTR pgptr)
const LOG_LSA * pgbuf_set_lsa(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, const LOG_LSA *lsa_ptr)
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)
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)
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)
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)
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)
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)
void pgbuf_set_dirty(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, bool free_page)
bool pgbuf_has_perm_pages_fixed(THREAD_ENTRY *thread_p)
unsigned page_was_unfixed
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)
VPID * pgbuf_get_vpid_ptr(PAGE_PTR pgptr)
int pgbuf_page_has_changed(PAGE_PTR pgptr, LOG_LSA *ref_lsa)
void pgbuf_ordered_set_dirty_and_free(THREAD_ENTRY *thread_p, PGBUF_WATCHER *pg_watcher)
void pgbuf_dealloc_page(THREAD_ENTRY *thread_p, PAGE_PTR page_dealloc)
int pgbuf_rv_dealloc_redo(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
void pgbuf_set_tde_algorithm(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, TDE_ALGORITHM tde_algo, bool skip_logging)
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 pgbuf_fix_with_retry(THREAD_ENTRY *thread_p, const VPID *vpid, PAGE_FETCH_MODE fetch_mode, PGBUF_LATCH_MODE request_mode, int retry)
#define pgbuf_ordered_unfix(thread_p, watcher_object)
int pgbuf_compare_vpid(const void *key_vpid1, const void *key_vpid2)
void pgbuf_set_page_ptype(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PAGE_TYPE ptype)
void pgbuf_daemons_get_stats(UINT64 *stats_out)
PERF_PAGE_TYPE pgbuf_get_page_type_for_stat(THREAD_ENTRY *thread_p, PAGE_PTR pgptr)
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)