45 #if defined (SERVER_MODE) 50 #if defined (SERVER_MODE) 56 #include <condition_variable> 66 #define MAX_SLOTS_IN_PAGE (IO_MAX_PAGE_SIZE / sizeof (SPAGE_SLOT)) 69 #define VACUUM_STATS_CACHE_SIZE 100 72 #define VACUUM_FIRST_LOG_PAGEID_IN_BLOCK(blockid) \ 73 ((blockid) * vacuum_Data.log_block_npages) 75 #define VACUUM_LAST_LOG_PAGEID_IN_BLOCK(blockid) \ 76 (VACUUM_FIRST_LOG_PAGEID_IN_BLOCK (blockid + 1) - 1) 126 #define VACUUM_DATA_ENTRY_FLAG_MASK 0xE000000000000000 128 #define VACUUM_DATA_ENTRY_BLOCKID_MASK 0x1FFFFFFFFFFFFFFF 132 #define VACUUM_BLOCK_STATUS_MASK 0xC000000000000000 133 #define VACUUM_BLOCK_STATUS_VACUUMED 0x8000000000000000 134 #define VACUUM_BLOCK_STATUS_IN_PROGRESS_VACUUM 0x4000000000000000 135 #define VACUUM_BLOCK_STATUS_AVAILABLE 0x0000000000000000 137 #define VACUUM_BLOCK_FLAG_INTERRUPTED 0x2000000000000000 141 #define VACUUM_BLOCKID_WITHOUT_FLAGS(blockid) \ 142 ((blockid) & VACUUM_DATA_ENTRY_BLOCKID_MASK) 145 #define VACUUM_BLOCKID_GET_FLAGS(blockid) \ 146 ((blockid) & VACUUM_DATA_ENTRY_FLAG_MASK) 153 #define VACUUM_BLOCK_STATUS(blockid) \ 154 ((blockid) & VACUUM_BLOCK_STATUS_MASK) 157 #define VACUUM_BLOCK_STATUS_IS_VACUUMED(blockid) \ 158 (VACUUM_BLOCK_STATUS (blockid) == VACUUM_BLOCK_STATUS_VACUUMED) 159 #define VACUUM_BLOCK_STATUS_IS_IN_PROGRESS(blockid) \ 160 (VACUUM_BLOCK_STATUS (blockid) == VACUUM_BLOCK_STATUS_IN_PROGRESS_VACUUM) 161 #define VACUUM_BLOCK_STATUS_IS_AVAILABLE(blockid) \ 162 (VACUUM_BLOCK_STATUS (blockid) == VACUUM_BLOCK_STATUS_AVAILABLE) 165 #define VACUUM_BLOCK_STATUS_SET_VACUUMED(blockid) \ 166 ((blockid) = ((blockid) & ~VACUUM_BLOCK_STATUS_MASK) | VACUUM_BLOCK_STATUS_VACUUMED) 167 #define VACUUM_BLOCK_STATUS_SET_IN_PROGRESS(blockid) \ 168 ((blockid) = ((blockid) & ~VACUUM_BLOCK_STATUS_MASK) | VACUUM_BLOCK_STATUS_IN_PROGRESS_VACUUM) 169 #define VACUUM_BLOCK_STATUS_SET_AVAILABLE(blockid) \ 170 ((blockid) = ((blockid) & ~VACUUM_BLOCK_STATUS_MASK) | VACUUM_BLOCK_STATUS_AVAILABLE) 172 #define VACUUM_BLOCK_IS_INTERRUPTED(blockid) \ 173 (((blockid) & VACUUM_BLOCK_FLAG_INTERRUPTED) != 0) 174 #define VACUUM_BLOCK_SET_INTERRUPTED(blockid) \ 175 ((blockid) |= VACUUM_BLOCK_FLAG_INTERRUPTED) 176 #define VACUUM_BLOCK_CLEAR_INTERRUPTED(blockid) \ 177 ((blockid) &= ~VACUUM_BLOCK_FLAG_INTERRUPTED) 194 static const INT16 INDEX_NOT_FOUND = -1;
196 bool is_empty ()
const;
197 bool is_index_valid (INT16
index)
const;
203 #define VACUUM_DATA_PAGE_HEADER_SIZE (offsetof (VACUUM_DATA_PAGE, data)) 214 #define vacuum_fix_data_page(thread_p, vpidp) \ 216 (vacuum_Data.first_page != NULL && VPID_EQ (pgbuf_get_vpid_ptr ((PAGE_PTR) vacuum_Data.first_page), vpidp) ? \ 218 vacuum_Data.first_page : \ 220 vacuum_Data.last_page != NULL && VPID_EQ (pgbuf_get_vpid_ptr ((PAGE_PTR) vacuum_Data.last_page), vpidp) ? \ 222 vacuum_Data.last_page : \ 224 (VACUUM_DATA_PAGE *) pgbuf_fix (thread_p, vpidp, OLD_PAGE, PGBUF_LATCH_WRITE, PGBUF_UNCONDITIONAL_LATCH)) 227 #define vacuum_unfix_data_page(thread_p, data_page) \ 230 if ((data_page) != vacuum_Data.first_page && (data_page) != vacuum_Data.last_page) \ 233 pgbuf_unfix (thread_p, (PAGE_PTR) (data_page)); \ 235 (data_page) = NULL; \ 239 #define vacuum_set_dirty_data_page(thread_p, data_page, free) \ 242 if ((data_page) != vacuum_Data.first_page && (data_page) != vacuum_Data.last_page) \ 244 pgbuf_set_dirty (thread_p, (PAGE_PTR) (data_page), free); \ 249 pgbuf_set_dirty (thread_p, (PAGE_PTR) (data_page), DONT_FREE); \ 251 if ((free) == FREE) \ 253 (data_page) = NULL; \ 265 #define vacuum_unfix_first_and_last_data_page(thread_p) \ 268 if (vacuum_Data.last_page != NULL && vacuum_Data.last_page != vacuum_Data.first_page) \ 270 pgbuf_unfix (thread_p, (PAGE_PTR) vacuum_Data.last_page); \ 272 vacuum_Data.last_page = NULL; \ 273 if (vacuum_Data.first_page != NULL) \ 275 pgbuf_unfix (thread_p, (PAGE_PTR) vacuum_Data.first_page); \ 277 vacuum_Data.first_page = NULL; \ 293 bool is_valid ()
const;
294 bool is_loaded ()
const;
296 void increment_blockid ();
297 void set_on_vacuum_data_start ();
298 void readjust_to_vacuum_data_changes ();
302 const VPID &get_page_vpid ()
const;
304 INT16 get_index ()
const;
307 void start_job_on_current_entry ()
const;
309 void force_data_update ();
325 #define vacuum_job_cursor_print_format "vacuum_job_cursor(%lld, %d|%d|%d)" 326 #define vacuum_job_cursor_print_args(cursor) \ 327 (long long int) (cursor).get_blockid (), VPID_AS_ARGS (&(cursor).get_page_vpid ()), (int) (cursor).get_index () 334 void request_shutdown ();
335 bool is_shutdown_requested ();
336 bool check_shutdown_request ();
342 #if defined (SERVER_MODE) 344 #endif // SERVER_MODE 348 #if defined (SERVER_MODE) 350 std::condition_variable m_condvar;
351 #endif // SERVER_MODE 384 #if defined (SA_MODE) 385 bool is_vacuum_complete;
394 , page_data_max_count (0)
395 , log_block_npages (0)
397 , shutdown_sequence ()
398 , is_archive_removal_safe (false)
400 , is_restoredb_session (false)
401 #
if defined (SA_MODE)
402 , is_vacuum_complete (false)
408 bool is_empty ()
const;
409 bool has_one_page ()
const;
418 void set_oldest_unvacuumed_on_boot ();
422 void upgrade_oldest_unvacuumed (
MVCCID mvccid);
460 #define VACUUM_BLOCK_DATA_BUFFER_CAPACITY 1024 470 #define VACUUM_PREFETCH_LOG_BLOCK_BUFFER_PAGES ((size_t) (1 + vacuum_Data.log_block_npages)) 472 #if defined(SERVER_MODE) 473 #define VACUUM_MAX_TASKS_IN_WORKER_POOL ((size_t) (3 * prm_get_integer_value (PRM_ID_VACUUM_WORKER_COUNT))) 476 #define VACUUM_FINISHED_JOB_QUEUE_CAPACITY 2048 478 #define VACUUM_LOG_BLOCK_BUFFER_INVALID (-1) 481 #define VACUUM_WORKER_INDEX_TO_TRANID(index) \ 482 (-index + LOG_LAST_VACUUM_WORKER_TRANID) 485 #define VACUUM_WORKER_TRANID_TO_INDEX(trid) \ 486 (-trid + LOG_LAST_VACUUM_WORKER_TRANID) 531 #define VACUUM_PERF_HEAP_START(thread_p, helper) \ 532 PERF_UTIME_TRACKER_START (thread_p, &(helper)->time_track); 533 #define VACUUM_PERF_HEAP_TRACK_PREPARE(thread_p, helper) \ 534 PERF_UTIME_TRACKER_TIME_AND_RESTART (thread_p, &(helper)->time_track, \ 535 PSTAT_HEAP_VACUUM_PREPARE) 536 #define VACUUM_PERF_HEAP_TRACK_EXECUTE(thread_p, helper) \ 537 PERF_UTIME_TRACKER_TIME_AND_RESTART (thread_p, &(helper)->time_track, \ 538 PSTAT_HEAP_VACUUM_EXECUTE) 539 #define VACUUM_PERF_HEAP_TRACK_LOGGING(thread_p, helper) \ 540 PERF_UTIME_TRACKER_TIME_AND_RESTART (thread_p, &(helper)->time_track, \ 541 PSTAT_HEAP_VACUUM_LOG) 545 #define VACUUM_LOG_VACUUM_HEAP_REUSABLE 0x8000 547 #define VACUUM_LOG_VACUUM_HEAP_ALL_VACUUMED 0x4000 549 #define VACUUM_LOG_VACUUM_HEAP_MASK 0xC000 552 #define VACUUM_DEFAULT_HEAP_OBJECT_BUFFER_SIZE 4000 589 #define VACUUM_DROPPED_FILES_PAGE_HEADER_SIZE \ 590 (offsetof (VACUUM_DROPPED_FILES_PAGE, dropped_files)) 593 #define VACUUM_DROPPED_FILES_PAGE_CAPACITY \ 594 ((INT16) ((DB_PAGESIZE - VACUUM_DROPPED_FILES_PAGE_HEADER_SIZE) \ 595 / sizeof (VACUUM_DROPPED_FILE))) 597 #define VACUUM_DROPPED_FILES_MAX_PAGE_CAPACITY \ 598 ((INT16) ((IO_MAX_PAGE_SIZE - VACUUM_DROPPED_FILES_PAGE_HEADER_SIZE) \ 599 / sizeof (VACUUM_DROPPED_FILE))) 601 #define VACUUM_DROPPED_FILE_FLAG_DUPLICATE 0x8000 606 #define vacuum_fix_dropped_entries_page(thread_p, vpidp, latch) \ 607 ((VACUUM_DROPPED_FILES_PAGE *) pgbuf_fix (thread_p, vpidp, OLD_PAGE, \ 609 PGBUF_UNCONDITIONAL_LATCH)) 610 #define vacuum_unfix_dropped_entries_page(thread_p, dropped_page) \ 613 pgbuf_unfix (thread_p, (PAGE_PTR) (dropped_page)); \ 614 (dropped_page) = NULL; \ 616 #define vacuum_set_dirty_dropped_entries_page(thread_p, dropped_page, free) \ 619 pgbuf_set_dirty (thread_p, (PAGE_PTR) (dropped_page), free); \ 620 if ((free) == FREE) \ 622 (dropped_page) = NULL; \ 626 #if !defined (NDEBUG) 637 #define VACUUM_TRACK_DROPPED_FILES_SIZE \ 638 (DB_PAGESIZE + sizeof (VACUUM_TRACK_DROPPED_FILES *)) 655 #define VACUUM_LOG_DATA_ENTRY_MSG(name) \ 656 "name = {blockid = %lld, flags = %lld, start_lsa = %lld|%d, oldest_visible_mvccid=%llu, newest_mvccid=%llu }" 657 #define VACUUM_LOG_DATA_ENTRY_AS_ARGS(data) \ 658 (long long) VACUUM_BLOCKID_WITHOUT_FLAGS ((data)->blockid), (long long) VACUUM_BLOCKID_GET_FLAGS ((data)->blockid), \ 659 LSA_AS_ARGS (&(data)->start_lsa), (unsigned long long) (data)->oldest_visible_mvccid, \ 660 (unsigned long long) (data)->newest_mvccid 674 bool sa_mode_partial_block);
677 char **undo_data_ptr,
int *undo_data_size,
LOG_VACUUM_INFO * vacuum_info,
678 bool * is_file_dropped,
bool stop_after_vacuum_info);
687 bool is_vacuum_complete);
701 bool update_best_space_stat,
bool unlatch_page);
706 RECDES * undo_recdes,
bool reusable);
711 #if defined (SERVER_MODE) 712 static int vacuum_compare_dropped_files_version (INT32 version_a, INT32 version_b);
713 #endif // SERVER_MODE 737 #if defined (SA_MODE) 739 PERF_UTIME_TRACKER & perf_tracker);
742 #if !defined (NDEBUG) 746 #define VACUUM_VERIFY_VACUUM_DATA(thread_p) vacuum_verify_vacuum_data_debug (thread_p) 748 #define VACUUM_VERIFY_VACUUM_DATA(thread_p) 787 context.retire_system_worker ();
789 if (context.vacuum_worker !=
NULL)
791 assert (context.vacuum_worker == &vacuum_Master);
792 context.vacuum_worker =
NULL;
809 bool check_shutdown ()
const;
810 bool is_task_queue_full ()
const;
811 bool should_interrupt_iteration ()
const;
812 bool is_cursor_entry_ready_to_vacuum ()
const;
813 bool is_cursor_entry_available ()
const;
814 void start_job_on_cursor_entry ()
const;
815 bool should_force_data_update ()
const;
841 return m_pool->claim ();
845 return m_pool->retire (worker);
852 context.tran_index = 0;
862 context.private_lru_index = context.vacuum_worker->private_lru_index;
867 context.retire_system_worker ();
869 if (context.vacuum_worker !=
NULL)
872 m_pool->retire (*context.vacuum_worker);
873 context.vacuum_worker =
NULL;
881 context.private_lru_index = -1;
910 assert (!thread_ref.check_interrupt);
930 #if defined (SA_MODE) 933 PERF_UTIME_TRACKER & perf_tracker)
949 PERF_UTIME_TRACKER_START (thread_p, &perf_tracker);
964 #if defined(SERVER_MODE) 980 PERF_UTIME_TRACKER perf_tracker;
982 bool dummy_continue_check_interrupt;
989 PERF_UTIME_TRACKER_START (thread_p, &perf_tracker);
999 if (!vacuum_Block_data_buffer->
is_empty ())
1027 "Job for blockid = %lld %s. Skip.",
1033 if (!vacuum_Block_data_buffer->
is_empty ()
1034 || vacuum_Finished_job_queue->
is_full ()
1047 #if !defined (NDEBUG) 1061 vacuum_sa_run_job (thread_p, partial_entry,
true, perf_tracker);
1085 vacuum_Data.is_vacuum_complete =
true;
1113 fprintf (outfp,
"vacuum did not boot properly.\n");
1121 fprintf (outfp,
"vacuum did not boot properly.\n");
1125 fprintf (outfp,
"\n");
1126 fprintf (outfp,
"*** Vacuum Dump ***\n");
1127 fprintf (outfp,
"First log page ID referenced = %lld ", min_log_pageid);
1133 if (archive_number < 0)
1136 fprintf (outfp,
"\n");
1161 VFID * dropped_files_vfid,
bool is_restore)
1180 #if defined (SA_MODE) 1181 vacuum_Data.is_vacuum_complete =
false;
1186 VFID_COPY (&vacuum_Dropped_files_vfid, dropped_files_vfid);
1200 #if !defined (NDEBUG) 1201 vacuum_Track_dropped_files =
NULL;
1208 if (vacuum_Block_data_buffer ==
NULL)
1217 if (vacuum_Finished_job_queue ==
NULL)
1273 if (thread_p ==
NULL)
1298 #if defined (SERVER_MODE) 1305 bool log_vacuum_worker_pool =
1310 vacuum_Worker_threads =
1312 VACUUM_MAX_TASKS_IN_WORKER_POOL,
"vacuum workers",
1313 vacuum_Worker_context_manager, 1, log_vacuum_worker_pool);
1320 vacuum_Master_daemon =
1344 if (vacuum_Worker_threads !=
NULL)
1346 #if defined (SERVER_MODE) 1349 #endif // SERVER_MODE 1355 vacuum_Worker_context_manager =
NULL;
1368 if (vacuum_Master_daemon !=
NULL)
1373 vacuum_Master_context_manager =
NULL;
1397 if (vacuum_Finished_job_queue !=
NULL)
1400 if (!vacuum_Finished_job_queue->
is_empty ())
1406 vacuum_Finished_job_queue =
NULL;
1409 if (vacuum_Block_data_buffer !=
NULL)
1411 while (!vacuum_Block_data_buffer->
is_empty ())
1429 vacuum_Block_data_buffer =
NULL;
1432 #if !defined(SERVER_MODE) 1470 bool reusable =
false;
1471 int object_count = 0;
1498 for (obj_ptr = page_ptr + 1;
1506 vacuum_heap_page (thread_p, page_ptr, object_count, threshold_mvccid, &hfid, &reusable, was_interrupted);
1514 #if defined (NDEBUG) 1515 if (!thread_p->shutdown)
1556 assert (n_heap_objects > 0);
1564 #if !defined (NDEBUG) 1570 for (i = 1; i < n_heap_objects; i++)
1574 assert (heap_objects[i].oid.slotid > 0);
1590 if (was_interrupted)
1607 assert (n_heap_objects == 1);
1619 assert (n_heap_objects == 1);
1622 "Heap page %d|%d was deallocated during previous run and reused as file table page",
1660 *hfid = helper.
hfid;
1665 helper.
hfid = *hfid;
1669 for (obj_index = 0; obj_index < n_heap_objects; obj_index++)
1684 "Could not prepare vacuum for object %d|%d|%d.",
1685 heap_objects[obj_index].oid.volid, heap_objects[obj_index].
oid.
pageid,
1779 assert (n_heap_objects == 1);
1786 "Changed vacuum status of heap page %d|%d, lsa=%lld|%d from once to none.",
1819 "Successfully removed page %d|%d from heap file (%d, %d|%d).",
1941 if (!
VPID_EQ (&crt_fwd_vpid, &forward_vpid))
2098 "Failed to get MVCC header from overflow page %d|%d.",
VPID_AS_ARGS (&forward_vpid));
2164 char *start_p, *existing_data_p, *new_data_p;
2165 int repid_and_flag_bits = 0, mvcc_flags = 0;
2183 update_record = &helper->
record;
2184 start_p = update_record->
data;
2208 assert (existing_data_p >= new_data_p);
2209 memmove (new_data_p, existing_data_p, update_record->
length -
CAST_BUFLEN (existing_data_p - start_p));
2241 "set mvcc header (flag=%d, repid=%d, chn=%d, insid=%llu, " 2242 "delid=%llu, forward object %d|%d|%d with record of type=%d and size=%d",
2261 update_record = &helper->
record;
2262 start_p = update_record->
data;
2267 existing_data_p = start_p + mvcc_header_size_lookup[mvcc_flags];
2269 if (mvcc_flags & OR_MVCC_FLAG_VALID_DELID)
2286 assert (existing_data_p >= new_data_p);
2287 memmove (new_data_p, existing_data_p, update_record->
length -
CAST_BUFLEN (existing_data_p - start_p));
2475 "Failed to obtain class_oid from heap page %d|%d.",
2509 "vacuuming heap found deleted class oid, however hfid and file type " 2510 "have been successfully loaded from file header. ");
2517 "Failed to obtain heap file identifier for class %d|%d|%d)",
OID_AS_ARGS (&class_oid));
2558 if (unlatch_page ==
true)
2587 if (unlatch_page ==
true)
2617 int packed_size = 0,
i = 0;
2618 char *ptr =
NULL, *buffer_p =
NULL;
2622 assert (n_slots > 0 || all_vacuumed);
2626 addr.
pgptr = page_p;
2632 packed_size += n_slots *
sizeof (
PGSLOTID);
2644 assert (packed_size <= (
int)
sizeof (buffer));
2652 for (
i = 0;
i < n_slots;
i++)
2661 slots[
i] = -slots[
i];
2664 memcpy (ptr, slots, n_slots *
sizeof (
PGSLOTID));
2665 ptr += n_slots *
sizeof (
PGSLOTID);
2668 assert ((ptr - buffer_p) == packed_size);
2688 RECDES rebuild_record, peek_record;
2689 int old_header_size, new_header_size;
2696 page_p = rcv->
pgptr;
2698 ptr = (
char *) rcv->
data;
2710 "Change vacuum status for heap page %d|%d, lsa=%lld|%d, from once to none.",
2731 ptr += n_slots *
sizeof (
PGSLOTID);
2741 for (i = 0; i < n_slots; i++)
2746 slotids[
i] = -slotids[
i];
2777 rebuild_record.
type = peek_record.
type;
2779 memcpy (rebuild_record.
data, peek_record.
data, peek_record.
length);
2784 memcpy (rebuild_record.
data + new_header_size, peek_record.
data + old_header_size,
2785 peek_record.
length - old_header_size);
2882 if (vacuum_Block_data_buffer ==
NULL)
2889 "vacuum_produce_log_block_data: blockid=(%lld) start_lsa=(%lld, %d) old_mvccid=(%llu) " 2890 "new_mvccid=(%llu)", (
long long) block_data.blockid,
LSA_AS_ARGS (&block_data.start_lsa),
2891 (
unsigned long long int) block_data.oldest_visible_mvccid,
2892 (
unsigned long long int) block_data.newest_mvccid);
2895 if (!vacuum_Block_data_buffer->
produce (block_data))
2956 #if defined (SERVER_MODE) 2961 PERF_UTIME_TRACKER perf_tracker;
2968 if (check_shutdown ())
2980 PERF_UTIME_TRACKER_START (&thread_ref, &perf_tracker);
2994 m_cursor.set_on_vacuum_data_start ();
3000 m_cursor.force_data_update ();
3003 for (; m_cursor.is_valid () && !should_interrupt_iteration (); m_cursor.increment_blockid ())
3005 if (!is_cursor_entry_ready_to_vacuum ())
3011 if (!is_cursor_entry_available ())
3016 start_job_on_cursor_entry ();
3018 if (should_force_data_update ())
3020 m_cursor.force_data_update ();
3024 #if !defined (NDEBUG) 3057 return check_shutdown () || is_task_queue_full ();
3063 assert (m_cursor.is_valid ());
3065 if (m_cursor.get_current_entry ().newest_mvccid >= m_oldest_visible_mvccid)
3070 "global oldest visible mvccid = %llu.",
3072 (
unsigned long long int) m_oldest_visible_mvccid);
3081 "log_Gl.append.prev_lsa.pageid = %d.",
3103 "Job for blockid = %lld %s. Skip.", (
long long int) entry.
get_blockid (),
3104 entry.
is_vacuumed () ?
"was executed" :
"is in progress");
3112 m_cursor.start_job_on_current_entry ();
3134 #endif // SERVER_MODE 3150 oldest_newest_mvccid = *((
MVCCID *) rcv->
data);
3182 char *undo_data =
NULL;
3184 char *es_uri =
NULL;
3196 OID heap_object_oid;
3197 bool vacuum_complete =
false;
3199 bool is_file_dropped =
false;
3201 PERF_UTIME_TRACKER perf_tracker;
3202 PERF_UTIME_TRACKER job_time_tracker;
3203 #if defined (SA_MODE) 3204 bool dummy_continue_check =
false;
3212 assert (thread_p->get_system_tdes () !=
NULL);
3217 PERF_UTIME_TRACKER_START (thread_p, &perf_tracker);
3218 PERF_UTIME_TRACKER_START (thread_p, &job_time_tracker);
3239 if (!sa_mode_partial_block)
3264 #if defined(SERVER_MODE) 3265 if (thread_p->shutdown)
3300 &undo_data_size, &log_vacuum, &is_file_dropped,
false);
3310 if (is_file_dropped)
3314 "Skip vacuuming based on %lld|%d in file %d|%d. Log record info: rcvindex=%d.",
3320 #if !defined (NDEBUG) 3335 heap_object_oid.
volid = log_record_data.
volid;
3349 "collected oid %d|%d|%d, in file %d|%d, based on %lld|%d",
OID_AS_ARGS (&heap_object_oid),
3362 &new_version, &key_buf);
3382 "vacuum from b-tree: btidp(%d, %d|%d) oid(%d|%d|%d) " 3383 "class_oid(%d|%d|%d), purpose=rem_object, mvccid=%llu, based on %lld|%d",
3393 "vacuum from b-tree: btidp(%d, %d|%d) oid(%d|%d|%d) class_oid(%d|%d|%d), " 3394 "purpose=rem_insid, mvccid=%llu, based on %lld|%d",
3405 "invalid vacuum case for RVBT_MVCC_NOTIFY_VACUUM btid(%d, %d|%d) " 3406 "oid(%d|%d|%d) class_oid(%d|%d|%d), based on %lld|%d",
3417 "vacuum from b-tree: btidp(%d, %d|%d) oid(%d|%d|%d) " 3418 "class_oid(%d|%d|%d), purpose=rem_object, mvccid=%llu, based on %lld|%d",
3420 (
unsigned long long int) mvccid,
LSA_AS_ARGS (&rcv_lsa));
3428 "vacuum from b-tree: btidp(%d, (%d %d)) oid(%d, %d, %d) " 3429 "class_oid(%d, %d, %d), purpose=rem_insid, mvccid=%llu, based on %lld|%d",
3431 (
unsigned long long int) mvccid,
LSA_AS_ARGS (&rcv_lsa));
3442 if (thread_p->shutdown)
3450 "Error deleting object or insert MVCCID: error_code=%d", error_code);
3485 error_code =
vacuum_heap (thread_p, worker, threshold_mvccid, was_interrupted);
3496 vacuum_complete =
true;
3503 if (!sa_mode_partial_block)
3510 #if defined (SERVER_MODE) 3518 PERF_UTIME_TRACKER_TIME (thread_p, &job_time_tracker,
PSTAT_VAC_JOB);
3534 size_t size_worker_prefetch_log_buffer;
3640 if (is_vacuum_complete)
3646 "Processing log block %lld is complete. Notify master.", (
long long int) data->
get_blockid ());
3652 #if defined (SERVER_MODE) 3655 #if !defined (NDEBUG) 3657 assert (thread_p->shutdown);
3674 "Processing log block %lld is interrupted!", (
long long int) data->
get_blockid ());
3679 "Processing log block %lld is interrupted!", (
long long int) data->
get_blockid ());
3685 if (!vacuum_Finished_job_queue->
produce (blockid))
3691 #if defined (SERVER_MODE) 3696 vacuum_Master_daemon->
wakeup ();
3737 log_lsa->
offset += (int) size;
3754 log_lsa->
offset = (int) LOGAREA_SIZE;
3776 std::memcpy (area, log_page->
area + log_lsa->
offset, length);
3777 log_lsa->
offset += length;
3781 int copy_length = 0;
3782 int area_offset = 0;
3787 if (log_lsa->
offset + length < (
int) LOGAREA_SIZE)
3789 copy_length = length;
3793 copy_length = LOGAREA_SIZE - (int) log_lsa->
offset;
3795 std::memcpy (area + area_offset, log_page->
area + log_lsa->
offset, copy_length);
3796 length -= copy_length;
3797 area_offset += copy_length;
3798 log_lsa->
offset += copy_length;
3819 LOG_DATA * log_record_data,
MVCCID * mvccid,
char **undo_data_ptr,
int *undo_data_size,
3820 LOG_VACUUM_INFO * vacuum_info,
bool * is_file_dropped,
bool stop_after_vacuum_info)
3827 char *new_undo_data_buffer =
NULL;
3828 bool is_zipped =
false;
3836 assert (stop_after_vacuum_info || is_file_dropped !=
NULL);
3837 assert (stop_after_vacuum_info || worker !=
NULL);
3838 assert (stop_after_vacuum_info || undo_data_ptr !=
NULL);
3839 assert (stop_after_vacuum_info || undo_data_size !=
NULL);
3841 if (!stop_after_vacuum_info)
3843 *undo_data_ptr =
NULL;
3844 *undo_data_size = 0;
3852 log_rec_type = log_rec_header->
type;
3862 *mvccid = mvcc_undo->
mvccid;
3865 *log_record_data = mvcc_undo->
undo.
data;
3883 *mvccid = mvcc_undoredo->
mvccid;
3912 *mvccid = mvcc_undo->
mvccid;
3915 *log_record_data = mvcc_undo->
undo.
data;
3934 if (stop_after_vacuum_info)
3950 VFID_COPY (&vfid, &vacuum_Last_dropped_vfid);
3965 if (*is_file_dropped ==
true)
3987 *undo_data_size = ulength;
3993 *undo_data_ptr = (
char *) log_page_p->
area + log_lsa_p->
offset;
4001 new_undo_data_buffer = (
char *) realloc (worker->
undo_data_buffer, *undo_data_size);
4002 if (new_undo_data_buffer ==
NULL)
4039 #if defined (SERVER_MODE) 4047 vacuum_get_worker_min_dropped_files_version (
void)
4050 INT32 min_version = -1;
4057 && (min_version == -1
4058 || vacuum_compare_dropped_files_version (min_version, vacuum_Workers[i].drop_files_version) > 0))
4066 #endif // SERVER_MODE 4117 if (data_page ==
NULL)
4127 is_page_dirty =
false;
4134 entry = &data_page->
data[
i];
4139 is_page_dirty =
true;
4154 if (data_page ==
NULL)
4169 if (log_blockid < 0)
4174 "vacuum_data_load_and_recover: do not update last_blockid; prev_lsa = %lld|%d",
4185 "vacuum_data_load_and_recover: set last_blockid = %lld to logpb_last_complete_blockid ()",
4197 "vacuum_data_load_and_recover: set last_blockid = %lld to MAX(" 4198 "log_Gl.hdr.vacuum_last_blockid=%lld, vacuum_Data.last_page->data->blockid=%lld)",
4211 "vacuum_data_load_and_recover: set last_blockid = %lld to last data blockid = %lld",
4232 #if !defined (NDEBUG) 4244 if (data_page !=
NULL)
4266 #if !defined (NDEBUG) 4277 #if !defined (NDEBUG) 4292 VPID_COPY (&vpid, &vacuum_Dropped_files_vpid);
4309 #if !defined (NDEBUG) 4311 if (track_new ==
NULL)
4314 for (track_new = track_head; track_new !=
NULL; track_new = save_next)
4326 if (track_head ==
NULL)
4328 track_head = track_tail = track_new;
4333 track_tail->next_tracked_page = track_new;
4334 track_tail = track_new;
4340 #if !defined(NDEBUG) 4341 vacuum_Track_dropped_files = track_head;
4359 VPID first_page_vpid;
4380 if (data_page ==
NULL)
4458 VPID first_page_vpid;
4471 &first_page_vpid, (
PAGE_PTR *) (&dropped_files_page));
4477 if (dropped_files_page ==
NULL)
4508 #if defined (SERVER_MODE) 4521 #else // not SERVER_MODE = SA_MODE 4523 #endif // not SERVER_MODE = SA_MODE 4535 #define TEMP_BUFFER_SIZE VACUUM_FINISHED_JOB_QUEUE_CAPACITY 4544 INT16 n_finished_blocks = 0;
4546 INT16 page_start_index = 0;
4552 && vacuum_Finished_job_queue->
consume (finished_blocks[n_finished_blocks]))
4558 ++n_finished_blocks;
4560 if (n_finished_blocks == 0)
4573 page_start_index = 0;
4576 page_unvacuumed_blockid = page_unvacuumed_data->
get_blockid ();
4582 while ((index < n_finished_blocks)
4586 data = page_unvacuumed_data + (blockid - page_unvacuumed_blockid);
4595 "Mark block %lld as vacuumed.", (
long long int) data->
get_blockid ());
4603 "Mark block %lld as interrupted.", (
long long int) data->
get_blockid ());
4609 if (index == page_start_index)
4621 page_unvacuumed_data++;
4631 if (data_page ==
NULL)
4634 if (prev_data_page !=
NULL)
4638 if (n_finished_blocks > index)
4642 "Finished blocks not found in vacuum data!!!!");
4654 page_start_index =
index;
4657 page_unvacuumed_blockid = page_unvacuumed_data->
get_blockid ();
4682 &finished_blocks[page_start_index]);
4687 if (prev_data_page !=
NULL)
4691 if (index == n_finished_blocks)
4705 prev_data_page = data_page;
4708 if (data_page ==
NULL)
4714 page_start_index =
index;
4717 page_unvacuumed_blockid = page_unvacuumed_data->
get_blockid ();
4726 #if !defined (NDEBUG) 4730 #undef TEMP_BUFFER_SIZE 4753 assert ((*data_page)->index_unvacuumed == (*data_page)->index_free);
4755 if (*data_page == vacuum_Data.
last_page)
4762 "Last page, vpid = %d|%d, is empty and was reset. %s",
4766 "This is also first page." :
"This is different from first page.");
4771 else if (*data_page == vacuum_Data.
first_page)
4775 VPID save_first_vpid;
4778 if (*data_page ==
NULL)
4798 "Failed to update file descriptor!!!", save_first_vpid.
volid, save_first_vpid.
pageid);
4806 vacuum_Data_load.
vpid_first = save_first_page->next_page;
4816 "Failed to deallocate first page from vacuum data - %d|%d!!!",
4825 vacuum_Data_load.
vpid_first = save_first_vpid;
4845 if (prev_data_page ==
NULL)
4856 VPID_COPY (&save_next_vpid, &(*data_page)->next_page);
4866 "Failed to deallocate page from vacuum data - %d|%d!!!",
4874 sizeof (
VPID), &prev_data_page->
next_page, &save_next_vpid);
4875 VPID_COPY (&prev_data_page->next_page, &save_next_vpid);
4898 const char *rcv_data_ptr = rcv->
data;
4909 if (rcv_data_ptr !=
NULL)
4911 while (rcv_data_ptr < (
char *) rcv->
data + rcv->
length)
4917 assert (blockid >= page_unvacuumed_blockid);
4918 data_index = (int) (blockid - page_unvacuumed_blockid) + data_page->
index_unvacuumed;
4919 assert (data_index < data_page->index_free);
4967 const char *rcv_data_ptr = (
const char *) data;
4971 if (rcv_data_ptr !=
NULL)
4973 fprintf (fp,
" Set block status for vacuum data to : \n");
4974 while (rcv_data_ptr < (
char *) data + length)
4983 fprintf (fp,
" Blockid %lld: vacuumed. \n", (
long long int) blockid);
4987 fprintf (fp,
" Blockid %lld: available and interrupted. \n", (
long long int) blockid);
5008 #define MAX_PAGE_MAX_DATA_ENTRIES (IO_MAX_PAGE_SIZE / sizeof (VACUUM_DATA_ENTRY)) 5015 bool is_sysop =
false;
5016 bool was_vacuum_data_empty =
false;
5024 if (vacuum_Block_data_buffer ==
NULL)
5031 if (vacuum_Block_data_buffer->
is_empty ())
5056 if (vacuum_Block_data_buffer->
is_empty ())
5065 if (log_blockid > vacuum_Data.
get_last_blockid () + LOG_BLOCK_TRAILING_DIFF)
5095 save_page_free_data = page_free_data;
5099 while (vacuum_Block_data_buffer->
consume (consumed_data))
5104 for (next_blockid = vacuum_Data.
get_last_blockid () + 1; next_blockid <= consumed_data.
blockid; next_blockid++)
5114 if (page_free_data > save_page_free_data)
5117 (
PGLENGTH) (save_page_free_data - data_page->data),
5119 - (
char *) save_page_free_data), save_page_free_data);
5143 "Could not allocate new page for vacuum data!!!!");
5148 if (data_page ==
NULL)
5159 0, sizeof (
VPID),
NULL, &next_vpid);
5167 save_page_free_data = page_free_data;
5175 next_blockid = consumed_data.
blockid - 1;
5179 page_free_data->
blockid = next_blockid;
5180 if (next_blockid == consumed_data.
blockid)
5188 #if !defined (NDEBUG) 5198 "Add block %lld, start_lsa=%lld|%d, oldest_visible_mvccid=%llu, newest_mvccid=%llu. " 5199 "Hdr last blockid = %lld\n",
5215 "Block %lld has no MVCC ops and is skipped (marked as vacuumed).", next_blockid);
5225 if (was_vacuum_data_empty)
5231 if (save_page_free_data < page_free_data)
5235 (
PGLENGTH) (save_page_free_data - data_page->data),
5236 CAST_BUFLEN (((
char *) page_free_data) - (
char *) save_page_free_data),
5237 save_page_free_data);
5256 #if !defined (NDEBUG) 5278 if (next_vpid ==
NULL)
5305 fprintf (fp,
" Reset link in vacuum data page to -1|-1. \n");
5309 fprintf (fp,
" Set link in vacuum data page to %d|%d. \n", ((
VPID *) data)->volid, ((
VPID *) data)->pageid);
5350 fprintf (fp,
" Append log blocks to vacuum data : \n");
5352 while ((
char *) vacuum_data_entry < (
char *) data + length)
5354 assert ((
char *) (vacuum_data_entry + 1) <= (
char *) data + length);
5356 fprintf (fp,
" { Blockid = %lld, Start_Lsa = %lld|%d, Oldest_MVCCID = %llu, Newest_MVCCID = %llu } \n",
5362 vacuum_data_entry++;
5391 "vacuum_recover_lost_block_data, lsa = %lld|%d, global_oldest_visible_mvccid = %llu",
5410 "vacuum_recover_lost_block_data, log_Gl.hdr.mvcc_op_log_lsa is null ");
5416 while (log_lsa.
pageid > stop_at_pageid)
5433 LSA_COPY (&mvcc_op_log_lsa, &log_lsa);
5435 "vacuum_recover_lost_block_data, found mvcc op at lsa = %lld|%d ",
5450 LSA_COPY (&mvcc_op_log_lsa, &log_lsa);
5452 "vacuum_recover_lost_block_data, found mvcc op at lsa = %lld|%d ",
5470 "vacuum_recover_lost_block_data, complete vacuum ");
5481 "vacuum_recover_lost_block_data, nothing to recovery ");
5489 "vacuum_recover_lost_block_data, mvcc_op_log_lsa %lld|%d is already in vacuum data " 5505 "vacuum_recover_lost_block_data, start recovering from %lld|%d ",
LSA_AS_ARGS (&mvcc_op_log_lsa));
5509 LSA_COPY (&log_lsa, &mvcc_op_log_lsa);
5513 std::stack<VACUUM_DATA_ENTRY> vacuum_block_data_buffer_stack;
5530 while (log_lsa.
pageid > stop_at_pageid)
5545 &vacuum_info,
NULL,
true);
5571 "Restore log global cached info: \n\t mvcc_op_log_lsa = %lld|%d \n" 5572 "\t oldest_visible_mvccid = %llu \n\t newest_block_mvccid = %llu ",
5579 vacuum_block_data_buffer_stack.push (data);
5586 while (!vacuum_block_data_buffer_stack.empty ())
5588 vacuum_Block_data_buffer->
produce (vacuum_block_data_buffer_stack.top ());
5589 vacuum_block_data_buffer_stack.pop ();
5633 #if defined (SA_MODE) 5634 if (vacuum_Data.is_vacuum_complete)
5732 if (diff_fileid != 0)
5734 return (
int) diff_fileid;
5737 return (
int) (file_a->
volid - file_b->
volid);
5753 int page_count = 0, mem_size = 0;
5755 INT16 position = -1;
5761 #if !defined (NDEBUG) 5784 "Failed to load dropped files during recovery!");
5794 #if !defined (NDEBUG) 5803 VPID_COPY (&vpid, &vacuum_Dropped_files_vpid);
5850 #if !defined (NDEBUG) 5851 if (track_page !=
NULL)
5857 "add dropped file: found duplicate vfid %d|%d at position=%d, " 5858 "replace mvccid=%llu with mvccid=%llu. Page is %d|%d with lsa %lld|%d." 5860 (
unsigned long long int) save_mvccid,
5876 #if !defined (NDEBUG) 5888 if (page_count > position)
5908 #if !defined (NDEBUG) 5909 if (track_page !=
NULL)
5916 "added new dropped file %d|%d and mvccid=%llu at position=%d. " 5917 "Page is %d|%d with lsa %lld|%d. Page count=%d, global count=%d",
5942 if (new_page ==
NULL)
5951 new_page->n_dropped_files = 1;
5954 VFID_COPY (&new_page->dropped_files[0].vfid, vfid);
5957 new_page->dropped_files[0].mvccid = mvccid;
5961 #if !defined(NDEBUG) 5962 if (track_page !=
NULL)
5967 if (new_track_page ==
NULL)
5991 "added new dropped file %d|%d and mvccid=%llu to at position=%d. " 5992 "Page is %d|%d with lsa %lld|%d. Page count=%d, global count=%d",
5994 (
unsigned long long int) new_page->dropped_files[0].mvccid, 0,
6002 #if !defined(NDEBUG) 6003 if (track_page !=
NULL)
6030 pospone_or_undo ?
"postpone" :
"undo", vfid->
volid, vfid->
fileid);
6034 if (class_oid !=
NULL)
6068 INT16 position = rcv->
offset;
6084 "Dropped files recovery error: Invalid position %d (only %d entries in page) while " 6085 "inserting new entry vfid=%d|%d mvccid=%llu. Page is %d|%d at lsa %lld|%d. ",
6093 if (position < page->n_dropped_files)
6108 "Dropped files redo recovery, insert new entry " 6109 "vfid=%d|%d, mvccid=%llu at position %d. Page is %d|%d at lsa %lld|%d.",
6136 INT16 position = rcv->
offset;
6170 INT16 position = rcv->
offset;
6183 "Dropped files recovery error: Invalid position %d (only %d entries in page) while " 6184 "replacing old entry with vfid=%d|%d mvccid=%llu. Page is %d|%d at lsa %lld|%d. ",
6196 "Dropped files recovery error: expected to " 6197 "find vfid %d|%d at position %d and found %d|%d with MVCCID=%d. " 6198 "Page is %d|%d at lsa %lld|%d. ",
VFID_AS_ARGS (&dropped_file->
vfid), position,
6208 "Dropped files redo recovery, replace MVCCID for" 6209 " file %d|%d with %llu (position=%d). Page is %d|%d at lsa %lld|%d.",
6235 #if defined (SERVER_MODE) 6242 INT32 my_version, workers_min_version;
6249 VFID_COPY (&vacuum_Last_dropped_vfid, &vfid_dropped);
6256 "Added dropped file - vfid=%d|%d, mvccid=%llu - " 6257 "Wait for all workers to see my_version=%d",
VFID_AS_ARGS (&vfid_dropped), mvccid, my_version);
6260 for (workers_min_version = vacuum_get_worker_min_dropped_files_version ();
6261 workers_min_version != -1 && workers_min_version < my_version;
6262 workers_min_version = vacuum_get_worker_min_dropped_files_version ())
6265 "not all workers saw my changes, workers min version=%d. Sleep and retry.", workers_min_version);
6274 #endif // SERVER_MODE 6340 int page_count = 0, mem_size = 0;
6343 INT16 n_removed_entries = 0,
i;
6344 #if !defined (NDEBUG) 6368 VPID_COPY (&vpid, &vacuum_Dropped_files_vpid);
6369 VPID_COPY (&last_non_empty_page_vpid, &vacuum_Dropped_files_vpid);
6374 n_removed_entries = 0;
6391 if (page_count == 0)
6399 VPID_COPY (&last_non_empty_page_vpid, &vpid);
6402 for (
i = page_count - 1;
i >= 0;
i--)
6407 removed_entries[n_removed_entries++] =
i;
6408 if (
i < page_count - 1)
6416 if (n_removed_entries > 0)
6428 "cleanup dropped files. Page is %d|%d with lsa %lld|%d. " 6434 #if !defined (NDEBUG) 6446 #if !defined (NDEBUG) 6451 if (!
VPID_ISNULL (&last_non_empty_page_vpid) && !
VPID_EQ (&last_non_empty_page_vpid, &last_page_vpid))
6455 "Cleanup dropped files must remove pages to the of page %d|%d... Cut off link.",
6456 last_non_empty_page_vpid.volid, last_non_empty_page_vpid.pageid);
6489 *is_file_dropped =
false;
6518 *is_file_dropped =
false;
6525 VPID_COPY (&vpid, &vacuum_Dropped_files_vpid);
6533 *is_file_dropped =
false;
6541 assert (thread_p->shutdown);
6551 page_count = page->n_dropped_files;
6557 if (dropped_file !=
NULL)
6564 "found dropped file: vfid=%d|%d mvccid=%llu in page %d|%d. " 6565 "Entry at position %d, vfid=%d|%d mvccid=%llu. The vacuumed file is dropped.",
6572 *is_file_dropped =
true;
6579 "found dropped file: vfid=%d|%d mvccid=%llu in page %d|%d. " 6580 "Entry at position %d, vfid=%d|%d mvccid=%llu. The vacuumed file is newer.",
6587 *is_file_dropped =
false;
6594 "didn't find dropped file: vfid=%d|%d mvccid=%llu in page (%d, %d).",
VFID_AS_ARGS (vfid),
6601 *is_file_dropped =
false;
6619 #define VACUUM_CLEANUP_DROPPED_FILES_MAX_REDO_CRUMBS 3 6622 int n_redo_crumbs = 0;
6625 redo_crumbs[n_redo_crumbs].
data = &n_indexes;
6626 redo_crumbs[n_redo_crumbs++].
length =
sizeof (n_indexes);
6629 redo_crumbs[n_redo_crumbs].
data = indexes;
6630 redo_crumbs[n_redo_crumbs++].
length = n_indexes *
sizeof (*indexes);
6635 addr.
pgptr = page_p;
6654 int offset = 0, mem_size;
6662 n_indexes = *((INT16 *) rcv->
data);
6663 offset +=
sizeof (n_indexes);
6666 indexes = (INT16 *) (rcv->
data + offset);
6667 offset +=
sizeof (*indexes) * n_indexes;
6673 for (
i = 0;
i < n_indexes;
i++)
6677 "Recovery of dropped classes: remove file %d|%d, mvccid=%llu at position %d.",
6823 if (new_buffer ==
NULL)
6828 "Could not expact the files and objects capacity to %d.", new_capacity);
6885 #if defined (SERVER_MODE) 6897 vacuum_compare_dropped_files_version (INT32 version_a, INT32 version_b)
6899 INT32 max_int32_div_2 = 0x3FFFFFFF;
6902 if ((version_a >= 0 && version_b >= 0) || (version_a < 0 && version_b < 0))
6904 return (
int) (version_a - version_b);
6917 if (version_a >= max_int32_div_2)
6919 assert (version_b <= -max_int32_div_2);
6925 assert (version_b >= -max_int32_div_2);
6932 if (version_b >= max_int32_div_2)
6934 assert (version_a <= -max_int32_div_2);
6940 assert (version_a >= -max_int32_div_2);
6949 #endif // SERVER_MODE 6951 #if !defined (NDEBUG) 6965 int in_progress_distance = 0;
6966 bool found_in_progress =
false;
6985 entry = &data_page->
data[
i];
6992 in_progress_distance++;
7010 last_unvacuumed = entry;
7014 found_in_progress =
true;
7015 in_progress_distance++;
7029 last_unvacuumed =
NULL;
7032 if (in_progress_distance > 500)
7045 "vacuum is behind or blocked. distance is %d.", in_progress_distance);
7082 req_lsa.
pageid = log_pageid;
7141 "log page %lld is not in prefetched range %lld - %lld",
7156 req_lsa.
pageid = log_pageid;
7183 #define TEMP_BUFFER_SIZE 1024 7185 bool is_btree = (btree_node_type >= 0 ?
true :
false);
7189 p += sprintf (p,
"Found not vacuumed BTREE record");
7193 p += sprintf (p,
"Found not vacuumed HEAP record");
7196 sprintf (p,
" with oid=%d|%d|%d, class_oid=%d|%d|%d", (
int) oid->
volid, oid->
pageid, (
int) oid->
slotid,
7200 p += sprintf (p,
", insert_id=%llu", (
unsigned long long int)
MVCC_GET_INSID (rec_header));
7204 p += sprintf (p,
", insert_id=missing");
7208 p += sprintf (p,
", delete_id=%llu", (
unsigned long long int)
MVCC_GET_DELID (rec_header));
7212 p += sprintf (p,
", delete_id=missing");
7217 const char *type_str =
NULL;
7219 switch (btree_node_type)
7225 type_str =
"NON_LEAF";
7228 type_str =
"OVERFLOW";
7231 type_str =
"UNKNOWN";
7234 p += sprintf (p,
", node_type=%s", type_str);
7236 p += sprintf (p,
"\n");
7256 int btree_node_type)
7315 int btree_node_type)
7327 class_oid = &cls_oid;
7389 int num_undo_crumbs;
7395 addr.
pgptr = page_p;
7403 undo_crumbs[0].
length =
sizeof (undo_recdes->
type);
7404 undo_crumbs[0].
data = (
char *) &undo_recdes->
type;
7406 undo_crumbs[1].
data = undo_recdes->
data;
7407 num_undo_crumbs = 2;
7485 #if !defined (NDEBUG) 7665 "vacuum_sa_reflect_last_blockid: last_blockid=%lld, append_prev_pageid=%d\n",
7694 "vacuum_data_empty_update_last_blockid: update last_blockid=%lld in page %d|%d at lsa %lld|%d",
7707 if (thread_p ==
NULL)
7711 save_type = thread_p->type;
7714 if (thread_p->get_system_tdes () ==
NULL)
7716 thread_p->claim_system_worker ();
7730 if (thread_p ==
NULL)
7734 save_type = thread_p->type;
7736 thread_p->vacuum_worker = worker;
7741 if (thread_p->get_system_tdes () ==
NULL)
7743 thread_p->claim_system_worker ();
7756 if (thread_p ==
NULL)
7760 thread_p->type = save_type;
7761 thread_p->vacuum_worker =
NULL;
7762 thread_p->retire_system_worker ();
7780 #if defined (SERVER_MODE) 7793 vacuum_notify_es_deleted (
THREAD_ENTRY * thread_p,
const char *uri)
7795 #define ES_NOTIFY_VACUUM_FOR_DELETE_BUFFER_SIZE \ 7803 char data_buf[ES_NOTIFY_VACUUM_FOR_DELETE_BUFFER_SIZE];
7907 return has_one_page () && first_page->is_empty ();
7913 return first_page == last_page;
7919 return m_last_blockid;
7927 return m_last_blockid;
7929 return first_page->get_first_blockid ();
7936 return first_page->data[0];
7945 #if !defined (NDEBUG) 7949 assert (blockid < log_blockid);
7959 bool updated_oldest_unvacuumed =
false;
8000 oldest_unvacuumed_mvccid = first_page->data[0].oldest_visible_mvccid;
8008 assert (oldest_unvacuumed_mvccid <= mvccid);
8009 oldest_unvacuumed_mvccid = mvccid;
8024 assert (oldest <= newest);
8089 return index_unvacuumed == index_free;
8095 return index >= index_unvacuumed || index < index_free;
8103 return INDEX_NOT_FOUND;
8107 if (first_blockid > blockid)
8109 return INDEX_NOT_FOUND;
8112 if (last_blockid < blockid)
8114 return INDEX_NOT_FOUND;
8116 INT16 index_of_blockid = (INT16) (blockid - first_blockid) + index_unvacuumed;
8118 return index_of_blockid;
8125 return data[index_unvacuumed].get_blockid ();
8268 (
long long int)
m_blockid, (
long long int) first_blockid);
8269 m_blockid = first_blockid;
8348 : m_state (NO_SHUTDOWN)
8359 #if defined (SERVER_MODE) 8364 std::unique_lock<std::mutex> ulock { m_state_mutex };
8368 m_condvar.wait (ulock, [
this] ()
8372 if (
m_state == SHUTDOWN_REQUESTED && vacuum_Master_daemon ==
NULL)
8402 #if defined (SA_MODE) 8405 #else // SERVER_MODE 8407 std::unique_lock<std::mutex> ulock { m_state_mutex };
8411 m_condvar.notify_one ();
VACUUM_TRACK_DROPPED_FILES * vacuum_Track_dropped_files
#define LOG_READ_ADD_ALIGN(thread_p, add, lsa, log_pgptr)
int vacuum_rv_redo_data_finished(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
static void vacuum_copy_data_from_log(THREAD_ENTRY *thread_p, char *area, int length, LOG_LSA *log_lsa, LOG_PAGE *log_page)
#define PGBUF_PAGE_VPID_AS_ARGS(pg)
LOG_PAGEID prefetch_last_pageid
#define vacuum_er_log_error(er_log_level, msg,...)
cubthread::entry * thread_get_thread_entry_info(void)
#define VACUUM_MAX_WORKER_COUNT
LOG_PAGEID keep_from_log_pageid
#define VACUUM_LAST_LOG_PAGEID_IN_BLOCK(blockid)
void log_append_redo_data(THREAD_ENTRY *thread_p, LOG_RCVINDEX rcvindex, LOG_DATA_ADDR *addr, int length, const void *data)
bool is_task_queue_full() const
#define VFID_EQ(vfid_ptr1, vfid_ptr2)
VACUUM_WORKER vacuum_Workers[VACUUM_MAX_WORKER_COUNT]
#define MVCC_IS_HEADER_DELID_VALID(rec_header_p)
VACUUM_DATA_ENTRY data[1]
VACUUM_LOG_BLOCKID vacuum_get_log_blockid(LOG_PAGEID pageid)
int heap_get_class_oid_from_page(THREAD_ENTRY *thread_p, PAGE_PTR page_p, OID *class_oid)
#define MVCC_GET_INSID(header)
#define VACUUM_PERF_HEAP_START(thread_p, helper)
const VPID & get_page_vpid() const
#define VACUUM_ER_LOG_RECOVERY
MVCCID update_global_oldest_visible()
#define BTID_AS_ARGS(btid)
void log_append_undoredo_data2(THREAD_ENTRY *thread_p, LOG_RCVINDEX rcvindex, const VFID *vfid, PAGE_PTR pgptr, PGLENGTH offset, int undo_length, int redo_length, const void *undo_data, const void *redo_data)
MVCCID m_oldest_visible_mvccid
#define BO_IS_SERVER_RESTARTED()
int vacuum_heap_page(THREAD_ENTRY *thread_p, VACUUM_HEAP_OBJECT *heap_objects, int n_heap_objects, MVCCID threshold_mvccid, HFID *hfid, bool *reusable, bool was_interrupted)
MVCCID oldest_visible_mvccid
void log_append_undoredo_crumbs(THREAD_ENTRY *thread_p, LOG_RCVINDEX rcvindex, LOG_DATA_ADDR *addr, int num_undo_crumbs, int num_redo_crumbs, const LOG_CRUMB *undo_crumbs, const LOG_CRUMB *redo_crumbs)
char * or_unpack_string(char *ptr, char **string)
void claim_system_worker()
VACUUM_HEAP_OBJECT * heap_objects
void change_blockid(VACUUM_LOG_BLOCKID blockid)
#define VACUUM_BLOCK_IS_INTERRUPTED(blockid)
bool pgbuf_has_any_non_vacuum_waiters(PAGE_PTR pgptr)
int vacuum_reset_data_after_copydb(THREAD_ENTRY *thread_p)
int file_descriptor_update(THREAD_ENTRY *thread_p, const VFID *vfid, void *des_new)
void logpb_fatal_error(THREAD_ENTRY *thread_p, bool logexit, const char *file_name, const int lineno, const char *fmt,...)
int file_dealloc(THREAD_ENTRY *thread_p, const VFID *vfid, const VPID *vpid, FILE_TYPE file_type_hint)
int vacuum_rv_set_next_page_dropped_files(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
static int vacuum_get_first_page_dropped_files(THREAD_ENTRY *thread_p, VPID *first_page_vpid)
#define VACUUM_ER_LOG_NONE
#define pthread_mutex_init(a, b)
#define LOG_DATA_ADDR_INITIALIZER
vacuum_data_entry()=default
void LSA_COPY(log_lsa *plsa1, const log_lsa *plsa2)
VACUUM_WORKER * claim_worker()
#define MAX_SLOTS_IN_PAGE
static void vacuum_log_cleanup_dropped_files(THREAD_ENTRY *thread_p, PAGE_PTR page_p, INT16 *indexes, INT16 n_indexes)
VACUUM_DATA_PAGE * first_page
void vacuum_stop_master(THREAD_ENTRY *thread_p)
#define VPID_COPY(dest_ptr, src_ptr)
const int LOG_WORKER_POOL_VACUUM
bool is_restoredb_session
void vacuum_rv_redo_append_data_dump(FILE *fp, int length, void *data)
LOG_VACUUM_INFO vacuum_info
#define VACUUM_BLOCK_STATUS_IS_IN_PROGRESS(blockid)
#define GET_ZIP_LEN(length)
int logpb_fetch_page(THREAD_ENTRY *thread_p, const LOG_LSA *req_lsa, LOG_CS_ACCESS_MODE access_mode, LOG_PAGE *log_pgptr)
void start_job_on_current_entry() const
const int LOG_SYSTEM_TRAN_INDEX
MVCCID oldest_unvacuumed_mvccid
#define VACUUM_LOG_DATA_ENTRY_AS_ARGS(data)
#define VACUUM_LOG_VACUUM_HEAP_ALL_VACUUMED
void logpb_vacuum_reset_log_header_cache(THREAD_ENTRY *thread_p, LOG_HEADER *loghdr)
int file_get_type(THREAD_ENTRY *thread_p, const VFID *vfid, FILE_TYPE *ftype_out)
static void vacuum_log_redoundo_vacuum_record(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slotid, RECDES *undo_recdes, bool reusable)
#define pthread_mutex_unlock(a)
#define VACUUM_LOG_DATA_ENTRY_MSG(name)
int vacuum_rv_notify_dropped_file(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
#define LOG_GET_LOG_RECORD_HEADER(log_page_p, lsa)
void pgbuf_unfix_all(THREAD_ENTRY *thread_p)
#define MVCC_IS_HEADER_INSID_NOT_ALL_VISIBLE(rec_header_p)
#define MVCC_ID_FOLLOW_OR_EQUAL(id1, id2)
lockfree::circular_queue< vacuum_data_entry > * vacuum_Block_data_buffer
VACUUM_DROPPED_FILE dropped_files[1]
LOG_PAGEID prefetch_first_pageid
void logpb_force_flush_pages(THREAD_ENTRY *thread_p)
char * or_pack_string(char *ptr, const char *string)
lockfree::circular_queue< VACUUM_LOG_BLOCKID > * vacuum_Finished_job_queue
vacuum_shutdown_sequence shutdown_sequence
#define ASSERT_ERROR_AND_SET(error_code)
#define VACUUM_BLOCK_STATUS_SET_AVAILABLE(blockid)
void thread_sleep(double millisec)
SPAGE_SLOT * spage_get_slot(PAGE_PTR page_p, PGSLOTID slot_id)
#define VACUUM_DATA_PAGE_HEADER_SIZE
#define OR_MVCC_FLAG_VALID_INSID
#define assert_release(e)
static VPID vacuum_Dropped_files_vpid
void pgbuf_set_dirty(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, bool free_page)
VACUUM_LOG_BLOCKID get_first_blockid() const
int vacuum_rv_es_nop(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
static bool vacuum_is_empty(void)
resource_shared_pool< VACUUM_WORKER > * m_pool
void pgbuf_notify_vacuum_follows(THREAD_ENTRY *thread_p, PAGE_PTR page)
#define VFID_AS_ARGS(vfidp)
static void vacuum_init_data_page_with_last_blockid(THREAD_ENTRY *thread_p, VACUUM_DATA_PAGE *data_page, VACUUM_LOG_BLOCKID blockid)
int or_mvcc_get_header(RECDES *record, MVCC_REC_HEADER *mvcc_header)
void heap_page_set_vacuum_status_none(THREAD_ENTRY *thread_p, PAGE_PTR heap_page)
char log_Name_active[PATH_MAX]
void log_sysop_start(THREAD_ENTRY *thread_p)
const VACUUM_DATA_ENTRY & get_first_entry() const
void vacuum_notify_server_shutdown(void)
INT16 heap_rv_remove_flags_from_offset(INT16 offset)
#define OR_MVCC_FLAG_VALID_DELID
static int vacuum_compare_blockids(const void *ptr1, const void *ptr2)
#define LOG_IS_MVCC_HEAP_OPERATION(rcvindex)
int undo_data_buffer_capacity
#define VACUUM_FIRST_LOG_PAGEID_IN_BLOCK(blockid)
#define VACUUM_CLEANUP_DROPPED_FILES_MAX_REDO_CRUMBS
#define OID_SET_NULL(oidp)
void on_daemon_create(cubthread::entry &context) final
void on_recycle(cubthread::entry &context) final
VACUUM_LOG_BLOCKID get_first_blockid() const
#define VACUUM_IS_THREAD_VACUUM_MASTER
int vacuum_rv_redo_vacuum_heap_record(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
#define OR_MVCC_FLAG_SHIFT_BITS
int vacuum_is_file_dropped(THREAD_ENTRY *thread_p, bool *is_file_dropped, VFID *vfid, MVCCID mvccid)
static void vacuum_dropped_files_set_next_page(THREAD_ENTRY *thread_p, VACUUM_DROPPED_FILES_PAGE *page_p, VPID *next_page)
static void vacuum_data_empty_page(THREAD_ENTRY *thread_p, VACUUM_DATA_PAGE *prev_data_page, VACUUM_DATA_PAGE **data_page)
#define MVCC_GET_REPID(header)
#define LSA_AS_ARGS(lsa_ptr)
struct log_zip * log_zip_p
static INT32 vacuum_Dropped_files_count
#define MVCC_CLEAR_FLAG_BITS(rec_header_p, flag)
#define VACUUM_LOG_VACUUM_HEAP_MASK
#define VACUUM_NULL_LOG_BLOCKID
entry_workpool * create_worker_pool(std::size_t pool_size, std::size_t task_max_count, const char *name, entry_manager *context_manager, std::size_t core_count, bool debug_logging, bool pool_threads=false, wait_seconds wait_for_task_time=std::chrono::seconds(5))
#define VACUUM_ER_LOG_WORKER
int file_get_sticky_first_page(THREAD_ENTRY *thread_p, const VFID *vfid, VPID *vpid_out)
LOG_ZIP_SIZE_T data_length
int pgbuf_get_fix_count(PAGE_PTR pgptr)
void on_retire(cubthread::entry &context) final
#define ER_STAND_ALONE_VACUUM_END
#define PTR_ALIGN(addr, boundary)
VACUUM_LOG_BLOCKID m_last_blockid
bool logtb_get_check_interrupt(THREAD_ENTRY *thread_p)
static void vacuum_read_log_aligned(THREAD_ENTRY *thread_entry, LOG_LSA *log_lsa, LOG_PAGE *log_page)
#define VACUUM_VERIFY_VACUUM_DATA(thread_p)
static void vacuum_check_shutdown_interruption(const THREAD_ENTRY *thread_p, int error_code)
static void vacuum_data_initialize_new_page(THREAD_ENTRY *thread_p, VACUUM_DATA_PAGE *data_page)
#define OID_AS_ARGS(oidp)
int logpb_get_archive_number(THREAD_ENTRY *thread_p, LOG_PAGEID pageid)
std::mutex prior_lsa_mutex
LOG_VACUUM_INFO vacuum_info
#define VACUUM_BLOCKID_WITHOUT_FLAGS(blockid)
bool is_archive_removal_safe
static cubthread::daemon * vacuum_Master_daemon
static int vacuum_compare_dropped_files(const void *a, const void *b)
#define er_log_debug(...)
#define VPID_AS_ARGS(vpidp)
LOG_ZIP * log_zip_alloc(LOG_ZIP_SIZE_T size)
bool is_shutdown_requested()
static void vacuum_log_remove_ovf_insid(THREAD_ENTRY *thread_p, PAGE_PTR ovfpage)
VACUUM_DATA_LOAD vacuum_Data_load
VACUUM_LOG_BLOCKID blockid
static void vacuum_data_unload_first_and_last_page(THREAD_ENTRY *thread_p)
static void vacuum_update_keep_from_log_pageid(THREAD_ENTRY *thread_p)
bool is_cursor_entry_available() const
#define COPY_OID(dest_oid_ptr, src_oid_ptr)
bool check_shutdown() const
#define ER_VACUUM_CS_NOT_AVAILABLE
static void vacuum_notify_all_workers_dropped_file(const VFID &vfid_dropped, MVCCID mvccid)
SCAN_CODE spage_get_record(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, RECDES *record_descriptor_p, int is_peeking)
int heap_objects_capacity
int mvcc_header_size_lookup[8]
int vacuum_create_file_for_dropped_files(THREAD_ENTRY *thread_p, VFID *dropped_files_vfid)
#define vacuum_er_log_warning(er_log_level, msg,...)
int vacuum_data_load_and_recover(THREAD_ENTRY *thread_p)
int file_create_with_npages(THREAD_ENTRY *thread_p, FILE_TYPE file_type, int npages, FILE_DESCRIPTORS *des, VFID *vfid)
#define VFID_ISNULL(vfid_ptr)
static int vacuum_process_log_block(THREAD_ENTRY *thread_p, VACUUM_DATA_ENTRY *block_data, bool sa_mode_partial_block)
static const INT16 INDEX_NOT_FOUND
#define MVCCID_ALL_VISIBLE
#define pgbuf_unfix_and_init(thread_p, pgptr)
STATIC_INLINE VACUUM_WORKER * vacuum_get_vacuum_worker(THREAD_ENTRY *thread_p) __attribute__((ALWAYS_INLINE))
vacuum_shutdown_sequence()
#define MVCC_SET_INSID(header, mvcc_id)
VACUUM_LOG_BLOCKID get_blockid() const
void vacuum_log_add_dropped_file(THREAD_ENTRY *thread_p, const VFID *vfid, const OID *class_oid, bool pospone_or_undo)
#define VACUUM_FINISHED_JOB_QUEUE_CAPACITY
static int vacuum_heap_record(THREAD_ENTRY *thread_p, VACUUM_HEAP_HELPER *helper)
int spage_update(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, const RECDES *record_descriptor_p)
static int vacuum_fetch_log_page(THREAD_ENTRY *thread_p, LOG_PAGEID log_pageid, LOG_PAGE *log_page)
bool should_interrupt_iteration() const
void log_append_redo_data2(THREAD_ENTRY *thread_p, LOG_RCVINDEX rcvindex, const VFID *vfid, PAGE_PTR pgptr, PGLENGTH offset, int length, const void *data)
int file_descriptor_get(THREAD_ENTRY *thread_p, const VFID *vfid, FILE_DESCRIPTORS *desc_out)
manager * get_manager(void)
PAGE_TYPE pgbuf_get_page_ptype(THREAD_ENTRY *thread_p, PAGE_PTR pgptr)
int file_alloc_sticky_first_page(THREAD_ENTRY *thread_p, const VFID *vfid, FILE_INIT_PAGE_FUNC f_init, void *f_init_args, VPID *vpid_out, PAGE_PTR *page_out)
static void print_not_vacuumed_to_log(OID *oid, OID *class_oid, MVCC_REC_HEADER *rec_header, int btree_node_type)
void spage_vacuum_slot(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slotid, bool reusable)
#define RECDES_INITIALIZER
int vacuum_rv_redo_vacuum_heap_page(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
#define MVCCID_IS_NORMAL(id)
#define VACUUM_LOG_VACUUM_HEAP_REUSABLE
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
enum mvcc_satisfies_vacuum_result MVCC_SATISFIES_VACUUM_RESULT
void set_job_in_progress()
void LOG_CS_ENTER_READ_MODE(THREAD_ENTRY *thread_p)
#define OR_MVCC_FLAG_VALID_PREV_VERSION
int vacuum_rv_replace_dropped_file(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
#define VACUUM_DROPPED_FILES_PAGE_CAPACITY
bool pgbuf_has_prevent_dealloc(PAGE_PTR pgptr)
const char * fileio_get_base_file_name(const char *full_name_p)
int heap_rv_redo_insert(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
HEAP_PAGE_VACUUM_STATUS heap_page_get_vacuum_status(THREAD_ENTRY *thread_p, PAGE_PTR heap_page)
static bool vacuum_Dropped_files_loaded
std::int64_t VACUUM_LOG_BLOCKID
int heap_get_mvcc_rec_header_from_overflow(PAGE_PTR ovf_page, MVCC_REC_HEADER *mvcc_header, RECDES *peek_recdes)
static void vacuum_read_log_add_aligned(THREAD_ENTRY *thread_entry, size_t size, LOG_LSA *log_lsa, LOG_PAGE *log_page)
int or_packed_string_length(const char *string, int *strlen)
#define OR_MVCC_FLAG_MASK
bool pgbuf_check_page_ptype(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PAGE_TYPE ptype)
void on_daemon_retire(cubthread::entry &context) final
#define OR_MVCC_INSERT_ID_OFFSET
static void vacuum_convert_thread_to_worker(THREAD_ENTRY *thread_p, VACUUM_WORKER *worker, thread_type &save_type)
DISK_ISVALID vacuum_check_not_vacuumed_recdes(THREAD_ENTRY *thread_p, OID *oid, OID *class_oid, RECDES *recdes, int btree_node_type)
VACUUM_TRACK_DROPPED_FILES * next_tracked_page
int prm_get_integer_value(PARAM_ID prm_id)
void on_create(cubthread::entry &context) final
void pgbuf_flush_if_requested(THREAD_ENTRY *thread_p, PAGE_PTR page)
#define VACUUM_PERF_HEAP_TRACK_PREPARE(thread_p, helper)
FILE_VACUUM_DATA_DES vacuum_data
#define MVCC_GET_CHN(header)
bool is_cursor_entry_ready_to_vacuum() const
#define VACUUM_IS_THREAD_VACUUM_WORKER
#define ER_OUT_OF_VIRTUAL_MEMORY
void LOG_CS_EXIT(THREAD_ENTRY *thread_p)
VACUUM_DATA_PAGE * last_page
void log_append_undo_data(THREAD_ENTRY *thread_p, LOG_RCVINDEX rcvindex, LOG_DATA_ADDR *addr, int length, const void *data)
~vacuum_worker_context_manager()
void execute(cubthread::entry &thread_ref) final
void stop_execution(void)
#define VACUUM_ER_LOG_LOGGING
#define ER_STAND_ALONE_VACUUM_START
void retire_worker(VACUUM_WORKER &worker)
#define VACUUM_ER_LOG_HEAP
STATIC_INLINE bool vacuum_is_thread_vacuum(const THREAD_ENTRY *thread_p) __attribute__((ALWAYS_INLINE))
int or_mvcc_set_header(RECDES *record, MVCC_REC_HEADER *mvcc_rec_header)
PERF_UTIME_TRACKER time_track
LOG_PAGEID logical_pageid
static void vacuum_cleanup_collected_by_vfid(VACUUM_WORKER *worker, VFID *vfid)
bool heap_remove_page_on_vacuum(THREAD_ENTRY *thread_p, PAGE_PTR *page_ptr, HFID *hfid)
int spage_compact(THREAD_ENTRY *thread_p, PAGE_PTR page_p)
static int vacuum_heap_prepare_record(THREAD_ENTRY *thread_p, VACUUM_HEAP_HELPER *helper)
char log_Prefix[PATH_MAX]
#define VACUUM_ER_LOG_MASTER
enum log_rectype LOG_RECTYPE
static vacuum_worker_context_manager * vacuum_Worker_context_manager
static VACUUM_DATA vacuum_Data
#define VPID_EQ(vpid_ptr1, vpid_ptr2)
LOG_REC_MVCC_UNDO mvcc_undo
int vacuum_rv_undo_vacuum_heap_record(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
#define HFID_SET_NULL(hfid)
void vacuum_init_thread_context(cubthread::entry &context, thread_type type, VACUUM_WORKER *worker)
#define vacuum_fix_dropped_entries_page(thread_p, vpidp, latch)
LOG_LSA prev_mvcc_op_log_lsa
void execute(cubthread::entry &thread_ref) final
static void vacuum_data_empty_update_last_blockid(THREAD_ENTRY *thread_p)
int vacuum_rv_redo_initialize_data_page(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
#define ASSERT_NO_ERROR()
VACUUM_LOG_BLOCKID logpb_last_complete_blockid(void)
#define VACUUM_PREFETCH_LOG_BLOCK_BUFFER_PAGES
void vacuum_stop_workers(THREAD_ENTRY *thread_p)
MVCC_REC_HEADER mvcc_header
void er_log_stats(void) const
void vacuum_notify_server_crashed(LOG_LSA *recovery_lsa)
const VPID vpid_Null_vpid
int file_alloc(THREAD_ENTRY *thread_p, const VFID *vfid, FILE_INIT_PAGE_FUNC f_init, void *f_init_args, VPID *vpid_out, PAGE_PTR *page_out)
int es_delete_file(const char *uri)
static VFID vacuum_Dropped_files_vfid
PGNSLOTS spage_number_of_records(PAGE_PTR page_p)
#define MVCC_IS_FLAG_SET(rec_header_p, flags)
static void vacuum_read_advance_when_doesnt_fit(THREAD_ENTRY *thread_entry, size_t size, LOG_LSA *log_lsa, LOG_PAGE *log_page)
#define VACUUM_ER_LOG_WARNING
int pgbuf_assign_private_lru(THREAD_ENTRY *thread_p, bool is_vacuum, const int id)
bool log_is_in_crash_recovery(void)
#define vacuum_er_log(er_log_level, msg,...)
bool vacuum_is_safe_to_remove_archives(void)
#define vacuum_job_cursor_print_format
bool LSA_ISNULL(const log_lsa *lsa_ptr)
vacuum_worker_task(const VACUUM_DATA_ENTRY &entry_ref)
VACUUM_LOG_BLOCKID get_last_blockid() const
#define VACUUM_DEFAULT_HEAP_OBJECT_BUFFER_SIZE
void vacuum_rv_redo_data_finished_dump(FILE *fp, int length, void *data)
#define db_private_free_and_init(thrd, ptr)
int xvacuum(THREAD_ENTRY *thread_p)
static void vacuum_restore_thread(THREAD_ENTRY *thread_p, thread_type save_type)
#define VACUUM_BLOCK_STATUS_IS_AVAILABLE(blockid)
void log_append_undoredo_data(THREAD_ENTRY *thread_p, LOG_RCVINDEX rcvindex, LOG_DATA_ADDR *addr, int undo_length, int redo_length, const void *undo_data, const void *redo_data)
int pgbuf_get_hold_count(THREAD_ENTRY *thread_p)
#define pgbuf_fix(thread_p, vpid, fetch_mode, requestmode, condition)
VACUUM_WORKER_STATE state
#define MVCC_ID_PRECEDES(id1, id2)
#define LOG_IS_MVCC_BTREE_OPERATION(rcvindex)
void xvacuum_dump(THREAD_ENTRY *thread_p, FILE *outfp)
int pgbuf_get_condition_for_ordered_fix(const VPID *vpid_new_page, const VPID *vpid_fixed_page, const HFID *hfid)
static int vacuum_find_dropped_file(THREAD_ENTRY *thread_p, bool *is_file_dropped, VFID *vfid, MVCCID mvccid)
const OID * heap_ovf_delete(THREAD_ENTRY *thread_p, const HFID *hfid, const OID *ovf_oid, VFID *ovf_vfid_p)
#define vacuum_job_cursor_print_args(cursor)
VFID vacuum_Last_dropped_vfid
INT32 vacuum_Dropped_files_version
vacuum_worker_context_manager()
bool logtb_set_check_interrupt(THREAD_ENTRY *thread_p, bool flag)
#define vacuum_set_dirty_data_page(thread_p, data_page, free)
LOG_PRIOR_LSA_INFO prior_info
VFID * heap_ovf_find_vfid(THREAD_ENTRY *thread_p, const HFID *hfid, VFID *ovf_vfid, bool docreate, PGBUF_LATCH_CONDITION latch_cond)
#define HFID_AS_ARGS(hfid)
void pgbuf_get_vpid(PAGE_PTR pgptr, VPID *vpid)
char * prefetch_log_buffer
LOG_REC_UNDOREDO undoredo
#define VFID_COPY(vfid_ptr1, vfid_ptr2)
const char * file_type_to_string(FILE_TYPE fstruct_type)
void log_sysop_abort(THREAD_ENTRY *thread_p)
static int vacuum_heap_record_insid_and_prev_version(THREAD_ENTRY *thread_p, VACUUM_HEAP_HELPER *helper)
void destroy_worker_pool(entry_workpool *&worker_pool_arg)
vacuum_job_cursor m_cursor
int vacuum_load_dropped_files_from_disk(THREAD_ENTRY *thread_p)
static void vacuum_data_load_first_and_last_page(THREAD_ENTRY *thread_p)
static int vacuum_add_dropped_file(THREAD_ENTRY *thread_p, VFID *vfid, MVCCID mvccid)
MVCC_SATISFIES_VACUUM_RESULT can_vacuum
static int vacuum_collect_heap_objects(THREAD_ENTRY *thread_p, VACUUM_WORKER *worker, OID *oid, VFID *vfid)
int vacuum_rv_redo_start_job(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
bool logtb_is_interrupted(THREAD_ENTRY *thread_p, bool clear, bool *continue_checking)
#define VACUUM_BLOCK_STATUS_SET_IN_PROGRESS(blockid)
static void error(const char *msg)
int file_init_page_type(THREAD_ENTRY *thread_p, PAGE_PTR page, void *args)
void log_append_postpone(THREAD_ENTRY *thread_p, LOG_RCVINDEX rcvindex, LOG_DATA_ADDR *addr, int length, const void *data)
bool should_force_data_update() const
#define VACUUM_ER_LOG_VACUUM_DATA
#define FILEIO_SUFFIX_LOGARCHIVE
#define VPID_ISNULL(vpid_ptr)
void btree_rv_read_keybuf_two_objects(THREAD_ENTRY *thread_p, char *datap, int data_size, BTID_INT *btid_int, BTREE_OBJECT_INFO *first_version, BTREE_OBJECT_INFO *second_version, OR_BUF *key_buf)
STATIC_INLINE void perfmon_inc_stat(THREAD_ENTRY *thread_p, PERF_STAT_ID psid) __attribute__((ALWAYS_INLINE))
void readjust_to_vacuum_data_changes()
MVCCID get_global_oldest_visible() const
void start_job_on_cursor_entry() const
int heap_set_mvcc_rec_header_on_overflow(PAGE_PTR ovf_page, MVCC_REC_HEADER *mvcc_header)
void btree_rv_read_keybuf_nocopy(THREAD_ENTRY *thread_p, char *datap, int data_size, BTID_INT *btid, OID *cls_oid, OID *oid, BTREE_MVCC_INFO *mvcc_info, OR_BUF *key_buf)
static void vacuum_verify_vacuum_data_debug(THREAD_ENTRY *thread_p)
LOG_TDES * LOG_FIND_CURRENT_TDES(THREAD_ENTRY *thread_p=NULL)
SCAN_CODE heap_get_class_oid(THREAD_ENTRY *thread_p, const OID *oid, OID *class_oid)
void vacuum_produce_log_block_data(THREAD_ENTRY *thread_p)
#define pgbuf_fix_if_not_deallocated(thread_p, vpid, latch_mode, latch_condition, page)
#define MVCC_GET_FLAG(header)
#define HFID_IS_NULL(hfid)
#define VACUUM_BLOCK_SET_INTERRUPTED(blockid)
static void vacuum_finished_block_vacuum(THREAD_ENTRY *thread_p, VACUUM_DATA_ENTRY *block_data, bool is_vacuum_complete)
PGSLOTID slots[MAX_SLOTS_IN_PAGE]
void destroy_daemon(daemon *&daemon_arg)
int btree_vacuum_object(THREAD_ENTRY *thread_p, BTID *btid, OR_BUF *buffered_key, OID *oid, OID *class_oid, MVCCID delete_mvccid)
int vacuum_initialize(THREAD_ENTRY *thread_p, int vacuum_log_block_npages, VFID *vacuum_data_vfid, VFID *dropped_files_vfid, bool is_restore)
VACUUM_DATA_PAGE * m_page
void set_oldest_unvacuumed_on_boot()
bool log_unzip(LOG_ZIP *log_unzip, LOG_ZIP_SIZE_T length, void *data)
int vacuum_boot(THREAD_ENTRY *thread_p)
LOG_PAGEID vacuum_min_log_pageid_to_keep(THREAD_ENTRY *thread_p)
#define vacuum_fix_data_page(thread_p, vpidp)
int btree_vacuum_insert_mvccid(THREAD_ENTRY *thread_p, BTID *btid, OR_BUF *buffered_key, OID *oid, OID *class_oid, MVCCID insert_mvccid)
#define VACUUM_LOG_ADD_DROPPED_FILE_POSTPONE
int vacuum_rv_redo_remove_ovf_insid(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
#define vacuum_unfix_first_and_last_data_page(thread_p)
bool has_one_page() const
static int vacuum_compare_heap_object(const void *a, const void *b)
void log_zip_free(LOG_ZIP *log_zip)
static bool vacuum_is_work_in_progress(THREAD_ENTRY *thread_p)
bool vacuum_is_mvccid_vacuumed(MVCCID id)
log_system_tdes * get_system_tdes(void)
#define free_and_init(ptr)
#define LOG_ISRESTARTED()
#define DB_ALIGN(offset, align)
static bool is_flag_set(const T &where_to_check, const T &what_to_check)
void LSA_SET_NULL(log_lsa *lsa_ptr)
static void vacuum_set_dirty_data_page_dont_free(cubthread::entry *thread_p, vacuum_data_page *data_page)
#define ER_HEAP_UNKNOWN_OBJECT
#define MVCC_GET_DELID(header)
void pgbuf_set_page_ptype(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PAGE_TYPE ptype)
bool logpb_is_page_in_archive(LOG_PAGEID pageid)
bool prm_get_bool_value(PARAM_ID prm_id)
int spage_get_free_space_without_saving(THREAD_ENTRY *thread_p, PAGE_PTR page_p, bool *need_update)
#define ZIP_CHECK(length)
#define OR_PUT_INT(ptr, val)
DISK_ISVALID vacuum_check_not_vacuumed_rec_header(THREAD_ENTRY *thread_p, OID *oid, OID *class_oid, MVCC_REC_HEADER *rec_header, int btree_node_type)
#define VACUUM_BLOCK_DATA_BUFFER_CAPACITY
void log_sysop_commit(THREAD_ENTRY *thread_p)
LOG_TDES * logtb_get_system_tdes(THREAD_ENTRY *thread_p=NULL)
int vacuum_rv_redo_cleanup_dropped_files(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
static void vacuum_data_mark_finished(THREAD_ENTRY *thread_p)
MVCC_SATISFIES_VACUUM_RESULT results[MAX_SLOTS_IN_PAGE]
#define OR_GET_MVCC_REPID_AND_FLAG(ptr)
bool is_available() const
void log_append_redo_crumbs(THREAD_ENTRY *thread_p, LOG_RCVINDEX rcvindex, LOG_DATA_ADDR *addr, int num_crumbs, const LOG_CRUMB *crumbs)
void vacuum_sa_reflect_last_blockid(THREAD_ENTRY *thread_p)
static void vacuum_verify_vacuum_data_page_fix_count(THREAD_ENTRY *thread_p)
static int vacuum_recover_lost_block_data(THREAD_ENTRY *thread_p)
void vacuum_finalize(THREAD_ENTRY *thread_p)
#define vacuum_unfix_data_page(thread_p, data_page)
pthread_mutex_t vacuum_Dropped_files_mutex
static int vacuum_heap_get_hfid_and_file_type(THREAD_ENTRY *thread_p, VACUUM_HEAP_HELPER *helper, const VFID *vfid)
static cubthread::entry_workpool * vacuum_Worker_threads
static vacuum_master_context_manager * vacuum_Master_context_manager
void vacuum_rv_undoredo_data_set_link_dump(FILE *fp, int length, void *data)
STATIC_INLINE bool vacuum_is_thread_vacuum_worker(const THREAD_ENTRY *thread_p) __attribute__((ALWAYS_INLINE))
STATIC_INLINE void perfmon_add_stat(THREAD_ENTRY *thread_p, PERF_STAT_ID psid, UINT64 amount) __attribute__((ALWAYS_INLINE))
int vacuum_rv_check_at_undo(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, INT16 slotid, INT16 rec_type)
int heap_delete_hfid_from_cache(THREAD_ENTRY *thread_p, OID *class_oid)
#define VACUUM_TRACK_DROPPED_FILES_SIZE
#define pthread_mutex_lock(a)
int vacuum_rv_redo_vacuum_complete(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
static int vacuum_worker_allocate_resources(THREAD_ENTRY *thread_p, VACUUM_WORKER *worker)
void upgrade_oldest_unvacuumed(MVCCID mvccid)
void set_on_vacuum_data_start()
#define VPID_GET_FROM_OID(vpid_ptr, oid_ptr)
#define VACUUM_BLOCKID_GET_FLAGS(blockid)
static void vacuum_heap_page_log_and_reset(THREAD_ENTRY *thread_p, VACUUM_HEAP_HELPER *helper, bool update_best_space_stat, bool unlatch_page)
int vacuum_create_file_for_vacuum_data(THREAD_ENTRY *thread_p, VFID *vacuum_data_vfid)
#define VACUUM_PERF_HEAP_TRACK_EXECUTE(thread_p, helper)
#define VACUUM_DROPPED_FILES_MAX_PAGE_CAPACITY
#define PGBUF_PAGE_STATE_MSG(name)
VACUUM_LOG_BLOCKID m_blockid
#define VACUUM_PERF_HEAP_TRACK_LOGGING(thread_p, helper)
int vacuum_consume_buffer_log_blocks(THREAD_ENTRY *thread_p)
static int vacuum_log_prefetch_vacuum_block(THREAD_ENTRY *thread_p, VACUUM_DATA_ENTRY *entry)
#define MVCCID_FORWARD(id)
bool produce(const T &element)
void push_task(entry_workpool *worker_pool_arg, entry_task *exec_p)
bool check_shutdown_request()
static int vacuum_process_log_record(THREAD_ENTRY *thread_p, VACUUM_WORKER *worker, LOG_LSA *log_lsa_p, LOG_PAGE *log_page_p, LOG_DATA *log_record_data, MVCCID *mvccid, char **undo_data_ptr, int *undo_data_size, LOG_VACUUM_INFO *vacuum_info, bool *is_file_dropped, bool stop_after_vacuum_info)
bool is_index_valid(INT16 index) const
INT16 get_index_of_blockid(VACUUM_LOG_BLOCKID blockid) const
daemon * create_daemon(const looper &looper_arg, entry_task *exec_p, const char *daemon_name="", entry_manager *context_manager=NULL)
int heap_get_class_info(THREAD_ENTRY *thread_p, const OID *class_oid, HFID *hfid_out, FILE_TYPE *ftype_out, char **classname_out)
static void vacuum_log_vacuum_heap_page(THREAD_ENTRY *thread_p, PAGE_PTR page_p, int n_slots, PGSLOTID *slots, MVCC_SATISFIES_VACUUM_RESULT *results, bool reusable, bool all_vacuumed)
static int vacuum_cleanup_dropped_files(THREAD_ENTRY *thread_p)
#define vacuum_set_dirty_dropped_entries_page(thread_p, dropped_page, free)
int vacuum_rv_redo_append_data(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
int initial_home_free_space
bool is_job_in_progress() const
VACUUM_WORKER vacuum_Master
int vacuum_rv_undoredo_data_set_link(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
#define VACUUM_BLOCK_STATUS_SET_VACUUMED(blockid)
#define VACUUM_ER_LOG_ERROR
static void vacuum_finalize_worker(THREAD_ENTRY *thread_p, VACUUM_WORKER *worker_info)
void set_last_blockid(VACUUM_LOG_BLOCKID blockid)
#define VPID_SET_NULL(vpid_ptr)
MVCC_SATISFIES_VACUUM_RESULT mvcc_satisfies_vacuum(THREAD_ENTRY *thread_p, MVCC_REC_HEADER *rec_header, MVCCID oldest_mvccid)
vacuum_data_page * get_page() const
#define VACUUM_ER_LOG_DROPPED_FILES
bool spage_need_compact(THREAD_ENTRY *thread_p, PAGE_PTR page_p)
bool was_interrupted() const
#define MVCCID_IS_VALID(id)
#define PGBUF_PAGE_STATE_ARGS(pg)
#define VACUUM_BLOCK_CLEAR_INTERRUPTED(blockid)
#define VACUUM_BLOCK_STATUS_IS_VACUUMED(blockid)
#define vacuum_unfix_dropped_entries_page(thread_p, dropped_page)
bool is_logging_configured(const int logging_flag)
#define VACUUM_ER_LOG_JOBS
#define VFID_SET_NULL(vfid_ptr)
VPID * pgbuf_get_vpid_ptr(PAGE_PTR pgptr)
const vacuum_data_entry & get_current_entry() const
int util_bsearch(const void *key, const void *base, int n_elems, unsigned int sizeof_elem, int(*func_compare)(const void *, const void *), bool *out_found)
int vacuum_rv_redo_add_dropped_file(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
static bool is_not_vacuumed_and_lost(THREAD_ENTRY *thread_p, MVCC_REC_HEADER *rec_header)
void heap_stats_update(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, const HFID *hfid, int prev_freespace)
#define VACUUM_ER_LOG_BTREE
#define HEAP_ISVALID_OID(thread_p, oid)
int vacuum_rv_undo_add_dropped_file(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
VACUUM_DROPPED_FILES_PAGE dropped_data_page
VACUUM_LOG_BLOCKID get_blockid() const
char rec_buf[IO_MAX_PAGE_SIZE+MAX_ALIGNMENT]
int search(int &result, const cub_regex_object ®, const std::string &src, const INTL_CODESET codeset)
#define LOG_READ_ADVANCE_WHEN_DOESNT_FIT(thread_p, length, lsa, log_pgptr)
#define pthread_mutex_destroy(a)
static void vacuum_convert_thread_to_master(THREAD_ENTRY *thread_p, thread_type &save_type)
struct vacuum_worker * vacuum_worker
static int vacuum_heap(THREAD_ENTRY *thread_p, VACUUM_WORKER *worker, MVCCID threshold_mvccid, bool was_interrupted)