Skip to content

File recovery.c

File List > cubrid > src > transaction > recovery.c

Go to the documentation of this file

/*
 * Copyright 2008 Search Solution Corporation
 * Copyright 2016 CUBRID Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

/*
 * recovery.c -
 */

#ident "$Id$"

#include "recovery.h"

#include "boot_sr.h"
#include "btree.h"
#include "btree_load.h"
#include "config.h"
#include "disk_manager.h"
#include "extendible_hash.h"
#include "file_manager.h"
#include "locator_sr.h"
#include "log_manager.h"
#include "overflow_file.h"
#include "replication.h"
#include "system_catalog.h"

#include <stdio.h>

// XXX: SHOULD BE THE LAST INCLUDE HEADER
#include "memory_wrapper.hpp"

/*
 *
 *           THE ARRAY OF SERVER RECOVERY FUNCTIONS
 *
 * Note: When adding new entries, be sure to add the an entry to print it as
 * a string in rv_rcvindex_string().
 *
 * TODO: the second argument - log rcv structure - should be a pointer to const data
 */
struct rvfun RV_fun[] = {
  {RVDK_NEWVOL,
   "RVDK_NEWVOL",
   NULL,
   disk_rv_redo_dboutside_newvol,
   NULL,
   disk_rv_dump_hdr},
  {RVDK_FORMAT,
   "RVDK_FORMAT",
   disk_rv_undo_format,
   disk_rv_redo_format,
   log_rv_dump_char,
   disk_rv_dump_hdr},
  {RVDK_INITMAP,
   "RVDK_INITMAP",
   NULL,
   disk_rv_redo_init_map,
   NULL,
   disk_rv_dump_init_map},
  {RVDK_CHANGE_CREATION,
   "RVDK_CHANGE_CREATION",
   disk_rv_undoredo_set_creation_time,
   disk_rv_undoredo_set_creation_time,
   disk_rv_dump_set_creation_time,
   disk_rv_dump_set_creation_time},
  {RVDK_RESET_BOOT_HFID,
   "RVDK_RESET_BOOT_HFID",
   disk_rv_undoredo_set_boot_hfid,
   disk_rv_undoredo_set_boot_hfid,
   disk_rv_dump_set_boot_hfid,
   disk_rv_dump_set_boot_hfid},
  {RVDK_LINK_PERM_VOLEXT,
   "RVDK_LINK_PERM_VOLEXT",
   disk_rv_undoredo_link,
   disk_rv_undoredo_link,
   disk_rv_dump_link,
   disk_rv_dump_link},
  {RVDK_EXPAND_VOLUME,
   "RVDK_EXPAND_VOLUME",
   NULL,
   disk_rv_redo_volume_expand,
   NULL,
   disk_rv_dump_volume_expand},
  {RVDK_RESERVE_SECTORS,
   "RVDK_RESERVE_SECTORS",
   disk_rv_unreserve_sectors,
   disk_rv_reserve_sectors,
   NULL,
   NULL},
  {RVDK_UNRESERVE_SECTORS,
   "RVDK_UNRESERVE_SECTORS",
   disk_rv_reserve_sectors,
   disk_rv_unreserve_sectors,
   NULL,
   NULL},
  {RVDK_VOLHEAD_EXPAND,
   "RVDK_VOLHEAD_EXPAND",
   disk_rv_volhead_extend_undo,
   disk_rv_volhead_extend_redo,
   NULL,
   NULL},

  {RVFL_DESTROY,
   "RVFL_DESTROY",
   file_rv_destroy,
   file_rv_destroy,
   NULL,
   NULL},
  {RVFL_EXPAND,
   "RVFL_EXPAND",
   file_rv_perm_expand_undo,
   file_rv_perm_expand_redo,
   NULL,
   NULL},
  {RVFL_ALLOC,
   "RVFL_ALLOC",
   file_rv_dealloc_on_undo,
   NULL,
   file_rv_dump_vfid_and_vpid,
   NULL},
  {RVFL_DEALLOC,
   "RVFL_DEALLOC",
   NULL,
   file_rv_dealloc_on_postpone, /* For postpone */
   NULL,
   file_rv_dump_vfid_and_vpid},
  {RVFL_FHEAD_ALLOC,
   "RVFL_FHEAD_ALLOC",
   file_rv_fhead_dealloc,
   file_rv_fhead_alloc,
   NULL,
   NULL},
  {RVFL_FHEAD_DEALLOC,
   "RVFL_FHEAD_DEALLOC",
   file_rv_fhead_alloc,
   file_rv_fhead_dealloc,
   NULL,
   NULL},
  {RVFL_FHEAD_SET_LAST_USER_PAGE_FTAB,
   "RVFL_FHEAD_SET_LAST_USER_PAGE_FTAB",
   file_rv_fhead_set_last_user_page_ftab,
   file_rv_fhead_set_last_user_page_ftab,
   NULL,
   NULL},
  {RVFL_FHEAD_MARK_DELETE,
   "RVFL_FHEAD_MARK_DELETE",
   file_rv_header_update_mark_deleted,
   file_rv_header_update_mark_deleted,
   NULL,
   NULL},
  {RVFL_FHEAD_STICKY_PAGE,
   "RVFL_FHEAD_STICKY_PAGE",
   file_rv_fhead_sticky_page,
   file_rv_fhead_sticky_page,
   NULL,
   NULL},
  {RVFL_USER_PAGE_MARK_DELETE,
   "RVFL_USER_PAGE_MARK_DELETE",
   file_rv_user_page_unmark_delete_logical,
   file_rv_user_page_mark_delete,
   file_rv_dump_vfid_and_vpid,
   NULL},
  {RVFL_USER_PAGE_MARK_DELETE_COMPENSATE,
   "RVFL_USER_PAGE_MARK_DELETE_COMPENSATE",
   file_rv_user_page_unmark_delete_physical,
   NULL,
   NULL,
   NULL},
  {RVFL_FILEDESC_UPD,
   "RVFL_FILEDESC_UPD",
   log_rv_copy_char,
   log_rv_copy_char,
   log_rv_dump_char,
   log_rv_dump_char},
  {RVFL_PARTSECT_ALLOC,
   "RVFL_PARTSECT_ALLOC",
   file_rv_partsect_clear,
   file_rv_partsect_set,
   NULL,
   NULL},
  {RVFL_PARTSECT_DEALLOC,
   "RVFL_PARTSECT_DEALLOC",
   file_rv_partsect_set,
   file_rv_partsect_clear,
   NULL,
   NULL},
  {RVFL_EXTDATA_SET_NEXT,
   "RVFL_EXTDATA_SET_NEXT",
   file_rv_extdata_set_next,
   file_rv_extdata_set_next,
   file_rv_dump_extdata_set_next,
   file_rv_dump_extdata_set_next},
  {RVFL_EXTDATA_ADD,
   "RVFL_EXTDATA_ADD",
   file_rv_extdata_remove,
   file_rv_extdata_add,
   file_rv_dump_extdata_remove,
   file_rv_dump_extdata_add},
  {RVFL_EXTDATA_REMOVE,
   "RVFL_EXTDATA_REMOVE",
   file_rv_extdata_add,
   file_rv_extdata_remove,
   file_rv_dump_extdata_add,
   file_rv_dump_extdata_remove},
  {RVFL_EXTDATA_MERGE,
   "RVFL_EXTDATA_MERGE",
   file_rv_extdata_merge,
   file_rv_extdata_merge,
   NULL,
   NULL},
  {RVFL_EXTDATA_UPDATE_ITEM,
   "RVFL_EXTDATA_UPDATE_ITEM",
   log_rv_copy_char,
   log_rv_copy_char,
   NULL,
   NULL},
  {RVFL_TRACKER_HEAP_MARK_DELETED,  /* used for compensate and run postpone */
   "RVFL_TRACKER_HEAP_MARK_DELETED",
   file_rv_tracker_mark_heap_deleted_compensate_or_run_postpone,
   file_rv_tracker_mark_heap_deleted_compensate_or_run_postpone,
   NULL,
   NULL},
  {RVFL_TRACKER_HEAP_REUSE,
   "RVFL_TRACKER_HEAP_REUSE",
   heap_rv_mark_deleted_on_undo,
   file_rv_tracker_reuse_heap,
   NULL,
   NULL},
  {RVFL_TRACKER_UNREGISTER,
   "RVFL_TRACKER_UNREGISTER",
   file_rv_tracker_unregister_undo,
   NULL,
   NULL,
   NULL},
  {RVFL_FHEAD_CONVERT_FTAB_TO_USER,
   "RVFL_FHEAD_CONVERT_FTAB_TO_USER",
   file_rv_fhead_convert_user_to_ftab_page,
   file_rv_fhead_convert_ftab_to_user_page,
   NULL,
   NULL},

  {RVHF_CREATE_HEADER,
   "RVHF_CREATE_HEADER",
   NULL,
   heap_rv_redo_newpage,
   NULL,
   heap_rv_dump_statistics},
  {RVHF_NEWPAGE,
   "RVHF_NEWPAGE",
   pgbuf_rv_new_page_undo,
   heap_rv_redo_newpage,
   NULL,
   heap_rv_dump_chain},
  {RVHF_STATS,
   "RVHF_STATS",
   heap_rv_undoredo_pagehdr,
   heap_rv_undoredo_pagehdr,
   heap_rv_dump_statistics,
   heap_rv_dump_statistics},
  {RVHF_CHAIN,
   "RVHF_CHAIN",
   heap_rv_undoredo_pagehdr,
   heap_rv_undoredo_pagehdr,
   heap_rv_dump_chain,
   heap_rv_dump_chain},
  {RVHF_INSERT,
   "RVHF_INSERT",
   heap_rv_undo_insert,
   heap_rv_redo_insert,
   log_rv_dump_hexa,
   log_rv_dump_hexa},
  {RVHF_DELETE,
   "RVHF_DELETE",
   heap_rv_undo_delete,
   heap_rv_redo_delete,
   log_rv_dump_hexa,
   log_rv_dump_hexa},
  {RVHF_UPDATE,
   "RVHF_UPDATE",
   heap_rv_undo_update,
   heap_rv_redo_update,
   log_rv_dump_hexa,
   log_rv_dump_hexa},
  {RVHF_REUSE_PAGE,
   "RVHF_REUSE_PAGE",
   NULL,
   heap_rv_redo_reuse_page,
   NULL,
   heap_rv_dump_reuse_page},
  {RVHF_REUSE_PAGE_REUSE_OID,
   "RVHF_REUSE_PAGE_REUSE_OID",
   NULL,
   heap_rv_redo_reuse_page_reuse_oid,
   NULL,
   heap_rv_dump_reuse_page},
  {RVHF_MARK_REUSABLE_SLOT,
   "RVHF_MARK_REUSABLE_SLOT",
   NULL,
   heap_rv_redo_mark_reusable_slot,
   NULL,
   log_rv_dump_hexa},
  {RVHF_MVCC_INSERT,
   "RVHF_MVCC_INSERT",
   heap_rv_undo_insert,
   heap_rv_mvcc_redo_insert,
   log_rv_dump_hexa,
   log_rv_dump_hexa},
  {RVHF_MVCC_DELETE_REC_HOME,
   "RVHF_MVCC_DELETE_REC_HOME",
   heap_rv_mvcc_undo_delete,
   heap_rv_mvcc_redo_delete_home,
   NULL,
   NULL},
  {RVHF_MVCC_DELETE_OVERFLOW,
   "RVHF_MVCC_DELETE_OVERFLOW",
   heap_rv_mvcc_undo_delete_overflow,
   heap_rv_mvcc_redo_delete_overflow,
   NULL,
   NULL},
  {RVHF_MVCC_DELETE_REC_NEWHOME,
   "RVHF_MVCC_DELETE_REC_NEWHOME",
   heap_rv_mvcc_undo_delete,
   heap_rv_mvcc_redo_delete_newhome,
   NULL,
   NULL},
  {RVHF_MVCC_DELETE_MODIFY_HOME,
   "RVHF_MVCC_DELETE_MODIFY_HOME",
   heap_rv_undo_update,
   heap_rv_redo_update_and_update_chain,
   NULL,
   NULL},
  {RVHF_MVCC_NO_MODIFY_HOME,
   "RVHF_MVCC_NO_MODIFY_HOME",
   heap_rv_nop,
   heap_rv_update_chain_after_mvcc_op,
   NULL,
   NULL},
  {RVHF_UPDATE_NOTIFY_VACUUM,
   "RVHF_UPDATE_NOTIFY_VACUUM",
   heap_rv_undo_update,
   heap_rv_redo_update_and_update_chain,
   log_rv_dump_hexa,
   log_rv_dump_hexa},
  {RVHF_INSERT_NEWHOME,
   "RVHF_INSERT_NEWHOME",
   heap_rv_undo_insert,
   heap_rv_redo_insert,
   log_rv_dump_hexa,
   log_rv_dump_hexa},
  {RVHF_MVCC_REDISTRIBUTE,
   "RVHF_MVCC_REDISTRIBUTE",
   heap_rv_undo_insert,
   heap_rv_mvcc_redo_redistribute,
   log_rv_dump_hexa,
   log_rv_dump_hexa},
  {RVHF_MVCC_UPDATE_OVERFLOW,
   "RVHF_MVCC_UPDATE_OVERFLOW",
   heap_rv_undo_ovf_update,
   NULL,
   NULL,
   NULL},
  {RVHF_MARK_DELETED,
   "RVHF_MARK_DELETED",
   NULL,
   heap_rv_mark_deleted_on_postpone,
   NULL,
   NULL},

  {RVOVF_NEWPAGE_INSERT,    /* required for HA */
   "RVOVF_NEWPAGE_INSERT",
   NULL,
   overflow_rv_newpage_insert_redo,
   NULL,
   log_rv_dump_hexa},
  {RVOVF_NEWPAGE_LINK,
   "RVOVF_NEWPAGE_LINK",
   overflow_rv_newpage_link_undo,
   overflow_rv_link,
   overflow_rv_link_dump,
   overflow_rv_link_dump},
  {RVOVF_PAGE_UPDATE,
   "RVOVF_PAGE_UPDATE",
   log_rv_copy_char,
   overflow_rv_page_update_redo,
   overflow_rv_page_dump,
   overflow_rv_page_dump},
  {RVOVF_CHANGE_LINK,
   "RVOVF_CHANGE_LINK",
   overflow_rv_link,
   overflow_rv_link,
   overflow_rv_link_dump,
   overflow_rv_link_dump},

  {RVEH_REPLACE,
   "RVEH_REPLACE",
   log_rv_copy_char,
   log_rv_copy_char,
   NULL,
   NULL},
  {RVEH_INSERT,
   "RVEH_INSERT",
   ehash_rv_insert_undo,
   ehash_rv_insert_redo,
   NULL,
   NULL},
  {RVEH_DELETE,
   "RVEH_DELETE",
   ehash_rv_delete_undo,
   ehash_rv_delete_redo,
   NULL,
   NULL},
  {RVEH_INIT_BUCKET,
   "RVEH_INIT_BUCKET",
   pgbuf_rv_new_page_undo,
   ehash_rv_init_bucket_redo,
   NULL,
   NULL},
  {RVEH_CONNECT_BUCKET,
   "RVEH_CONNECT_BUCKET",
   log_rv_copy_char,
   ehash_rv_connect_bucket_redo,
   NULL,
   NULL},
  {RVEH_INC_COUNTER,
   "RVEH_INC_COUNTER",
   ehash_rv_increment,
   ehash_rv_increment,
   NULL,
   NULL},
  {RVEH_INIT_DIR,
   "RVEH_INIT_DIR",
   NULL,
   ehash_rv_init_dir_redo,
   NULL,
   NULL},
  {RVEH_INIT_NEW_DIR_PAGE,
   "RVEH_INIT_NEW_DIR_PAGE",
   pgbuf_rv_new_page_undo,
   ehash_rv_init_dir_new_page_redo,
   NULL,
   NULL},

  {RVBT_NDHEADER_UPD,
   "RVBT_NDHEADER_UPD",
   btree_rv_nodehdr_undoredo_update,
   btree_rv_nodehdr_undoredo_update,
   btree_rv_nodehdr_dump,
   btree_rv_nodehdr_dump},
  {RVBT_NDHEADER_INS,
   "RVBT_NDHEADER_INS",
   btree_rv_nodehdr_undo_insert,
   btree_rv_nodehdr_redo_insert,
   btree_rv_nodehdr_dump,
   btree_rv_nodehdr_dump},
  {RVBT_NDRECORD_UPD,
   "RVBT_NDRECORD_UPD",
   btree_rv_noderec_undoredo_update,
   btree_rv_noderec_undoredo_update,
   btree_rv_noderec_dump,
   btree_rv_noderec_dump},
  {RVBT_NDRECORD_INS,
   "RVBT_NDRECORD_INS",
   btree_rv_noderec_undo_insert,
   btree_rv_noderec_redo_insert,
   btree_rv_noderec_dump_slot_id,
   btree_rv_noderec_dump},
  {RVBT_NDRECORD_DEL,
   "RVBT_NDRECORD_DEL",
   btree_rv_noderec_redo_insert,
   btree_rv_noderec_undo_insert,
   btree_rv_noderec_dump,
   btree_rv_noderec_dump_slot_id},
  {RVBT_DEL_PGRECORDS,
   "RVBT_DEL_PGRECORDS",
   btree_rv_pagerec_insert,
   btree_rv_pagerec_delete,
   NULL,
   NULL},
  {RVBT_GET_NEWPAGE,
   "RVBT_GET_NEWPAGE",
   pgbuf_rv_new_page_undo,
   btree_rv_newpage_redo_init,
   NULL,
   NULL},
  {RVBT_COPYPAGE,
   "RVBT_COPYPAGE",
   btree_rv_undoredo_copy_page,
   btree_rv_undoredo_copy_page,
   NULL,
   NULL},
  {RVBT_ROOTHEADER_UPD,
   "RVBT_ROOTHEADER_UPD",
   btree_rv_roothdr_undo_update,
   btree_rv_nodehdr_undoredo_update,
   btree_rv_roothdr_dump,
   btree_rv_nodehdr_dump},
  {RVBT_UPDATE_OVFID,
   "RVBT_UPDATE_OVFID",
   btree_rv_ovfid_undoredo_update,
   btree_rv_ovfid_undoredo_update,
   btree_rv_ovfid_dump,
   btree_rv_ovfid_dump},
  {RVBT_INS_PGRECORDS,
   "RVBT_INS_PGRECORDS",
   btree_rv_pagerec_delete,
   btree_rv_pagerec_insert,
   NULL,
   NULL},
  {RVBT_MVCC_DELETE_OBJECT,
   "RVBT_MVCC_DELETE_OBJECT",
   btree_rv_keyval_undo_insert_mvcc_delid,
   btree_rv_redo_record_modify,
   btree_rv_keyval_dump,
   log_rv_dump_hexa},
  {RVBT_MVCC_INCREMENTS_UPD,
   "RVBT_MVCC_INCREMENTS_UPD",
   btree_rv_update_tran_stats,
   NULL,
   NULL, NULL},
  {RVBT_MVCC_NOTIFY_VACUUM,
   "RVBT_MVCC_NOTIFY_VACUUM",
   btree_rv_nop,
   btree_rv_nop,
   btree_rv_keyval_dump,
   NULL},
  {RVBT_LOG_GLOBAL_UNIQUE_STATS_COMMIT,
   "RVBT_LOG_GLOBAL_UNIQUE_STATS_COMMIT",
   btree_rv_undo_global_unique_stats_commit,
   btree_rv_redo_global_unique_stats_commit,
   NULL,
   NULL},
  {RVBT_DELETE_OBJECT_PHYSICAL,
   "RVBT_DELETE_OBJECT_PHYSICAL",
   btree_rv_keyval_undo_delete,
   btree_rv_redo_record_modify,
   btree_rv_keyval_dump,
   log_rv_dump_hexa},
  {RVBT_NON_MVCC_INSERT_OBJECT,
   "RVBT_NON_MVCC_INSERT_OBJECT",
   btree_rv_keyval_undo_insert,
   btree_rv_redo_record_modify,
   btree_rv_keyval_dump,
   log_rv_dump_hexa},
  {RVBT_MVCC_INSERT_OBJECT,
   "RVBT_MVCC_INSERT_OBJECT",
   btree_rv_keyval_undo_insert,
   btree_rv_redo_record_modify,
   btree_rv_keyval_dump,
   log_rv_dump_hexa},
  {RVBT_MVCC_INSERT_OBJECT_UNQ,
   "RVBT_MVCC_INSERT_OBJECT_UNQ",
   btree_rv_keyval_undo_insert_unique,
   btree_rv_redo_record_modify,
   btree_rv_keyval_dump,
   log_rv_dump_hexa},
  {RVBT_RECORD_MODIFY_UNDOREDO,
   "RVBT_RECORD_MODIFY_UNDOREDO",
   btree_rv_undo_record_modify,
   btree_rv_redo_record_modify,
   log_rv_dump_hexa,
   log_rv_dump_hexa},
  {RVBT_RECORD_MODIFY_NO_UNDO,
   "RVBT_RECORD_MODIFY_NO_UNDO",
   NULL,
   btree_rv_redo_record_modify,
   NULL,
   log_rv_dump_hexa},
  {RVBT_RECORD_MODIFY_COMPENSATE,
   "RVBT_RECORD_MODIFY_COMPENSATE",
   btree_rv_redo_record_modify,
   NULL,
   log_rv_dump_hexa,
   NULL},
  {RVBT_REMOVE_UNIQUE_STATS,
   "RVBT_REMOVE_UNIQUE_STATS",
   btree_rv_remove_unique_stats,
   btree_rv_remove_unique_stats,
   NULL,
   NULL},
  {RVBT_DELETE_OBJECT_POSTPONE,
   "RVBT_DELETE_OBJECT_POSTPONE",
   NULL,
   btree_rv_remove_marked_for_delete,
   NULL,
   btree_rv_keyval_dump},
  {RVBT_MARK_DELETED,
   "RVBT_MARK_DELETED",
   btree_rv_keyval_undo_insert_mvcc_delid,
   btree_rv_redo_record_modify,
   btree_rv_keyval_dump,
   log_rv_dump_hexa},
  {RVBT_MARK_DEALLOC_PAGE,
   "RVBT_MARK_DEALLOC_PAGE",
   btree_rv_undo_mark_dealloc_page,
   NULL,
   NULL,
   NULL},

  {RVCT_NEWPAGE,
   "RVCT_NEWPAGE",
   pgbuf_rv_new_page_undo,
   catalog_rv_new_page_redo,
   NULL,
   NULL},
  {RVCT_INSERT,
   "RVCT_INSERT",
   catalog_rv_insert_undo,
   catalog_rv_insert_redo,
   NULL,
   NULL},
  {RVCT_DELETE,
   "RVCT_DELETE",
   catalog_rv_delete_undo,
   catalog_rv_delete_redo,
   NULL,
   NULL},
  {RVCT_UPDATE,
   "RVCT_UPDATE",
   catalog_rv_update,
   catalog_rv_update,
   NULL,
   NULL},
  {RVCT_NEW_OVFPAGE_LOGICAL_UNDO,
   "RVCT_NEW_OVFPAGE_LOGICAL_UNDO",
   catalog_rv_ovf_page_logical_insert_undo,
   NULL,
   NULL,
   NULL},

  {RVLOG_OUTSIDE_LOGICAL_REDO_NOOP,
   "RVLOG_OUTSIDE_LOGICAL_REDO_NOOP",
   NULL,
   log_rv_outside_noop_redo,
   NULL,
   NULL},

  {RVREPL_DATA_INSERT,
   "RVREPL_DATA_INSERT",
   NULL,
   NULL,
   NULL,
   repl_data_insert_log_dump},
  {RVREPL_DATA_UPDATE,
   "RVREPL_DATA_UPDATE",
   NULL,
   NULL,
   NULL,
   repl_data_insert_log_dump},
  {RVREPL_DATA_DELETE,
   "RVREPL_DATA_DELETE",
   NULL,
   NULL,
   NULL,
   repl_data_insert_log_dump},
  {RVREPL_STATEMENT,
   "RVREPL_STATEMENT",
   NULL,
   NULL,
   NULL,
   repl_schema_log_dump},
  {RVREPL_DATA_UPDATE_START,
   "RVREPL_DATA_UPDATE_START",
   NULL,
   NULL,
   NULL,
   repl_data_insert_log_dump},
  {RVREPL_DATA_UPDATE_END,
   "RVREPL_DATA_UPDATE_END",
   NULL,
   NULL,
   NULL,
   repl_data_insert_log_dump},

  {RVVAC_COMPLETE,
   "RVVAC_COMPLETE",
   NULL,
   vacuum_rv_redo_vacuum_complete,
   NULL, NULL},
  {RVVAC_START_JOB,
   "RVVAC_START_JOB",
   NULL,
   vacuum_rv_redo_start_job,
   NULL,
   NULL},
  {RVVAC_DATA_APPEND_BLOCKS,
   "RVVAC_DATA_APPEND_BLOCKS",
   NULL,
   vacuum_rv_redo_append_data,
   NULL,
   vacuum_rv_redo_append_data_dump},
  {RVVAC_DATA_INIT_NEW_PAGE,
   "RVVAC_DATA_INIT_NEW_PAGE",
   NULL,
   vacuum_rv_redo_initialize_data_page,
   NULL,
   NULL},
  {RVVAC_DATA_SET_LINK,
   "RVVAC_DATA_SET_LINK",
   vacuum_rv_undoredo_data_set_link,
   vacuum_rv_undoredo_data_set_link,
   vacuum_rv_undoredo_data_set_link_dump,
   vacuum_rv_undoredo_data_set_link_dump},
  {RVVAC_DATA_FINISHED_BLOCKS,
   "RVVAC_DATA_FINISHED_BLOCKS",
   NULL,
   vacuum_rv_redo_data_finished,
   NULL,
   vacuum_rv_redo_data_finished_dump},
  {RVVAC_NOTIFY_DROPPED_FILE,
   "RVVAC_NOTIFY_DROPPED_FILE",
   vacuum_rv_notify_dropped_file,
   vacuum_rv_notify_dropped_file,
   NULL,
   NULL},
  {RVVAC_DROPPED_FILE_CLEANUP,
   "RVVAC_DROPPED_FILE_CLEANUP",
   NULL,
   vacuum_rv_redo_cleanup_dropped_files,
   NULL,
   NULL},
  {RVVAC_DROPPED_FILE_NEXT_PAGE,
   "RVVAC_DROPPED_FILE_NEXT_PAGE",
   vacuum_rv_set_next_page_dropped_files,
   vacuum_rv_set_next_page_dropped_files,
   NULL,
   NULL},
  {RVVAC_DROPPED_FILE_ADD,
   "RVVAC_DROPPED_FILE_ADD",
   vacuum_rv_undo_add_dropped_file,
   vacuum_rv_redo_add_dropped_file,
   NULL,
   NULL},
  {RVVAC_DROPPED_FILE_REPLACE,
   "RVVAC_DROPPED_FILE_REPLACE",
   vacuum_rv_replace_dropped_file,
   vacuum_rv_replace_dropped_file,
   NULL,
   NULL},
  {RVVAC_HEAP_RECORD_VACUUM,
   "RVVAC_HEAP_RECORD_VACUUM",
   vacuum_rv_undo_vacuum_heap_record,
   vacuum_rv_redo_vacuum_heap_record,
   NULL,
   log_rv_dump_hexa},
  {RVVAC_HEAP_PAGE_VACUUM,
   "RVVAC_HEAP_PAGE_VACUUM",
   NULL,
   vacuum_rv_redo_vacuum_heap_page,
   NULL,
   log_rv_dump_hexa},
  {RVVAC_REMOVE_OVF_INSID,
   "RVVAC_REMOVE_OVF_INSID",
   NULL,
   vacuum_rv_redo_remove_ovf_insid,
   NULL,
   NULL},

  {RVES_NOTIFY_VACUUM,
   "RVES_NOTIFY_VACUUM",
   vacuum_rv_es_nop,
   vacuum_rv_es_nop,
   NULL, NULL},

  {RVLOC_CLASSNAME_DUMMY,
   "RVLOC_CLASSNAME_DUMMY",
   NULL,
   locator_rv_redo_rename,
   NULL,
   NULL},

  {RVPGBUF_FLUSH_PAGE,
   "RVPGBUF_FLUSH_PAGE",
   pgbuf_rv_flush_page,
   pgbuf_rv_flush_page,
   pgbuf_rv_flush_page_dump,
   pgbuf_rv_flush_page_dump},
  {RVPGBUF_NEW_PAGE,
   "RVPGBUF_NEW_PAGE",
   pgbuf_rv_new_page_undo,
   pgbuf_rv_new_page_redo,
   NULL,
   NULL},
  {RVPGBUF_DEALLOC,
   "RVPGBUF_DEALLOC",
   pgbuf_rv_dealloc_undo,
   pgbuf_rv_dealloc_redo,
   NULL,
   NULL},
  {RVPGBUF_COMPENSATE_DEALLOC,
   "RVPGBUF_COMPENSATE_DEALLOC",
   pgbuf_rv_dealloc_undo_compensate,
   NULL,
   NULL,
   NULL},
  {RVBT_ONLINE_INDEX_UNDO_TRAN_INSERT,
   "RVBT_ONLINE_INDEX_UNDO_TRAN_INSERT",
   btree_rv_keyval_undo_online_index_tran_insert,
   btree_rv_redo_record_modify,
   btree_rv_keyval_dump,
   log_rv_dump_hexa},
  {RVBT_ONLINE_INDEX_UNDO_TRAN_DELETE,
   "RVBT_ONLINE_INDEX_UNDO_TRAN_DELETE",
   btree_rv_keyval_undo_online_index_tran_delete,
   btree_rv_redo_record_modify,
   btree_rv_keyval_dump,
   log_rv_dump_hexa},
  {RVHF_APPEND_PAGES_TO_HEAP,
   "RVHF_APPEND_PAGES_TO_HEAP",
   NULL,
   heap_rv_postpone_append_pages_to_heap,
   NULL,
   heap_rv_dump_append_pages_to_heap},
  {RVPGBUF_SET_TDE_ALGORITHM,
   "RVPGBUF_SET_TDE_ALGORITHM",
   pgbuf_rv_set_tde_algorithm,
   pgbuf_rv_set_tde_algorithm,
   NULL,
   NULL},
  {RVFL_FHEAD_SET_TDE_ALGORITHM,
   "RVFL_FHEAD_SET_TDE_ALGORITHM",
   file_rv_set_tde_algorithm,
   file_rv_set_tde_algorithm,
   NULL,
   NULL},
  {RVHF_LOB_REMOVE_DIR,
   "RVHF_LOB_REMOVE_DIR",
   heap_rv_lob_remove_dir,
   heap_rv_lob_remove_dir,
   NULL,
   NULL},
};

/*
 * rv_rcvindex_string - RETURN STRING ASSOCIATED WITH GIVEN LOG_RCVINDEX
 *
 * return:
 *
 *   rcvindex(in): Numeric recovery index
 *
 * NOTE: Return a string corresponding to the associated recovery
 *              index identifier.
 */
const char *
rv_rcvindex_string (LOG_RCVINDEX rcvindex)
{
  return RV_fun[rcvindex].recv_string;
}

#if !defined (NDEBUG)
/*
 * rv_check_rvfuns - CHECK ORDERING OF RECOVERY FUNCTIONS
 *
 * return:
 *
 * NOTE:Check the ordering of recovery functions.
 *              This is a debugging function.
 */
void
rv_check_rvfuns (void)
{
  unsigned int i, num_indices;

  num_indices = DIM (RV_fun);

  for (i = 0; i < num_indices; i++)
    if (RV_fun[i].recv_index != i)
      {
    er_log_debug (ARG_FILE_LINE,
              "log_check_rvfuns: *** SYSTEM ERROR *** Bad compilation... Recovery function %d is out of"
              " sequence in index %d of recovery function array\n", RV_fun[i].recv_index, i);
    er_set (ER_FATAL_ERROR_SEVERITY, ARG_FILE_LINE, ER_GENERIC_ERROR, 0);
    assert (false);
    break;
      }

}
#endif /* !NDEBUG */