46 #if defined(SERVER_MODE) 54 #if !defined(SERVER_MODE) 55 #define pthread_mutex_init(a, b) 56 #define pthread_mutex_destroy(a) 57 #define pthread_mutex_lock(a) 0 58 #define pthread_mutex_trylock(a) 0 59 #define pthread_mutex_unlock(a) 63 #define SPAGE_SEARCH_NEXT 1 64 #define SPAGE_SEARCH_PREV -1 68 #define SPAGE_DB_PAGESIZE \ 69 (spage_User_page_size != 0 ? assert (spage_User_page_size == db_page_size ()), spage_User_page_size : db_page_size ()) 71 #define SPAGE_VERIFY_HEADER(sphdr) \ 73 assert ((sphdr) != NULL); \ 74 assert ((sphdr)->total_free >= 0); \ 75 assert ((sphdr)->cont_free >= 0); \ 76 assert ((sphdr)->cont_free <= (sphdr)->total_free); \ 77 assert ((sphdr)->offset_to_free_area < SPAGE_DB_PAGESIZE); \ 78 assert ((sphdr)->num_records >= 0); \ 79 assert ((sphdr)->num_slots >= 0); \ 80 assert ((sphdr)->num_records <= (sphdr)->num_slots); \ 118 #define SPAGE_OVERFLOW(offset) ((int) (offset) > SPAGE_DB_PAGESIZE) 175 int *other_saved_spaces);
201 int record_descriptor_length,
SPAGE_SLOT ** out_slot_p,
int *out_space_p,
202 int *out_old_waste_p,
int *out_new_waste_p);
204 int mvcc_delete_record_length,
int mvcc_insert_record_length);
206 const RECDES * record_descriptor_p,
int space);
209 int old_waste,
int new_waste);
212 int is_peeking,
int direction,
bool skip_empty);
226 PGSLOTID * slotid,
void **slotptr,
int *used_space)
266 return (
void *) entry_p;
315 list = head_p->
first;
337 char header_info[1024];
391 while (entry !=
NULL)
408 spage_Saving_hashmap.
end_tran (thread_p);
443 if (current->
saved > 0)
515 (void) spage_Saving_hashmap.
find_or_insert (thread_p, *vpid_p, head_p);
538 head_p->
first = entry_p;
541 entry_p->
saved = space;
544 entry_p->
head = head_p;
572 for (entry_p = head_p->
first; entry_p !=
NULL; entry_p = entry_p->
next)
574 if (tranid == entry_p->
tranid)
584 entry_p->
saved += space;
601 entry_p->
saved = space;
602 entry_p->
head = head_p;
611 head_p->
first = entry_p;
650 int saved_by_other_trans = 0;
653 assert (saved_by_other_trans >= 0);
655 return saved_by_other_trans;
691 int *saved_by_other_trans)
697 int total_saved, my_saved_space;
707 if (saved_by_other_trans !=
NULL)
709 *saved_by_other_trans = 0;
724 head_p = spage_Saving_hashmap.
find (thread_p, *vpid_p);
727 entry_p = head_p->
first;
728 while (entry_p !=
NULL)
730 if (entry_p->
tranid == tranid)
732 my_saved_space += entry_p->
saved;
735 entry_p = entry_p->
next;
744 assert (my_saved_space >= 0);
745 assert (total_saved >= 0);
746 assert (total_saved >= my_saved_space);
748 if (saved_by_other_trans !=
NULL)
750 *saved_by_other_trans = total_saved - my_saved_space;
751 assert (*saved_by_other_trans >= 0);
772 head_p = spage_Saving_hashmap.
find (thread_p, *vpid_p);
775 fprintf (fp,
"Other savings of VPID = %d|%d total_saved = %d\n", head_p->
vpid.
volid, head_p->
vpid.
pageid,
779 entry_p = head_p->
first;
781 while (entry_p !=
NULL)
783 fprintf (fp,
" Tranid = %d save = %d\n", entry_p->
tranid, entry_p->
saved);
784 entry_p = entry_p->
next;
819 spage_Saving_hashmap.
destroy ();
935 if (need_update !=
NULL)
1037 int pages, records, length;
1045 last_slot_id = page_header_p->
num_slots - 1;
1046 slot_p =
spage_find_slot (page_p, page_header_p, last_slot_id,
false);
1052 for (i = last_slot_id; i > 0; slot_p++, i--)
1077 *nrecords = records;
1078 *rec_length = length;
1145 return ((*s1)->offset_to_record - (*s2)->offset_to_record);
1199 if (slot_array ==
NULL)
1209 for (j = 0, i = 0; i < page_header_p->
num_slots; slot_p--, i++)
1219 slot_array[j++] = slot_p;
1248 if (to_offset == slot_array[i]->offset_to_record)
1256 if ((
unsigned int) to_offset + slot_array[i]->record_length > (
unsigned int)
SPAGE_DB_PAGESIZE)
1262 memmove ((
char *) page_p + to_offset, (
char *) page_p + slot_array[i]->offset_to_record,
1263 slot_array[i]->record_length);
1318 for (slot_id = start_slot, slot_p -= slot_id; slot_id < page_header_p->
num_slots; slot_p--, slot_id++)
1327 if (out_slot_p !=
NULL)
1329 *out_slot_p = slot_p;
1332 if (
spage_find_slot (page_p, page_header_p, slot_id,
false) != slot_p)
1407 int waste, space, status;
1424 space = record_length + waste;
1448 if (slot_id == page_header_p->
num_slots)
1484 *out_slot_p = slot_p;
1485 *out_space_p = space;
1486 *out_slot_id_p = slot_id;
1517 for (; last_slot_p < slot_p; last_slot_p++)
1519 spage_set_slot (last_slot_p, (last_slot_p + 1)->offset_to_record, (last_slot_p + 1)->record_length,
1520 (last_slot_p + 1)->record_type);
1522 assert (last_slot_p == slot_p);
1555 for (; slot_p > last_slot_p; slot_p--)
1557 spage_set_slot (slot_p, (slot_p - 1)->offset_to_record, (slot_p - 1)->record_length,
1558 (slot_p - 1)->record_type);
1687 int waste, space, status;
1702 space = record_length + waste;
1711 if (slot_id == page_header_p->
num_slots)
1740 *out_slot_p = slot_p;
1810 PGSLOTID * out_slot_id_p,
void **out_slot_p,
int *out_used_space_p)
1830 out_used_space_p, out_slot_id_p);
1831 *out_slot_p = (
void *) slot_p;
1857 if (record_descriptor_p->
length < 0)
1919 if (record_descriptor_p->
length < 0)
1979 if (record_descriptor_p->
length < 0)
1990 return spage_insert_at (thread_p, page_p, slot_id, record_descriptor_p);
2001 if (slot_id < page_header_p->num_slots)
2192 if (
spage_delete (thread_p, page_p, slot_id) != slot_id)
2232 SPAGE_SLOT ** out_slot_p,
int *out_space_p,
int *out_old_waste_p,
int *out_new_waste_p)
2236 int new_waste, old_waste;
2241 if (record_descriptor_length < 0)
2266 space = record_descriptor_length + new_waste - slot_p->
record_length - old_waste;
2275 *out_slot_p = slot_p;
2280 *out_space_p = space;
2283 if (out_old_waste_p)
2285 *out_old_waste_p = old_waste;
2288 if (out_new_waste_p)
2290 *out_new_waste_p = new_waste;
2308 int mvcc_insert_record_length)
2312 int new_waste, old_waste;
2314 int insert_record_space;
2315 int max_record_size;
2319 if (mvcc_delete_record_length < 0 || mvcc_insert_record_length < 0)
2327 if (mvcc_delete_record_length > max_record_size || mvcc_insert_record_length > max_record_size)
2345 space = mvcc_delete_record_length + new_waste - slot_p->
record_length - old_waste;
2354 insert_record_space = (mvcc_insert_record_length + new_waste);
2355 space += insert_record_space;
2377 if (slot_id == page_header_p->
num_slots)
2416 const RECDES * record_descriptor_p,
int space)
2418 bool is_located_end;
2422 if (record_descriptor_p->
length < 0)
2472 SPAGE_SLOT * slot_p,
const RECDES * record_descriptor_p,
int space,
int old_waste,
2479 if (record_descriptor_p->
length < 0)
2497 space = record_descriptor_p->
length + new_waste;
2500 else if (record_descriptor_p->
length + new_waste > page_header_p->
cont_free)
2524 space = record_descriptor_p->
length + new_waste;
2536 record_descriptor_p->
length);
2540 page_header_p->
cont_free -= (record_descriptor_p->
length + new_waste);
2566 int new_waste, old_waste;
2568 int total_free_save;
2576 if (record_descriptor_p->
length < 0)
2606 old_waste, new_waste);
2665 int insert_record_length)
2728 bool is_reclaim =
false;
2740 for (slot_id = page_header_p->
num_slots - 1; slot_id >= 0; slot_id--)
2742 slot_p = first_slot_p - slot_id;
2749 if ((slot_id + 1) == page_header_p->
num_slots)
2762 if (is_reclaim ==
true)
2801 int total_free_save;
2802 int old_waste, remain_waste, new_waste;
2838 if (remain_waste == 0)
2868 space = remain_waste + new_waste - old_waste;
2876 if (remain_length > page_header_p->
cont_free)
2884 copyarea = (
char *) malloc (remain_length);
2885 if (copyarea ==
NULL)
2899 memcpy (copyarea, (
char *) page_p + slot_p->
offset_to_record + offset, remain_length);
2909 page_header_p->
total_free += (space + remain_length + new_waste);
2915 page_header_p->
total_free -= (space + remain_length + new_waste);
2936 memcpy (((
char *) page_p + new_slot_p->
offset_to_record), copyarea, remain_length);
2995 int new_waste, old_waste;
2996 int total_free_save;
3012 if ((takeout_offset + takeout_length) > (
int) slot_p->
record_length)
3033 if (mayshift_left == 0 && (takeout_offset < ((
int) slot_p->
record_length - takeout_offset - takeout_length)))
3040 if (takeout_offset == 0)
3061 if (((
int) slot_p->
record_length - takeout_offset - takeout_length) > 0)
3066 + (slot_p->
record_length - takeout_offset - takeout_length)))
3073 (
char *) page_p + slot_p->
offset_to_record + takeout_offset + takeout_length,
3090 page_header_p->
cont_free += takeout_length + old_waste - new_waste;
3097 page_header_p->
total_free += (takeout_length + old_waste - new_waste);
3130 return spage_put_helper (thread_p, page_p, slot_id, 0, record_descriptor_p,
true);
3145 return spage_put_helper (thread_p, page_p, slot_id, offset, record_descriptor_p,
false);
3160 const RECDES * record_descriptor_p,
bool is_append)
3165 int new_waste, old_waste;
3167 int total_free_save;
3173 if (record_descriptor_p->
length < 0)
3198 space = record_descriptor_p->
length + new_waste - old_waste;
3290 if (copyarea ==
NULL)
3367 record_descriptor_p->
length);
3378 record_descriptor_p->
length);
3419 const RECDES * record_descriptor_p)
3431 if (record_descriptor_p->
length < 0)
3459 memcpy (((
char *) page_p + slot_p->
offset_to_record + overwrite_offset), record_descriptor_p->
data,
3460 record_descriptor_p->
length);
3488 int first_old_offset, second_old_offset;
3489 int new_waste, first_old_waste, second_old_waste;
3490 int total_free_save;
3499 first_slot_p =
spage_find_slot (page_p, page_header_p, first_slot_id,
true);
3500 if (first_slot_p ==
NULL)
3507 second_slot_p =
spage_find_slot (page_p, page_header_p, second_slot_id,
true);
3508 if (second_slot_p ==
NULL)
3532 first_old_waste = 0;
3555 first_old_waste = 0;
3569 if (copyarea ==
NULL)
3596 + second_old_waste);
3606 + second_old_waste);
3634 first_old_waste = 0;
3635 second_old_waste = 0;
3656 (void)
spage_delete (thread_p, page_p, second_slot_id);
3690 int direction,
bool skip_empty)
3700 slot_id = *out_slot_id_p;
3704 if (slot_id < 0 || slot_id > page_header_p->
num_slots)
3717 slot_id += direction;
3725 slot_id += direction;
3726 slot_p -= direction;
3731 *out_slot_id_p = slot_id;
3738 if (slot_id >= 0 && slot_id < page_header_p->num_slots)
3740 *out_slot_id_p = slot_id;
3746 *out_slot_id_p = -1;
3747 record_descriptor_p->
length = 0;
3863 record_descriptor_p->
length = 0;
3893 if (is_peeking ==
PEEK)
4035 if (0 > slot_id || slot_id >= page_header_p->
num_slots)
4110 switch (record_type)
4117 return "RELOCATION";
4121 return "MARKDELETED";
4123 return "DELETED_WILL_REUSE";
4125 return "ASSIGN_ADDRESS";
4143 switch (anchor_type)
4148 return "ANCHORED_DONT_REUSE_SLOTS";
4150 return "UNANCHORED_ANY_SEQUENCE";
4152 return "UNANCHORED_KEEP_SEQUENCE";
4197 (void) fprintf (fp,
"%s", buffer);
4216 snprintf (buffer + n, size - n,
"NUM SLOTS = %d, NUM RECS = %d, TYPE OF SLOTS = %s,\n", page_header_p->
num_slots,
4220 snprintf (buffer + n, size - n,
4221 "TOTAL FREE AREA = %d, CONTIGUOUS FREE AREA = %d," 4222 " FREE SPACE OFFSET = %d, NEED UPDATE BEST HINT = %d\n", page_header_p->
total_free,
4224 n += snprintf (buffer + n, size - n,
"IS_SAVING = %d\n", page_header_p->
is_saving);
4246 for (i = 0; i < num_slots; slot_p--, i++)
4248 (void) fprintf (fp,
"\nSlot-id = %2d, offset = %4d, type = %s", i, slot_p->
offset_to_record,
4253 (void) fprintf (fp,
", length = %4d, waste = %u", slot_p->
record_length, waste);
4255 (void) fprintf (fp,
"\n");
4278 (void) fprintf (fp,
"\nSlot-id = %2d\n", slot_id);
4283 fprintf (fp,
"VFID = %d|%d\n", vfid->
volid, vfid->
fileid);
4295 (void) fprintf (fp,
"%02X ", (
unsigned char) (*record_p++));
4300 else if (i % 10 == 9)
4305 (void) fprintf (fp,
"\n");
4312 (void) fprintf (fp,
"\nSlot-id = %2d has been deleted\n", slot_id);
4335 (void) fprintf (fp,
"\n*** Dumping pageid = %d of volume = %s ***\n",
pgbuf_get_page_id (page_p),
4345 if (is_record_printed)
4347 (void) fprintf (fp,
"\nRecords in ascii follow ...\n");
4348 for (i = 0; i < page_header_p->
num_slots; slot_p--, i++)
4360 #if !defined(NDEBUG) 4382 for (i = 0; i < page_header_p->
num_slots; slot_p--, i++)
4391 return (page_header_p->
num_records == nrecs) ?
true :
false;
4407 int used_length = 0;
4419 for (i = 0; i < page_header_p->
num_slots; slot_p--, i++)
4431 snprintf (err_msg,
sizeof (err_msg),
4432 "spage_check: Inconsistent page = %d of volume = %s.\n" 4433 "(Used_space + tfree > SPAGE_DB_PAGESIZE\n (%d + %d) > %d \n %d > %d\n",
4448 snprintf (err_msg,
sizeof (err_msg),
4449 "spage_check: Inconsistent page = %d of volume = %s.\n" 4450 " (cfree + foffset + SIZEOF(SPAGE_SLOT) * nslots) > " 4451 " SPAGE_DB_PAGESIZE\n (%d + %d + (%zu * %d)) > %d\n %zu > %d\n",
pgbuf_get_page_id (page_p),
4466 snprintf (err_msg,
sizeof (err_msg),
4467 "spage_check: Cfree %d is inconsistent in page = %d of volume = %s. Cannot be < -%d\n",
4481 int other_saved_spaces = 0;
4483 &other_saved_spaces);
4485 if (other_saved_spaces < 0)
4487 if (other_saved_spaces < 0 || total_saved > page_header_p->
total_free)
4491 snprintf (err_msg,
sizeof (err_msg),
4492 "spage_check: Other savings of %d is inconsistent in page = %d of volume = %s.\n",
4502 if (total_saved < 0)
4504 snprintf (err_msg,
sizeof (err_msg),
4505 "spage_check: Total savings of %d is inconsistent in page = %d of volume = %s. Cannot be < 0\n",
4562 unsigned int max_offset;
4596 if (is_unknown_slot_check)
4619 int total_saved = 0;
4637 assert (total_saved >= 0);
4639 return (space <= (page_header_p->
total_free - total_saved));
4643 return (space <= page_header_p->total_free);
4734 if (page_p ==
NULL || page_header_info ==
NULL)
4804 if (slot_id < 0 || slot_id >= page_header_p->
num_slots)
4919 arg_val0 = arg_values[0];
4920 arg_val1 = arg_values[1];
5080 arg_val0 = arg_values[0];
5081 arg_val1 = arg_values[1];
TRANID logtb_find_current_tranid(THREAD_ENTRY *thread_p)
static int spage_save_head_uninit(void *entry_p)
static void spage_dump_header_to_string(char *buffer, int size, const SPAGE_HEADER *page_header_p)
static bool spage_is_slotted_page_type(PAGE_TYPE ptype)
#define vacuum_er_log_error(er_log_level, msg,...)
#define ER_DIAG_PAGE_NOT_FOUND
static void spage_add_contiguous_free_space(PAGE_PTR pgptr, int space)
static int spage_check_space(THREAD_ENTRY *thread_p, PAGE_PTR page_p, SPAGE_HEADER *page_header_p, int space)
static bool spage_has_enough_contiguous_space(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, SPAGE_HEADER *sphdr, int space)
static const char * spage_record_type_string(INT16 record_type)
#define DB_ALIGN_BELOW(offset, align)
#define ER_SP_OVERWRITE_WRONG_OFFSET
static void spage_dump_slots(FILE *fp, const SPAGE_SLOT *sptr, PGNSLOTS nslots, unsigned short alignment)
bool spage_is_mvcc_updatable(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, int delete_record_length, int insert_record_length)
static void spage_reduce_a_slot(PAGE_PTR page_p)
static int spage_find_empty_slot(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, int length, INT16 type, SPAGE_SLOT **sptr, int *space, PGSLOTID *slotid)
static spage_saving_hashmap_type spage_Saving_hashmap
static bool spage_has_enough_total_space(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, SPAGE_HEADER *sphdr, int space)
int spage_insert(THREAD_ENTRY *thread_p, PAGE_PTR page_p, RECDES *record_descriptor_p, PGSLOTID *out_slot_id_p)
#define SPAGE_VERIFY_HEADER(sphdr)
static bool spage_is_record_located_at_end(SPAGE_HEADER *page_header_p, SPAGE_SLOT *slot_p)
static int spage_take_slot_in_use(THREAD_ENTRY *thread_p, PAGE_PTR page_p, SPAGE_HEADER *page_header_p, PGSLOTID slot_id, SPAGE_SLOT *slot_p, int *out_space_p)
PAGEID pgbuf_get_page_id(PAGE_PTR pgptr)
int db_get_int(const DB_VALUE *value)
void spage_initialize(THREAD_ENTRY *thread_p, PAGE_PTR page_p, INT16 slot_type, unsigned short alignment, bool is_saving)
const char * spage_alignment_string(unsigned short alignment)
int spage_overwrite(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, int overwrite_offset, const RECDES *record_descriptor_p)
#define pthread_mutex_init(a, b)
SCAN_CODE spage_previous_record_dont_skip_empty(PAGE_PTR page_p, PGSLOTID *out_slot_id_p, RECDES *record_descriptor_p, int is_peeking)
SCAN_CODE spage_slots_next_scan(THREAD_ENTRY *thread_p, int cursor, DB_VALUE **out_values, int out_cnt, void *ptr)
SPAGE_SLOT * spage_get_slot(PAGE_PTR page_p, PGSLOTID slot_id)
#define assert_release(e)
void pgbuf_set_dirty(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, bool free_page)
static int spage_compare_slot_offset(const void *arg1, const void *arg2)
void spage_update_record_type(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, INT16 record_type)
#define VACUUM_IS_THREAD_VACUUM_MASTER
LOG_TDES * LOG_FIND_TDES(int tran_index)
struct spage_slot SPAGE_SLOT
int spage_take_out(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, int takeout_offset, int takeout_length)
LF_TRAN_SYSTEM spage_saving_Ts
bool spage_reclaim(THREAD_ENTRY *thread_p, PAGE_PTR page_p)
#define PTR_ALIGN(addr, boundary)
bool spage_check_num_slots(THREAD_ENTRY *thread_p, PAGE_PTR page_p)
void spage_set_need_update_best_hint(THREAD_ENTRY *thread_p, PAGE_PTR page_p, bool need_update)
PGSLOTID spage_delete_for_recovery(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id)
const char * spage_anchor_flag_string(const INT16 anchor_type)
static int spage_put_helper(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid, int offset, const RECDES *recdes, bool is_append)
bool spage_is_slot_exist(PAGE_PTR page_p, PGSLOTID slot_id)
static int spage_find_empty_slot_at(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid, int length, INT16 type, SPAGE_SLOT **sptr)
int spage_header_start_scan(THREAD_ENTRY *thread_p, int show_type, DB_VALUE **arg_values, int arg_cnt, void **ptr)
SCAN_CODE spage_get_record(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, RECDES *record_descriptor_p, int is_peeking)
bool spage_is_updatable(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, int record_descriptor_length)
static int spage_check_updatable(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, int record_descriptor_length, SPAGE_SLOT **out_slot_p, int *out_space_p, int *out_old_waste_p, int *out_new_waste_p)
bool find_or_insert(cubthread::entry *thread_p, Key &key, T *&t)
#define ER_SP_WRONG_NUM_SLOTS
SPAGE_SAVE_ENTRY * tran_next_save
int spage_slots_start_scan(THREAD_ENTRY *thread_p, int show_type, DB_VALUE **arg_values, int arg_cnt, void **ptr)
#define pgbuf_unfix_and_init(thread_p, pgptr)
static int spage_check_record_for_insert(RECDES *record_descriptor_p)
int spage_get_record_length(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id)
int spage_update(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, const RECDES *record_descriptor_p)
void spage_finalize(THREAD_ENTRY *thread_p)
int db_make_string(DB_VALUE *value, DB_CONST_C_CHAR str)
static void spage_reduce_contiguous_free_space(PAGE_PTR pgptr, int space)
PAGE_TYPE pgbuf_get_page_ptype(THREAD_ENTRY *thread_p, PAGE_PTR pgptr)
int spage_max_record_size(void)
int spage_check(THREAD_ENTRY *thread_p, PAGE_PTR page_p)
void spage_vacuum_slot(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slotid, bool reusable)
void spage_dump(THREAD_ENTRY *thread_p, FILE *fp, PAGE_PTR page_p, int is_record_printed)
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
#define ER_DIAG_NOT_SPAGE
int spage_max_space_for_new_record(THREAD_ENTRY *thread_p, PAGE_PTR page_p)
void spage_free_saved_spaces(THREAD_ENTRY *thread_p, void *first_save_entry)
static int spage_save_head_init(void *entry_p)
char * fileio_get_volume_label(VOLID vol_id, bool is_peek)
int lf_callback_vpid_compare(void *vpid_1, void *vpid_2)
void end_tran(cubthread::entry *thread_p)
void logpb_fatal_error_exit_immediately_wo_flush(THREAD_ENTRY *thread_p, const char *file_name, const int lineno, const char *fmt,...)
int spage_check_slot_owner(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id)
#define ASSERT_ALIGN(ptr, alignment)
static int spage_get_saved_spaces(THREAD_ENTRY *thread_p, SPAGE_HEADER *page_header_p, PAGE_PTR page_p, int *other_saved_spaces)
T * find(cubthread::entry *thread_p, Key &key)
unsigned int record_length
#define VACUUM_IS_THREAD_VACUUM_WORKER
bool erase_locked(cubthread::entry *thread_p, Key &key, T *&t)
const char * pgbuf_get_volume_label(PAGE_PTR pgptr)
#define ER_OUT_OF_VIRTUAL_MEMORY
PGBUF_LATCH_MODE pgbuf_get_latch_mode(PAGE_PTR pgptr)
static INLINE int spage_find_slot_for_insert(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, RECDES *recdes, PGSLOTID *slotid, void **slotptr, int *used_space) __attribute__((ALWAYS_INLINE))
void spage_collect_statistics(PAGE_PTR page_p, int *npages, int *nrecords, int *rec_length)
unsigned int lf_callback_vpid_hash(void *vpid, int htsize)
int spage_compact(THREAD_ENTRY *thread_p, PAGE_PTR page_p)
static int spage_update_record_after_compact(THREAD_ENTRY *thread_p, PAGE_PTR page_p, SPAGE_HEADER *page_header_p, SPAGE_SLOT *slot_p, const RECDES *record_descriptor_p, int space, int old_waste, int new_waste)
PGLENGTH db_page_size(void)
bool logtb_is_current_active(THREAD_ENTRY *thread_p)
int spage_slots_end_scan(THREAD_ENTRY *thread_p, void **ptr)
int spage_mark_deleted_slot_as_reusable(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id)
SCAN_CODE spage_get_page_header_info(PAGE_PTR page_p, DB_VALUE **page_header_info)
static int spage_save_space(THREAD_ENTRY *thread_p, SPAGE_HEADER *sphdr, PAGE_PTR pgptr, int save)
SCAN_CODE spage_header_next_scan(THREAD_ENTRY *thread_p, int cursor, DB_VALUE **out_values, int out_cnt, void *ptr)
static int spage_insert_data(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, RECDES *recdes, void *slotptr)
PGNSLOTS spage_number_of_records(PAGE_PTR page_p)
static SCAN_CODE spage_search_record(PAGE_PTR page_p, PGSLOTID *out_slot_id_p, RECDES *record_descriptor_p, int is_peeking, int direction, bool skip_empty)
#define ER_SP_SPLIT_WRONG_OFFSET
#define pthread_mutex_destroy(a)
bool log_is_in_crash_recovery(void)
void init(lf_tran_system &transys, int entry_idx, int hash_size, int freelist_block_size, int freelist_block_count, lf_entry_descriptor &edesc)
static void spage_dump_saved_spaces_by_other_trans(THREAD_ENTRY *thread_p, FILE *fp, VPID *vpid)
#define db_private_free_and_init(thrd, ptr)
static void spage_shift_slot_down(PAGE_PTR page_p, SPAGE_HEADER *page_header_p, SPAGE_SLOT *slot_p)
#define db_private_free(thrd, ptr)
int spage_get_record_offset(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id)
#define db_private_alloc(thrd, size)
SCAN_CODE spage_next_record_dont_skip_empty(PAGE_PTR page_p, PGSLOTID *out_slot_id_p, RECDES *record_descriptor_p, int is_peeking)
PGSLOTID spage_find_free_slot(PAGE_PTR page_p, SPAGE_SLOT **out_slot_p, PGSLOTID start_slot)
void pgbuf_get_vpid(PAGE_PTR pgptr, VPID *vpid)
int spage_split(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, int offset, PGSLOTID *out_new_slot_id_p)
static INLINE void spage_verify_header(PAGE_PTR page_p) __attribute__((ALWAYS_INLINE))
PGNSLOTS spage_number_of_slots(PAGE_PTR page_p)
static void error(const char *msg)
static int spage_save_head_free(void *entry_p)
static int spage_get_saved_spaces_by_other_trans(THREAD_ENTRY *thread_p, SPAGE_HEADER *sphdr, PAGE_PTR pgptr)
#define ER_SP_INVALID_HEADER
LOG_TDES * LOG_FIND_CURRENT_TDES(THREAD_ENTRY *thread_p=NULL)
PGSLOTID spage_delete(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id)
static INLINE bool spage_is_unknown_slot(PGSLOTID slotid, SPAGE_HEADER *sphdr, SPAGE_SLOT *sptr) __attribute__((ALWAYS_INLINE))
#define pgbuf_fix_if_not_deallocated(thread_p, vpid, latch_mode, latch_condition, page)
#define LOG_FIND_THREAD_TRAN_INDEX(thrd)
int spage_get_space_for_record(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id)
#define ER_SP_UNKNOWN_SLOTID
static PGLENGTH spage_User_page_size
void spage_boot(THREAD_ENTRY *thread_p)
static LF_ENTRY_DESCRIPTOR spage_Saving_entry_descriptor
unsigned int offset_to_record
static int spage_update_record_in_place(PAGE_PTR page_p, SPAGE_HEADER *page_header_p, SPAGE_SLOT *slot_p, const RECDES *record_descriptor_p, int space)
#define SPAGE_DB_PAGESIZE
#define pthread_mutex_unlock(a)
static void spage_shift_slot_up(PAGE_PTR page_p, SPAGE_HEADER *page_header_p, SPAGE_SLOT *slot_p)
#define free_and_init(ptr)
#define DB_ALIGN(offset, align)
SCAN_CODE spage_previous_record(PAGE_PTR page_p, PGSLOTID *out_slot_id_p, RECDES *record_descriptor_p, int is_peeking)
static void spage_dump_header(FILE *fp, const SPAGE_HEADER *sphdr)
#define SPAGE_SEARCH_PREV
#define DB_WASTED_ALIGN(offset, align)
int spage_put(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, int offset, const RECDES *record_descriptor_p)
static INLINE SPAGE_SLOT * spage_find_slot(PAGE_PTR pgptr, SPAGE_HEADER *sphdr, PGSLOTID slotid, bool is_unknown_slot_check) __attribute__((ALWAYS_INLINE))
static void spage_dump_record(FILE *Fp, PAGE_PTR page_p, PGSLOTID slot_id, SPAGE_SLOT *slot_p)
int spage_get_free_space_without_saving(THREAD_ENTRY *thread_p, PAGE_PTR page_p, bool *need_update)
static int spage_check_mvcc_updatable(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, int mvcc_delete_record_length, int mvcc_insert_record_length)
static SCAN_CODE spage_get_record_data(PAGE_PTR pgptr, SPAGE_SLOT *sptr, RECDES *recdes, bool ispeeking)
SCAN_CODE spage_next_record(PAGE_PTR page_p, PGSLOTID *out_slot_id_p, RECDES *record_descriptor_p, int is_peeking)
#define DB_VALUE_TYPE(value)
#define SPAGE_OVERFLOW(offset)
int spage_get_free_space(THREAD_ENTRY *thread_p, PAGE_PTR page_p)
int spage_header_size(void)
int spage_slot_size(void)
bool spage_is_valid_anchor_type(const INT16 anchor_type)
static void spage_set_slot(SPAGE_SLOT *slot_p, int offset, int length, INT16 type)
static void * spage_save_head_alloc(void)
int db_make_int(DB_VALUE *value, const int num)
struct spage_header SPAGE_HEADER
int spage_header_end_scan(THREAD_ENTRY *thread_p, void **ptr)
bool logtb_is_active(THREAD_ENTRY *thread_p, TRANID trid)
#define ER_SP_TAKEOUT_WRONG_OFFSET
#define ER_SP_BAD_INSERTION_SLOT
INT16 spage_get_record_type(PAGE_PTR page_p, PGSLOTID slot_id)
int spage_merge(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID first_slot_id, PGSLOTID second_slot_id)
#define VACUUM_ER_LOG_ERROR
static int spage_add_new_slot(THREAD_ENTRY *thread_p, PAGE_PTR page_p, SPAGE_HEADER *page_header_p, int *out_space_p)
#define pthread_mutex_lock(a)
bool spage_need_compact(THREAD_ENTRY *thread_p, PAGE_PTR page_p)
#define LF_EM_USING_MUTEX
VPID * pgbuf_get_vpid_ptr(PAGE_PTR pgptr)
#define SPAGE_SEARCH_NEXT
void start_tran(cubthread::entry *thread_p)
int spage_append(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, const RECDES *record_descriptor_p)
int spage_insert_at(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, RECDES *record_descriptor_p)
int lf_callback_vpid_copy(void *src, void *dest)
int spage_insert_for_recovery(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, RECDES *record_descriptor_p)
#define SPAGE_HEADER_FLAG_NONE
static int spage_get_total_saved_spaces(THREAD_ENTRY *thread_p, SPAGE_HEADER *page_header_p, PAGE_PTR page_p)