Skip to content

File recovery.h

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

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.h: recovery functions (at server)
 */

#ifndef _RECOVERY_H_
#define _RECOVERY_H_

#ident "$Id$"

#include "error_manager.h"
#include "log_comm.h"
#include "log_lsa.hpp"
#include "thread_compat.hpp"

#include <stdio.h>

typedef enum
{
  /*
   * RULE *********************************************
   *
   * NEW ENTRIES SHOULD BE ADDED AT THE BOTTON OF THE FILE TO AVOID FULL RECOMPILATIONS (e.g., the file can be utimed)
   * and to AVOID OLD DATABASES TO BE RECOVERED UNDER OLD FILE */
  RVDK_NEWVOL = 0,
  RVDK_FORMAT = 1,
  RVDK_INITMAP = 2,
  RVDK_CHANGE_CREATION = 3,
  RVDK_RESET_BOOT_HFID = 4,
  RVDK_LINK_PERM_VOLEXT = 5,
  RVDK_EXPAND_VOLUME = 6,
  RVDK_RESERVE_SECTORS = 7,
  RVDK_UNRESERVE_SECTORS = 8,
  RVDK_VOLHEAD_EXPAND = 9,

  RVFL_DESTROY = 10,        /* Use for undo/postpone */
  RVFL_EXPAND = 11,
  RVFL_ALLOC = 12,
  RVFL_DEALLOC = 13,
  RVFL_FHEAD_ALLOC = 14,
  RVFL_FHEAD_DEALLOC = 15,
  RVFL_FHEAD_SET_LAST_USER_PAGE_FTAB = 16,
  RVFL_FHEAD_MARK_DELETE = 17,
  RVFL_FHEAD_STICKY_PAGE = 18,
  RVFL_USER_PAGE_MARK_DELETE = 19,
  RVFL_USER_PAGE_MARK_DELETE_COMPENSATE = 20,
  RVFL_FILEDESC_UPD = 21,
  RVFL_PARTSECT_ALLOC = 22,
  RVFL_PARTSECT_DEALLOC = 23,
  RVFL_EXTDATA_SET_NEXT = 24,
  RVFL_EXTDATA_ADD = 25,
  RVFL_EXTDATA_REMOVE = 26,
  RVFL_EXTDATA_MERGE = 27,
  RVFL_EXTDATA_UPDATE_ITEM = 28,
  RVFL_TRACKER_HEAP_MARK_DELETED = 29,
  RVFL_TRACKER_HEAP_REUSE = 30,
  RVFL_TRACKER_UNREGISTER = 31,
  RVFL_FHEAD_CONVERT_FTAB_TO_USER = 32,

  RVHF_CREATE_HEADER = 33,
  RVHF_NEWPAGE = 34,
  RVHF_STATS = 35,
  RVHF_CHAIN = 36,
  RVHF_INSERT = 37,
  RVHF_DELETE = 38,
  RVHF_UPDATE = 39,
  RVHF_REUSE_PAGE = 40,
  RVHF_REUSE_PAGE_REUSE_OID = 41,
  RVHF_MARK_REUSABLE_SLOT = 42,
  RVHF_MVCC_INSERT = 43,
  RVHF_MVCC_DELETE_REC_HOME = 44,
  RVHF_MVCC_DELETE_OVERFLOW = 45,
  RVHF_MVCC_DELETE_REC_NEWHOME = 46,
  RVHF_MVCC_DELETE_MODIFY_HOME = 47,
  RVHF_MVCC_NO_MODIFY_HOME = 48,
  RVHF_UPDATE_NOTIFY_VACUUM = 49,
  RVHF_INSERT_NEWHOME = 50, /* Same as RVHF_INSERT but no replication */
  RVHF_MVCC_REDISTRIBUTE = 51,
  RVHF_MVCC_UPDATE_OVERFLOW = 52,
  RVHF_MARK_DELETED = 53,

  RVOVF_NEWPAGE_INSERT = 54,    /* required for HA */
  RVOVF_NEWPAGE_LINK = 55,
  RVOVF_PAGE_UPDATE = 56,
  RVOVF_CHANGE_LINK = 57,

  RVEH_REPLACE = 58,
  RVEH_INSERT = 59,
  RVEH_DELETE = 60,
  RVEH_INIT_BUCKET = 61,
  RVEH_CONNECT_BUCKET = 62,
  RVEH_INC_COUNTER = 63,
  RVEH_INIT_DIR = 64,
  RVEH_INIT_NEW_DIR_PAGE = 65,

  RVBT_NDHEADER_UPD = 66,
  RVBT_NDHEADER_INS = 67,
  RVBT_NDRECORD_UPD = 68,
  RVBT_NDRECORD_INS = 69,
  RVBT_NDRECORD_DEL = 70,
  RVBT_DEL_PGRECORDS = 71,
  RVBT_GET_NEWPAGE = 72,
  RVBT_COPYPAGE = 73,
  RVBT_ROOTHEADER_UPD = 74,
  RVBT_UPDATE_OVFID = 75,
  RVBT_INS_PGRECORDS = 76,
  RVBT_MVCC_DELETE_OBJECT = 77,
  RVBT_MVCC_INCREMENTS_UPD = 78,
  RVBT_MVCC_NOTIFY_VACUUM = 79,
  RVBT_LOG_GLOBAL_UNIQUE_STATS_COMMIT = 80,
  RVBT_DELETE_OBJECT_PHYSICAL = 81,
  RVBT_NON_MVCC_INSERT_OBJECT = 82,
  RVBT_MVCC_INSERT_OBJECT = 83,
  RVBT_MVCC_INSERT_OBJECT_UNQ = 84,
  RVBT_RECORD_MODIFY_UNDOREDO = 85,
  RVBT_RECORD_MODIFY_NO_UNDO = 86,
  RVBT_RECORD_MODIFY_COMPENSATE = 87,
  RVBT_REMOVE_UNIQUE_STATS = 88,
  RVBT_DELETE_OBJECT_POSTPONE = 89,
  RVBT_MARK_DELETED = 90,
  RVBT_MARK_DEALLOC_PAGE = 91,

  RVCT_NEWPAGE = 92,
  RVCT_INSERT = 93,
  RVCT_DELETE = 94,
  RVCT_UPDATE = 95,
  RVCT_NEW_OVFPAGE_LOGICAL_UNDO = 96,

  RVLOG_OUTSIDE_LOGICAL_REDO_NOOP = 97,

  RVREPL_DATA_INSERT = 98,
  RVREPL_DATA_UPDATE = 99,
  RVREPL_DATA_DELETE = 100,
  RVREPL_STATEMENT = 101,
  RVREPL_DATA_UPDATE_START = 102,
  RVREPL_DATA_UPDATE_END = 103,

  RVVAC_COMPLETE = 104,
  RVVAC_START_JOB = 105,
  RVVAC_DATA_APPEND_BLOCKS = 106,
  RVVAC_DATA_INIT_NEW_PAGE = 107,
  RVVAC_DATA_SET_LINK = 108,
  RVVAC_DATA_FINISHED_BLOCKS = 109,
  RVVAC_NOTIFY_DROPPED_FILE = 110,
  RVVAC_DROPPED_FILE_CLEANUP = 111,
  RVVAC_DROPPED_FILE_NEXT_PAGE = 112,
  RVVAC_DROPPED_FILE_ADD = 113,
  RVVAC_DROPPED_FILE_REPLACE = 114,
  RVVAC_HEAP_RECORD_VACUUM = 115,
  RVVAC_HEAP_PAGE_VACUUM = 116,
  RVVAC_REMOVE_OVF_INSID = 117,

  RVES_NOTIFY_VACUUM = 118,

  RVLOC_CLASSNAME_DUMMY = 119,

  RVPGBUF_FLUSH_PAGE = 120,
  RVPGBUF_NEW_PAGE = 121,
  RVPGBUF_DEALLOC = 122,
  RVPGBUF_COMPENSATE_DEALLOC = 123,

  RVBT_ONLINE_INDEX_UNDO_TRAN_INSERT = 124,
  RVBT_ONLINE_INDEX_UNDO_TRAN_DELETE = 125,
  RVHF_APPEND_PAGES_TO_HEAP = 126,

  RVPGBUF_SET_TDE_ALGORITHM = 127,
  RVFL_FHEAD_SET_TDE_ALGORITHM = 128,
  RVHF_LOB_REMOVE_DIR = 129,

  RV_LAST_LOGID = RVHF_LOB_REMOVE_DIR,

  RV_NOT_DEFINED = 999
} LOG_RCVINDEX;

/*
 * RECOVERY STRUCTURE SEEN BY RECOVERY FUNCTIONS
 */
typedef struct log_rcv LOG_RCV;
struct log_rcv
{               /* Recovery information */
  MVCCID mvcc_id = MVCCID_NULL; /* mvcc id */
  PAGE_PTR pgptr = nullptr; /* Page to recover. Page should not be free by recovery functions, however it should be
                 * set dirty whenever is needed */
  PGLENGTH offset = 0;      /* Offset/slot of data in the above page to recover */
  int length = 0;       /* Length of data */
  const char *data = nullptr;   /* Replacement data. Pointer becomes invalid once the recovery of the data is finished */
  LOG_LSA reference_lsa = NULL_LSA; /* Next LSA used by compensate/postpone. */

  // *INDENT-OFF*
  log_rcv () = default;
  log_rcv (const log_rcv &) = delete;
  log_rcv (log_rcv &&) = delete;

  log_rcv & operator= (const log_rcv &) = delete;
  log_rcv & operator= (log_rcv &&) = delete;
  // *INDENT-ON*
};

/*
 * STRUCTURE ENTRY OF RECOVERY FUNCTIONS
 */

struct rvfun
{
  using fun_t = int (*)(THREAD_ENTRY * thread_p, LOG_RCV * logrcv);
  using dump_fun_t = void (*)(FILE * fp, int length, void *data);

  LOG_RCVINDEX recv_index;  /* For verification */
  const char *recv_string;
  fun_t undofun;
  fun_t redofun;
  dump_fun_t dump_undofun;
  dump_fun_t dump_redofun;
};

extern struct rvfun RV_fun[];

extern const char *rv_rcvindex_string (LOG_RCVINDEX rcvindex);
#if !defined (NDEBUG)
extern void rv_check_rvfuns (void);
#endif /* !NDEBUG */

#define RCV_IS_BTREE_LOGICAL_LOG(idx) \
  ((idx) == RVBT_DELETE_OBJECT_PHYSICAL \
   || (idx) == RVBT_MVCC_DELETE_OBJECT \
   || (idx) == RVBT_MVCC_INSERT_OBJECT \
   || (idx) == RVBT_NON_MVCC_INSERT_OBJECT \
   || (idx) == RVBT_MARK_DELETED \
   || (idx) == RVBT_DELETE_OBJECT_POSTPONE \
   || (idx) == RVBT_MVCC_INSERT_OBJECT_UNQ \
   || (idx) == RVBT_MVCC_NOTIFY_VACUUM \
   || (idx) == RVBT_ONLINE_INDEX_UNDO_TRAN_DELETE \
   || (idx) == RVBT_ONLINE_INDEX_UNDO_TRAN_INSERT)

#define RCV_IS_LOGICAL_COMPENSATE_MANUAL(idx) \
  (RCV_IS_BTREE_LOGICAL_LOG(idx) \
   || (idx) == RVFL_ALLOC \
   || (idx) == RVFL_USER_PAGE_MARK_DELETE \
   || (idx) == RVPGBUF_DEALLOC \
   || (idx) == RVFL_TRACKER_HEAP_REUSE \
   || (idx) == RVHF_LOB_REMOVE_DIR \
   || (idx) == RVFL_TRACKER_UNREGISTER)
#define RCV_IS_LOGICAL_RUN_POSTPONE_MANUAL(idx) \
  ((idx) == RVFL_DEALLOC \
   || (idx) == RVHF_MARK_DELETED \
   || (idx) == RVHF_LOB_REMOVE_DIR \
   || (idx) == RVBT_DELETE_OBJECT_POSTPONE)

#define RCV_IS_LOGICAL_LOG(vpid, idx) \
  (((vpid)->volid == NULL_VOLID) \
   || ((vpid)->pageid == NULL_PAGEID) \
   || RCV_IS_BTREE_LOGICAL_LOG (idx) \
   || (idx) == RVBT_MVCC_INCREMENTS_UPD \
   || (idx) == RVPGBUF_FLUSH_PAGE \
   || (idx) == RVFL_DESTROY \
   || (idx) == RVFL_ALLOC \
   || (idx) == RVFL_DEALLOC \
   || (idx) == RVVAC_NOTIFY_DROPPED_FILE \
   || (idx) == RVPGBUF_DEALLOC \
   || (idx) == RVES_NOTIFY_VACUUM \
   || (idx) == RVHF_MARK_DELETED \
   || (idx) == RVFL_TRACKER_HEAP_REUSE \
   || (idx) == RVFL_TRACKER_UNREGISTER)

#endif /* _RECOVERY_H_ */