* Copyright (c) 2022 Huawei Technologies Co.,Ltd.
*
* DMS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* -------------------------------------------------------------------------
*
* dms_api.h
*
*
* IDENTIFICATION
* src/interface/dms_api.h
*
* -------------------------------------------------------------------------
*/
#ifndef __DMS_API_H__
#define __DMS_API_H__
#include <stdlib.h>
#include <stdarg.h>
#include <assert.h>
#ifdef __cplusplus
extern "C" {
#endif
#define DMS_LOCAL_MAJOR_VER_WEIGHT 1000000
#define DMS_LOCAL_MINOR_VER_WEIGHT 1000
#define DMS_LOCAL_MAJOR_VERSION 0
#define DMS_LOCAL_MINOR_VERSION 0
#define DMS_LOCAL_VERSION 179
#define DMS_SUCCESS 0
#define DMS_ERROR (-1)
#ifdef OPENGAUSS
#define DMS_PAGEID_SIZE 24
#else
#define DMS_PAGEID_SIZE 8
#endif
#define DMS_ALOCK_NAME_SIZE 128
#define DMS_ALOCKID_SIZE sizeof(alockid_t)
#define DMS_DRID_SIZE sizeof(dms_drid_t)
#define DMS_RESID_SIZE DMS_ALOCKID_SIZE
#define DMS_XID_SIZE 12
#define DMS_INSTANCES_SIZE 4
#define DMS_ROWID_SIZE 16
#define DMS_INDEX_PROFILE_SIZE 96
#define DMS_MAX_IP_LEN 64
#define DMS_MAX_INSTANCES 64
#define DMS_MAX_NAME_LEN 64
#define DMS_MAX_RESOURCE_NAME_LEN 136
#define DMS_VERSION_MAX_LEN 256
#define DMS_OCK_LOG_PATH_LEN 256
#define DMS_LOG_PATH_LEN (256)
#define DMS_CMD_DESC_LEN 64
#define DMS_MAX_XA_BASE16_GTRID_LEN (128)
#define DMS_MAX_XA_BASE16_BQUAL_LEN (128)
#define MAX_DMS_THREAD_NUM 512
typedef enum en_dms_online_status {
DMS_ONLINE_STATUS_OUT = 0,
DMS_ONLINE_STATUS_JOIN = 1,
DMS_ONLINE_STATUS_REFORM = 2,
DMS_ONLINE_STATUS_IN = 3,
} dms_online_status_t;
typedef enum en_dms_dr_type {
DMS_DR_TYPE_INVALID = 0,
DMS_DR_TYPE_DATABASE = 1,
DMS_DR_TYPE_SPACE = 2,
DMS_DR_TYPE_TABLE = 3,
DMS_DR_TYPE_DDL = 4,
DMS_DR_TYPE_SEQENCE = 5,
DMS_DR_TYPE_SERIAL = 6,
DMS_DR_TYPE_ROLE = 7,
DMS_DR_TYPE_USER = 8,
DMS_DR_TYPE_DC = 9,
DMS_DR_TYPE_INDEX = 10,
DMS_DR_TYPE_TRIGGER = 11,
DMS_DR_TYPE_HEAP = 12,
DMS_DR_TYPE_HEAP_PART = 13,
DMS_DR_TYPE_HEAP_LATCH = 14,
DMS_DR_TYPE_HEAP_PART_LATCH = 15,
DMS_DR_TYPE_BTREE_LATCH = 16,
DMS_DR_TYPE_BRTEE_PART_LATCH = 17,
DMS_DR_TYPE_INTERVAL_PART_LATCH = 18,
DMS_DR_TYPE_LOB_LATCH = 19,
DMS_DR_TYPE_LOB_PART_LATCH = 20,
DMS_DR_TYPE_PROFILE = 21,
DMS_DR_TYPE_UNDO = 22,
DMS_DR_TYPE_PROC = 23,
DMS_DR_TYPE_GDV = 24,
DMS_DR_TYPE_SEQVAL = 25,
DMS_DR_TYPE_SHARED_INNODE = 26,
DMS_DR_TYPE_PROC_ENTRY = 27,
DMS_DR_TYPE_PART_TABLE = 28,
DMS_DR_TYPE_SS_LINK = 29,
DMS_DR_TYPE_TX_ALCK = 30,
DMS_DR_TYPE_SE_ALCK = 31,
DMS_DR_TYPE_ROWGROUP = 32,
DMS_DR_TYPE_MAX,
} dms_dr_type_t;
#define DMS_DR_IS_TABLE_TYPE(type) ((type) == DMS_DR_TYPE_TABLE || (type) == DMS_DR_TYPE_PART_TABLE)
#define DMS_DR_IS_ALOCK_TYPE(type) ((type) == DMS_DR_TYPE_TX_ALCK || (type) == DMS_DR_TYPE_SE_ALCK)
typedef enum en_dms_persistent_id {
DMS_ID_DATABASE_CTRL = 0,
DMS_ID_DATABASE_SWITCH_CTRL = 1,
DMS_ID_DATABASE_BAKUP = 2,
DMS_ID_DATABASE_LINK = 3,
DMS_ID_SPACE_OP = 10,
DMS_ID_SPACE_BLOCK = 11,
DMS_ID_DDL_OP = 20,
DMS_ID_DC_CTX = 30,
DMS_ID_INDEX_RECYLE = 40,
DMS_ID_UNDO_SET = 50,
}dms_pst_id_t;
#define DMS_SMON_DLOCK_MSG_MAX_LEN 24
#define DMS_SMON_TLOCK_MSG_MAX_LEN 64
#define DMS_SMON_MAX_SQL_LEN 10240
#define MAX_TABLE_LOCK_NUM 512
#define DMS_MAX_W_MARKS_NUM (16320 * 64)
typedef enum en_dms_smon_req_type {
DMS_SMON_REQ_SID_BY_RMID = 0,
DMS_SMON_REQ_DLOCK_BY_RMID = 1,
DMS_SMON_REQ_ROWID_BY_RMID = 2,
}dms_smon_req_type_t;
typedef enum en_dms_smon_req_rm_type {
DMS_SMON_REQ_TLOCK_RM = 0,
DMS_SMON_REQ_TLOCK_WAIT_RM = 1,
}dms_smon_req_rm_type_t;
#define DMS_DRID_CTX_SIZE 128
#pragma pack(4)
typedef struct st_dms_drid {
union {
struct {
unsigned long long key1;
unsigned long long key2;
unsigned long long key3;
};
struct {
unsigned short type;
unsigned short uid;
unsigned int index;
unsigned long long oid;
unsigned int parent;
unsigned int part;
};
};
} dms_drid_t;
#pragma pack()
typedef struct st_alockid {
char name[DMS_ALOCK_NAME_SIZE];
unsigned char len;
unsigned char type;
unsigned char unused[2];
} alockid_t;
typedef enum en_drc_res_type {
DRC_RES_INVALID_TYPE,
DRC_RES_PAGE_TYPE,
DRC_RES_LOCK_TYPE,
DRC_RES_LOCAL_LOCK_TYPE,
DRC_RES_TXN_TYPE,
DRC_RES_LOCAL_TXN_TYPE,
DRC_RES_LOCK_ITEM_TYPE,
DRC_RES_GLOBAL_XA_TYPE,
DRC_RES_ALOCK_TYPE,
DRC_RES_TYPE_MAX_COUNT,
} drc_res_type_e;
typedef enum en_dms_session {
DMS_SESSION_NORMAL = 0,
DMS_SESSION_REFORM = 1,
DMS_SESSION_RECOVER = 2,
DMS_SESSION_RECOVER_HOT_STANDBY = 3,
} dms_session_e;
* before construct CR page, we need to obtain the basic page,
* and rollback those unvisible transaction on the basic page's content,
* it represents where the basic page comes from.
*/
typedef enum st_dms_cr_version_t {
DMS_CR_VERSION_NONE = 0,
DMS_CR_VERSION_CURR_PAGE,
DMS_CR_VERSION_EDP_PAGE,
DMS_CR_VERSION_CR_PAGE,
} dms_cr_version_t;
* CR construct state machine:
* first try to read page from local node's data buffer (DMS_CR_PHASE_TRY_READ_PAGE),
* if the current page or edp page is usable, we use it to construct CR;
* otherwise, check status from the master node (DMS_CR_PHASE_CHECK_MASTER),
* if master is remote node, the request CR to the master (DMS_CR_PHASE_REQ_MASTER),
* otherwise obtain the owner's position, the either request CR to the remote owner (DMS_CR_PHASE_REQ_OWNER),
* or trigger local node to read current page and do the CR construct (DMS_CR_PHASE_READ_PAGE);
* the master receives CR request, it will route the request to the owner,
* and the owner will do CR construct operations,
* meanwhile it will decide whether the other node needs to continue CR construct (DMS_CR_PHASE_CONSTRUCT).
* if all CR construct operations have done, the phase will be DMS_CR_PHASE_DONE.
*/
typedef enum st_dms_cr_phase_t {
DMS_CR_PHASE_TRY_READ_PAGE = 0,
DMS_CR_PHASE_CHECK_MASTER,
DMS_CR_PHASE_REQ_MASTER,
DMS_CR_PHASE_REQ_OWNER,
DMS_CR_PHASE_READ_PAGE,
DMS_CR_PHASE_CONSTRUCT,
DMS_CR_PHASE_DONE,
} dms_cr_phase_t;
typedef enum st_dms_cr_status_t {
DMS_CR_STATUS_ABORT = 0,
DMS_CR_STATUS_INVISIBLE_TXN,
DMS_CR_STATUS_OTHER_NODE_INVISIBLE_TXN,
DMS_CR_STATUS_PENDING_TXN,
DMS_CR_STATUS_ALL_VISIBLE,
DMS_CR_STATUS_DB_NOT_READY,
} dms_cr_status_t;
typedef struct st_dms_cr_assist_t {
void *handle;
unsigned long long query_scn;
unsigned int ssn;
unsigned int relay_inst;
char *page;
char *fb_mark;
char page_id[DMS_PAGEID_SIZE];
char curr_xid[DMS_XID_SIZE];
char wxid[DMS_XID_SIZE];
char entry[DMS_PAGEID_SIZE];
char profile[DMS_INDEX_PROFILE_SIZE];
char rowid[DMS_ROWID_SIZE];
unsigned int check_restart;
unsigned int *check_found;
dms_cr_phase_t phase;
dms_cr_status_t status;
} dms_cr_assist_t;
typedef struct st_dms_drlock {
dms_drid_t drid;
void *handle;
} dms_drlock_t;
typedef struct st_dms_drlatch {
dms_drid_t drid;
void *handle;
} dms_drlatch_t;
typedef struct st_dms_xid_ctx {
unsigned long long xid;
unsigned char is_scan;
unsigned char inst_id;
unsigned char unused[2];
unsigned long long scn;
} dms_xid_ctx_t;
typedef struct dms_opengauss_relfilenode {
unsigned int spcNode;
unsigned int dbNode;
unsigned int relNode;
signed short bucketNode;
unsigned short opt;
} dms_opengauss_relfilenode_t;
typedef struct st_dms_rfn {
dms_opengauss_relfilenode_t rnode;
unsigned char inst_id;
} dms_rfn_t;
typedef struct st_dms_xmap_ctx {
unsigned int xmap;
unsigned int dest_id;
} dms_xmap_ctx_t;
typedef struct st_dms_process_context {
void *db_handle;
unsigned int sess_id;
unsigned int inst_id;
} dms_process_context_t;
typedef struct st_drc_global_xid {
unsigned long long fmt_id;
char gtrid[DMS_MAX_XA_BASE16_GTRID_LEN];
char bqual[DMS_MAX_XA_BASE16_BQUAL_LEN];
unsigned char gtrid_len;
unsigned char bqual_len;
} drc_global_xid_t;
typedef struct st_dms_context {
union {
struct {
void *db_handle;
unsigned int sess_id;
unsigned int inst_id;
};
dms_process_context_t proc_ctx;
};
dms_session_e sess_type;
unsigned char is_try;
unsigned char type;
unsigned char is_upgrade;
unsigned short len;
unsigned long long ctx_ruid;
union {
char resid[DMS_RESID_SIZE];
dms_drid_t lock_id;
dms_xid_ctx_t xid_ctx;
dms_xmap_ctx_t xmap_ctx;
dms_rfn_t rfn;
unsigned char edp_inst;
drc_global_xid_t global_xid;
};
void *stat;
void *stat_instance;
unsigned long long wait_usecs;
unsigned char intercept_type;
unsigned char curr_mode;
unsigned long long max_wait_rsp_time;
} dms_context_t;
typedef struct st_dms_cr {
void *cr_cursor;
unsigned long long query_scn;
unsigned int ssn;
char *page;
unsigned char *fb_mark;
dms_cr_status_t status;
dms_cr_phase_t phase;
} dms_cr_t;
typedef struct st_dms_opengauss_xid_csn {
unsigned long long xid;
unsigned long long snapshotcsn;
unsigned long long snapshotxmin;
unsigned char is_committed;
unsigned char is_mvcc;
unsigned char is_nest;
} dms_opengauss_xid_csn_t;
typedef struct st_dms_opengauss_csn_result {
unsigned long long csn;
unsigned char sync;
unsigned int clogstatus;
unsigned long long lsn;
} dms_opengauss_csn_result_t;
typedef struct dms_opengauss_txn_snapshot {
unsigned long long xmin;
unsigned long long xmax;
unsigned long long snapshotcsn;
unsigned long long localxmin;
} dms_opengauss_txn_snapshot_t;
typedef struct dms_opengauss_txn_sw_info {
unsigned long long sxid;
unsigned int scid;
unsigned int server_proc_slot;
} dms_opengauss_txn_sw_info_t;
typedef struct st_dms_opengauss_page_status_result {
int bit_count;
unsigned long int page_map[8];
} dms_opengauss_page_status_result_t;
typedef enum dms_opengauss_lock_req_type {
SHARED_INVAL_MSG,
DROP_BUF_MSG,
LOCK_NORMAL_MODE,
LOCK_RELEASE_SELF,
LOCK_REACQUIRE,
} dms_opengauss_lock_req_type_t;
typedef struct st_dms_txn_info {
unsigned long long scn;
unsigned char is_owscn;
unsigned char status;
unsigned char unused[2];
unsigned long long xid;
} dms_txn_info_t;
typedef struct st_dms_txn_snapshot {
unsigned long long scn;
unsigned int xnum;
unsigned short rmid;
unsigned char status;
unsigned char in_process;
} dms_txn_snapshot_t;
typedef struct st_dms_edp_info {
char page[DMS_PAGEID_SIZE];
unsigned long long lsn;
union {
unsigned char id;
unsigned long long edp_map;
};
} dms_edp_info_t;
typedef struct st_dms_broadcast_context {
char *data;
unsigned int len;
char *output_msg;
unsigned int *output_msg_len;
} dms_broadcast_context_t;
#define DMS_BUF_CTRL_PADDING_SIZE 128
typedef union st_dms_buf_ctrl
{
struct {
volatile unsigned char lock_mode;
volatile unsigned char is_edp;
volatile unsigned char force_request;
volatile unsigned char been_loaded;
volatile unsigned char in_rcy;
volatile unsigned char release_conflict;
volatile unsigned char is_reform_visit;
volatile unsigned char unused;
unsigned long long edp_lsn;
unsigned long long edp_scn;
unsigned long long edp_map;
long long last_ckpt_time;
volatile unsigned int lock_ss_read;
volatile unsigned int lock_ss_ckpt_copy;
unsigned long long seq;
void *buf_ctrl;
#ifdef OPENGAUSS
int buf_id;
unsigned int state;
unsigned int pblk_relno;
unsigned int pblk_blkno;
unsigned long long pblk_lsn;
unsigned char seg_fileno;
unsigned int seg_blockno;
void *ctrl_lock;
volatile unsigned char need_check_pincount;
volatile unsigned int pinned_count;
volatile unsigned long long lsn_on_disk;
#endif
};
char padding[DMS_BUF_CTRL_PADDING_SIZE];
} dms_buf_ctrl_t;
static_assert(sizeof(dms_buf_ctrl_t) == DMS_BUF_CTRL_PADDING_SIZE, "dms_buf_ctrl_t is not cacheline aligned!");
typedef struct st_dms_ctrl_info {
char pageid[DMS_PAGEID_SIZE];
unsigned long long lsn;
unsigned char is_dirty;
unsigned char is_edp;
unsigned char lock_mode;
unsigned char in_rcy;
} dms_ctrl_info_t;
typedef enum en_dms_page_latch_mode {
DMS_PAGE_LATCH_MODE_S = 1,
DMS_PAGE_LATCH_MODE_X = 2,
DMS_PAGE_LATCH_MODE_FORCE_S = 3,
} dms_page_latch_mode_t;
#define DMS_ENTER_PAGE_NORMAL (unsigned char)0
#define DMS_ENTER_PAGE_RESIDENT (unsigned char)1
#define DMS_ENTER_PAGE_PINNED (unsigned char)2
#define DMS_ENTER_PAGE_NO_READ (unsigned char)4
#define DMS_ENTER_PAGE_TRY (unsigned char)8
#define DMS_ENTER_PAGE_LRU_STATS_SCAN (unsigned char)0x10
#define DMS_ENTER_PAGE_LRU_HIGH_AGE (unsigned char)0x20
#define DMS_ENTER_PAGE_LOCAL (unsigned char)0x40
typedef struct st_dms_read_page_assist {
char *pageid;
unsigned long long query_scn;
dms_page_latch_mode_t mode;
unsigned char options;
unsigned char try_edp;
unsigned short read_num;
} dms_read_page_assist_t;
typedef enum en_dms_buf_load_status {
DMS_BUF_NEED_LOAD = 0x00,
DMS_BUF_IS_LOADED = 0x01,
DMS_BUF_LOAD_FAILED = 0x02,
DMS_BUF_NEED_TRANSFER = 0x04,
} dms_buf_load_status_t;
typedef enum en_dms_log_level {
DMS_LOG_LEVEL_ERROR = 0,
DMS_LOG_LEVEL_WARN,
DMS_LOG_LEVEL_INFO,
DMS_LOG_LEVEL_COUNT,
} dms_log_level_t;
typedef enum en_dms_log_id {
DMS_LOG_ID_RUN = 0,
DMS_LOG_ID_DEBUG,
DMS_LOG_ID_COUNT,
} dms_log_id_t;
* lock mode in DMS, we use it to coordinate concurrent access among different instances.
* !!!!Attention Do not modify its order
*/
typedef enum en_dms_lock_mode {
DMS_LOCK_NULL = 0,
DMS_LOCK_SHARE = 1,
DMS_LOCK_EXCLUSIVE = 2,
DMS_LOCK_MODE_MAX = 3,
} dms_lock_mode_t;
typedef enum en_dms_conn_mode {
DMS_CONN_MODE_TCP = 0,
DMS_CONN_MODE_RDMA = 1,
DMS_CONN_MODE_UBC = 2,
DMS_CONN_MODE_SHM = 3,
} dms_conn_mode_t;
typedef enum en_dms_txn_wait_status {
DMS_REMOTE_TXN_WAIT = 0,
DMS_REMOTE_TXN_END = 1
} dms_txn_wait_status_t;
typedef enum en_dms_xact_status {
DMS_XACT_END = 0,
DMS_XACT_BEGIN = 1,
DMS_XACT_PHASE1 = 2,
DMS_XACT_PHASE2 = 3
} dms_xact_status_t;
typedef enum en_dms_cm_stat {
DMS_CM_RES_UNKNOWN = 0,
DMS_CM_RES_ONLINE = 1,
DMS_CM_RES_OFFLINE = 2,
DMS_CM_RES_STATE_COUNT = 3,
} dms_cm_stat_t;
typedef struct st_dw_recovery_info {
unsigned long long bitmap_old_join;
unsigned long long bitmap_old_remove;
unsigned long long bitmap_new_join;
} dw_recovery_info_t;
typedef struct st_inst_list {
unsigned char inst_id_list[DMS_MAX_INSTANCES];
unsigned char inst_id_count;
unsigned char reserve[3];
} instance_list_t;
typedef enum en_dms_wait_event {
DMS_EVT_IDLE_WAIT = 0,
DMS_EVT_GC_BUFFER_BUSY,
DMS_EVT_DCS_REQ_MASTER4PAGE_1WAY,
DMS_EVT_DCS_REQ_MASTER4PAGE_2WAY,
DMS_EVT_DCS_REQ_MASTER4PAGE_3WAY,
DMS_EVT_DCS_REQ_MASTER4PAGE_TRY,
DMS_EVT_DCS_REQ_OWNER4PAGE,
DMS_EVT_DCS_CLAIM_OWNER,
DMS_EVT_DCS_RELEASE_OWNER,
DMS_EVT_DCS_INVLDT_SHARE_COPY_REQ,
DMS_EVT_DCS_INVLDT_SHARE_COPY_PROCESS,
DMS_EVT_DCS_TRANSFER_PAGE_LATCH,
DMS_EVT_DCS_TRANSFER_PAGE_READONLY2X,
DMS_EVT_DCS_TRANSFER_PAGE_FLUSHLOG,
DMS_EVT_DCS_TRANSFER_PAGE,
DMS_EVT_PCR_REQ_BTREE_PAGE,
DMS_EVT_PCR_REQ_HEAP_PAGE,
DMS_EVT_PCR_REQ_MASTER,
DMS_EVT_PCR_REQ_OWNER,
DMS_EVT_PCR_CHECK_CURR_VISIBLE,
DMS_EVT_TXN_REQ_INFO,
DMS_EVT_TXN_REQ_SNAPSHOT,
DMS_EVT_DLS_REQ_LOCK,
DMS_EVT_DLS_REQ_TABLE,
DMS_EVT_DLS_REQ_PART_X,
DMS_EVT_DLS_REQ_PART_S,
DMS_EVT_DLS_REQ_ALOCK_X,
DMS_EVT_DLS_REQ_ALOCK_S,
DMS_EVT_DLS_WAIT_TXN,
DMS_EVT_DEAD_LOCK_TXN,
DMS_EVT_DEAD_LOCK_TABLE,
DMS_EVT_DEAD_LOCK_ITL,
DMS_EVT_DEAD_LOCK_ALCK,
DMS_EVT_BROADCAST_BTREE_SPLIT,
DMS_EVT_BROADCAST_ROOT_PAGE,
DMS_EVT_QUERY_OWNER_ID,
DMS_EVT_LATCH_X,
DMS_EVT_LATCH_S,
DMS_EVT_LATCH_X_REMOTE,
DMS_EVT_LATCH_S_REMOTE,
DMS_EVT_ONDEMAND_REDO,
DMS_EVT_PAGE_STATUS_INFO,
DMS_EVT_OPENGAUSS_SEND_XMIN,
DMS_EVT_DCS_REQ_CREATE_XA_RES,
DMS_EVT_DCS_REQ_DELETE_XA_RES,
DMS_EVT_DCS_REQ_XA_OWNER_ID,
DMS_EVT_DCS_REQ_XA_IN_USE,
DMS_EVT_DCS_REQ_END_XA,
DMS_EVT_REQ_CKPT,
DMS_EVT_PROC_GENERIC_REQ,
DMS_EVT_PROC_REFORM_REQ,
DMS_EVT_DCS_TRANSTER_PAGE_LSNDWAIT,
DMS_EVT_DCS_INVALID_DRC_LSNDWAIT,
DMS_EVT_REQ_IMCSTORE_DELTA,
DMS_EVT_COUNT,
} dms_wait_event_t;
typedef enum en_dms_sysstat {
DMS_STAT_BUFFER_GETS = 0,
DMS_STAT_BUFFER_SENDS,
DMS_STAT_CR_READS,
DMS_STAT_CR_GETS,
DMS_STAT_CR_SENDS,
DMS_STAT_NET_TIME,
DMS_STAT_COUNT,
} dms_sysstat_t;
typedef enum en_dms_role {
DMS_ROLE_UNKNOW = 0,
DMS_ROLE_REFORMER = 1,
DMS_ROLE_PARTNER = 2
} dms_role_t;
typedef enum en_reform_phase {
DMS_PHASE_START = 0,
DMS_PHASE_AFTER_DRC_ACCESS = 1,
DMS_PHASE_AFTER_RECOVERY = 2,
DMS_PHASE_AFTER_TXN_DEPOSIT = 3,
DMS_PHASE_BEFORE_ROLLBACK = 4,
DMS_PHASE_END = 5,
} reform_phase_t;
typedef enum en_dms_reform_type {
DMS_REFORM_TYPE_FOR_NORMAL = 0,
DMS_REFORM_TYPE_FOR_BUILD,
DMS_REFORM_TYPE_FOR_FAILOVER,
DMS_REFORM_TYPE_FOR_SWITCHOVER,
DMS_REFORM_TYPE_FOR_NORMAL_OPENGAUSS,
DMS_REFORM_TYPE_FOR_FAILOVER_OPENGAUSS,
DMS_REFORM_TYPE_FOR_SWITCHOVER_OPENGAUSS,
DMS_REFORM_TYPE_FOR_FULL_CLEAN,
DMS_REFORM_TYPE_FOR_MAINTAIN,
DMS_REFORM_TYPE_FOR_RST_RECOVER,
DMS_REFORM_TYPE_FOR_NEW_JOIN,
DMS_REFORM_TYPE_FOR_OLD_REMOVE,
DMS_REFORM_TYPE_FOR_SHUTDOWN_CONSISTENCY,
DMS_REFORM_TYPE_FOR_STANDBY_MAINTAIN,
DMS_REFORM_TYPE_FOR_NORMAL_STANDBY,
DMS_REFORM_TYPE_FOR_AZ_SWITCHOVER_DEMOTE,
DMS_REFORM_TYPE_FOR_AZ_SWITCHOVER_PROMOTE,
DMS_REFORM_TYPE_FOR_AZ_FAILOVER,
DMS_REFORM_TYPE_COUNT
} dms_reform_type_t;
typedef enum en_dms_status {
DMS_STATUS_OUT = 0,
DMS_STATUS_JOIN = 1,
DMS_STATUS_REFORM = 2,
DMS_STATUS_IN = 3
} dms_status_t;
typedef enum st_dms_session_type {
DMS_SESSION_TYPE_NONE = 0,
DMS_SESSION_TYPE_WORKER = 1,
DMS_SESSION_TYPE_FULL_RCY = 2,
DMS_SESSION_TYPE_FULL_RCY_PARAL = 3,
}dms_session_type_e;
#define DMS_RES_INTERCEPT_TYPE_NONE 0
#define DMS_RES_INTERCEPT_TYPE_BIZ_SESSION 1
#define DCS_BATCH_BUF_SIZE (1024 * 30)
#define DCS_RLS_OWNER_BATCH_SIZE (DCS_BATCH_BUF_SIZE / DMS_PAGEID_SIZE)
typedef struct st_dcs_batch_buf {
char buffers[DMS_MAX_INSTANCES][DCS_BATCH_BUF_SIZE];
unsigned int count[DMS_MAX_INSTANCES];
unsigned int max_count;
} dcs_batch_buf_t;
typedef enum en_dms_inst_behavior {
DMS_INST_BEHAVIOR_IN_IDLE = 0,
DMS_INST_BEHAVIOR_IN_REFORM,
DMS_INST_BEHAVIOR_IN_BACKUP,
} dms_inst_behavior_t;
typedef struct st_stat_buf_info {
int instance_id;
unsigned char lock_mode;
unsigned long int mem_lsn;
unsigned long int rec_lsn;
unsigned long int lsn_on_disk;
unsigned long int dirty_queue_loc;
char aio_in_progress;
char data[DMS_RESID_SIZE];
} stat_buf_info_t;
typedef enum en_broadcast_scope {
DMS_BROADCAST_OLDIN_LIST = 0,
DMS_BROADCAST_ONLINE_LIST = 1,
DMS_BROADCAST_SPECIFY_LIST = 2,
DMS_BROADCAST_TYPE_COUNT,
} dms_broadcast_scope_e;
typedef enum en_dms_buf_stats_type {
DMS_BUF_STATS_NULL = 0,
DMS_BUF_STATS_LOAD = 1,
DMS_BUF_STATS_EXPIRE = 2,
} dms_buf_stats_type_e;
* used by openGauss server to get DRC information
*/
typedef struct st_dv_drc_buf_info {
stat_buf_info_t buf_info[DMS_MAX_INSTANCES];
dms_context_t dms_ctx;
char data[DMS_MAX_RESOURCE_NAME_LEN];
unsigned char master_id;
unsigned long long copy_insts;
unsigned char claimed_owner;
unsigned char lock_mode;
unsigned char last_edp;
unsigned char type;
unsigned char in_recovery;
unsigned char copy_promote;
unsigned short part_id;
unsigned long long edp_map;
unsigned long long lsn;
unsigned short len;
unsigned char recovery_skip;
unsigned char recycling;
unsigned char converting_req_info_inst_id;
unsigned char converting_req_info_curr_mode;
unsigned char converting_req_info_req_mode;
unsigned char is_valid;
} dv_drc_buf_info;
typedef struct st_dms_reform_start_context {
dms_role_t role;
dms_reform_type_t reform_type;
unsigned long long bitmap_participated;
unsigned long long bitmap_reconnect;
} dms_reform_start_context_t;
typedef enum en_dms_db_role {
DMS_DB_ROLE_PRIMARY = 0,
DMS_DB_ROLE_PHYSICAL_STANDBY = 1,
DMS_DB_ROLE_CASCADED_PHYSICAL_STANDBY = 2,
} dms_db_role_t;
typedef struct st_dms_broadcast_info {
char *data;
unsigned int len;
char *output;
unsigned int *output_len;
dms_broadcast_scope_e scope;
unsigned long long inst_map;
unsigned int timeout;
unsigned char handle_recv_msg;
unsigned char check_session_kill;
} dms_broadcast_info_t;
typedef enum en_dms_stat_cmd {
DMS_STAT_ASK_MASTER,
DMS_STAT_ASK_OWNER,
DMS_STAT_ASK_CR_PAGE,
DMS_STAT_ASK_MASTER_CR_PAGE,
DMS_STAT_ASK_OWNER_CR_PAGE,
DMS_STAT_CMD_COUNT,
} dms_stat_cmd_e;
typedef struct st_dms_stat_by_cmd {
unsigned long long ask_lock_succ_cnt;
unsigned long long ask_lock_fail_cnt;
unsigned long long ask_page_succ_cnt;
unsigned long long ask_page_fail_cnt;
} dms_stat_by_cmd_t;
typedef struct st_dms_msg_stats {
dms_stat_by_cmd_t stat_cmd[DMS_STAT_CMD_COUNT];
} dms_msg_stats_t;
typedef int(*dms_get_list_stable)(void *db_handle, unsigned long long *list_stable, unsigned char *reformer_id);
typedef int(*dms_save_list_stable)(void *db_handle, unsigned long long list_stable, unsigned char reformer_id,
unsigned long long list_in, unsigned int save_ctrl);
typedef int(*dms_get_dms_status)(void *db_handle);
typedef void(*dms_set_dms_status)(void *db_handle, int status);
typedef int(*dms_confirm_converting)(void *db_handle, char *pageid, unsigned char smon_chk,
unsigned char *lock_mode, unsigned long long *edp_map, unsigned long long *lsn);
typedef int(*dms_flush_copy)(void *db_handle, char *pageid, unsigned char thread_index);
typedef int(*dms_disk_lsn)(void *db_handle, char *pageid, unsigned long long *lsn);
typedef int(*dms_recovery)(void *db_handle, void *recovery_list, int reform_type, int is_reformer);
typedef int(*dms_recovery_analyse)(void *db_handle, void *recovery_list, int is_reformer);
typedef int(*dms_dw_recovery)(void *db_handle, void *recovery_list, unsigned long long list_in, int is_reformer);
typedef int(*dms_df_recovery)(void *db_handle, unsigned long long list_in, void *recovery_list);
typedef int(*dms_space_reload)(void *db_handle, unsigned long long list_in);
typedef int(*dms_opengauss_startup)(void *db_handle);
typedef int(*dms_opengauss_recovery_standby)(void *db_handle, int inst_id);
typedef int(*dms_opengauss_recovery_primary)(void *db_handle, int inst_id);
typedef void(*dms_reform_start_notify)(void *db_handle, dms_reform_start_context_t *rs_ctx);
typedef int(*dms_undo_init)(void *db_handle, unsigned char inst_id);
typedef int(*dms_tx_area_init)(void *db_handle, unsigned char inst_id);
typedef int(*dms_tx_area_load)(void *db_handle, unsigned char inst_id);
typedef int(*dms_tx_rollback_start)(void *db_handle, unsigned char inst_id);
typedef int(*dms_convert_to_readwrite)(void *db_handle);
typedef int(*dms_tx_rollback_finish)(void *db_handle, unsigned char inst_id);
typedef unsigned char(*dms_recovery_in_progress)(void *db_handle);
typedef unsigned int(*dms_get_page_hash_val)(const char pageid[DMS_PAGEID_SIZE]);
typedef unsigned int(*dms_inc_and_get_srsn)(unsigned int sess_id);
typedef unsigned long long(*dms_get_page_lsn)(const dms_buf_ctrl_t *dms_ctrl);
typedef int(*dms_set_buf_load_status)(dms_buf_ctrl_t *dms_ctrl, dms_buf_load_status_t dms_buf_load_status);
typedef void(*dms_stats_buf)(void *db_handle, dms_buf_ctrl_t *dms_ctrl, dms_buf_stats_type_e stats_type);
typedef void(*dms_update_global_lsn)(void *db_handle, unsigned long long lamport_lsn);
typedef void(*dms_update_global_scn)(void *db_handle, unsigned long long lamport_scn);
typedef void(*dms_update_node_lfn)(void *db_handle, unsigned char node_id, unsigned long long node_lfn);
typedef void(*dms_update_node_lfns)(void *db_handle, unsigned long long *node_data, unsigned int len);
typedef void(*dms_get_node_lfns)(void *db_handle, unsigned long long *node_lfn, unsigned int len);
typedef void(*dms_update_replay_lfns)(void *db_handle, unsigned long long *node_data, unsigned int len);
typedef void(*dms_get_replay_lfns)(void *db_handle, unsigned long long *node_data, unsigned int len);
typedef void(*dms_update_page_lfn)(dms_buf_ctrl_t *dms_ctrl, unsigned long long lastest_lfn);
typedef unsigned long long (*dms_get_page_lfn)(dms_buf_ctrl_t *dms_ctrl);
typedef unsigned long long(*dms_get_global_lfn)(void *db_handle);
typedef unsigned long long(*dms_get_global_scn)(void *db_handle);
typedef unsigned long long(*dms_get_global_lsn)(void *db_handle);
typedef void(*dms_get_global_flushed_lfn)(void *db_handle, unsigned char *node_id, unsigned long long *node_lfn);
typedef int(*dms_read_local_page4transfer)(void *db_handle, char pageid[DMS_PAGEID_SIZE],
dms_lock_mode_t mode, dms_buf_ctrl_t **dms_ctrl, unsigned long long seq);
typedef int(*dms_try_read_local_page)(void *db_handle, char pageid[DMS_PAGEID_SIZE],
dms_lock_mode_t mode, dms_buf_ctrl_t **dms_ctrl);
typedef unsigned char(*dms_page_is_dirty)(dms_buf_ctrl_t *dms_ctrl);
typedef void(*dms_leave_local_page)(void *db_handle, dms_buf_ctrl_t *dms_ctrl);
typedef void(*dms_get_pageid)(dms_buf_ctrl_t *dms_ctrl, char **pageid, unsigned int *size);
typedef char *(*dms_get_page)(dms_buf_ctrl_t *dms_ctrl);
typedef int (*dms_invalidate_page)(void *db_handle, char pageid[DMS_PAGEID_SIZE], unsigned char invld_owner,
unsigned long long seq, unsigned long long *page_lfn);
typedef void *(*dms_get_db_handle)(unsigned int *db_handle_index, dms_session_type_e session_type);
typedef void (*dms_release_db_handle)(void *db_handle);
typedef char *(*dms_get_wxid_from_cr_cursor)(void *cr_cursor);
typedef void(*dms_set_page_force_request)(void *db_handle, char pageid[DMS_PAGEID_SIZE]);
typedef void(*dms_get_entry_pageid_from_cr_cursor)(void *cr_cursor, char index_entry_pageid[DMS_PAGEID_SIZE]);
typedef void(*dms_get_index_profile_from_cr_cursor)(void *cr_cursor, char index_profile[DMS_INDEX_PROFILE_SIZE]);
typedef void(*dms_get_xid_from_cr_cursor)(void *cr_cursor, char xid[DMS_XID_SIZE]);
typedef void(*dms_get_rowid_from_cr_cursor)(void *cr_cursor, char rowid[DMS_ROWID_SIZE]);
typedef int (*dms_heap_construct_cr_page)(dms_cr_assist_t *pcr);
typedef int (*dms_btree_construct_cr_page)(dms_cr_assist_t *pcr);
typedef int (*dms_check_heap_page_visible)(dms_cr_assist_t *pcr);
typedef int(*dms_read_page)(void *db_handle, dms_read_page_assist_t *assist, char **page_addr, unsigned int *status);
typedef void(*dms_leave_page)(void *db_handle, unsigned char changed, unsigned int status);
typedef char *(*dms_mem_alloc)(void *context, unsigned int size);
typedef void(*dms_mem_free)(void *context, void *ptr);
typedef void(*dms_mem_reset)(void *context);
typedef void *(*dms_drc_alloc)(size_t size);
typedef void(*dms_drc_free)(void *ptr);
typedef int (*dms_process_broadcast)(void *db_handle, dms_broadcast_context_t *broad_ctx);
typedef int (*dms_process_broadcast_ack)(void *db_handle, dms_broadcast_context_t *broad_ctx);
typedef int(*dms_get_txn_info)(void *db_handle, unsigned long long xid,
unsigned char is_scan, dms_txn_info_t *txn_info);
typedef int(*dms_get_opengauss_xid_csn)(void *db_handle, dms_opengauss_xid_csn_t *csn_req,
dms_opengauss_csn_result_t *csn_ack);
typedef int(*dms_get_opengauss_update_xid)(void *db_handle, unsigned long long xid,
unsigned int t_infomask, unsigned int t_infomask2, unsigned long long *uxid);
typedef int(*dms_get_opengauss_txn_status)(void *db_handle, unsigned long long xid, unsigned char type,
unsigned char* status);
typedef int(*dms_opengauss_lock_buffer)(void *db_handle, int buffer, unsigned char lock_mode,
unsigned char* curr_mode);
typedef int(*dms_get_txn_snapshot)(void *db_handle, unsigned int xmap, dms_txn_snapshot_t *txn_snapshot);
typedef int(*dms_get_opengauss_txn_snapshot)(void *db_handle, dms_opengauss_txn_snapshot_t *txn_snapshot,
unsigned char inst_id);
typedef int(*dms_get_opengauss_txn_of_master)(void *db_handle, dms_opengauss_txn_sw_info_t *txn_swinfo);
typedef int(*dms_get_opengauss_page_status)(void *db_handle, dms_opengauss_relfilenode_t *rnode, unsigned int page,
int page_num, dms_opengauss_page_status_result_t *page_result);
typedef void (*dms_log_output)(dms_log_id_t log_type, dms_log_level_t log_level, const char *code_file_name,
unsigned int code_line_num, const char *module_name, const char *format, ...);
typedef int (*dms_log_flush)(void *db_handle, unsigned long long *lsn);
typedef int (*dms_log_conditional_flush)(void *db_handle, unsigned long long lfn, unsigned long long *lsn);
typedef void (*dms_lsnd_wait)(void *db_handle, unsigned long long lfn);
typedef int(*dms_process_edp)(void *db_handle, dms_edp_info_t *pages, unsigned int count);
typedef void (*dms_clean_ctrl_edp)(void *db_handle, dms_buf_ctrl_t *dms_ctrl);
typedef char *(*dms_display_pageid)(char *display_buf, unsigned int count, char *pageid);
typedef char *(*dms_display_xid)(char *display_buf, unsigned int count, char *xid);
typedef char *(*dms_display_rowid)(char *display_buf, unsigned int count, char *rowid);
typedef int (*dms_check_session_invalid)(unsigned int sid);
typedef int (*dms_drc_buf_res_rebuild)(void *db_handle);
typedef int (*dms_drc_buf_res_rebuild_parallel)(void *db_handle, unsigned char thread_index, unsigned char thread_num);
typedef int (*dms_drc_tlock_rebuild_parallel)(void *db_handle, unsigned char thread_index, unsigned char thread_num);
typedef int(*dms_ctl_rcy_clean_parallel_t)(void *db_handle, unsigned char thread_index, unsigned char thread_num);
typedef unsigned char(*dms_ckpt_session)(void *db_handle);
typedef void (*dms_check_if_build_complete)(void *db_handle, unsigned int *build_complete);
typedef void (*dms_check_if_restore_recover)(void *db_handle, unsigned int *rst_recover);
typedef void (*dms_set_switchover_result)(void *db_handle, int result);
typedef int (*dms_mount_to_recovery)(void *db_handle, unsigned int *has_offline);
typedef void (*dms_reform_set_dms_role)(void *db_handle, unsigned int reformer_id);
typedef void (*dms_reset_user)(void *db_handle, unsigned long long list_in);
typedef int (*dms_drc_xa_res_rebuild)(void *db_handle, unsigned char thread_index, unsigned char parall_num);
typedef void (*dms_reform_shrink_xa_rms)(void *db_handle, unsigned char undo_seg_id);
typedef void (*dms_ckpt_unblock_rcy_local)(void *db_handle, unsigned long long list_in);
typedef int (*dms_drc_rebuild_parallel)(void *db_handle, unsigned char thread_index, unsigned char thread_num);
typedef void (*dms_thread_init_t)(unsigned char need_startup, char **reg_data);
typedef void (*dms_thread_deinit_t)(void);
typedef int (*dms_get_db_primary_id)(void *db_handle, unsigned int *primary_id);
typedef int (*dms_opengauss_ondemand_redo_buffer)(void *block_key, int *redo_status);
typedef int (*dms_opengauss_do_ckpt_immediate)(unsigned long long *ckpt_loc);
typedef void (*dms_reform_check_opengauss)(void *db_handle, unsigned int current_step, unsigned int current_role, long long dyn_log_time);
typedef int(*dms_decrypt_pwd_t)(const char *cipher, unsigned int len, char *plain, unsigned int size);
typedef unsigned short (*dms_get_sid_by_rmid)(void *db_handle, unsigned short rmid);
typedef void (*dms_get_txn_dlock_by_rmid)(void *db_handle, unsigned short rmid, char *dlock, unsigned int dlock_len);
typedef void (*dms_get_rowid_by_rmid)(void *db_handle, unsigned short rmid, char rowid[DMS_ROWID_SIZE]);
typedef void (*dms_get_sql_from_session)(void *db_handle, unsigned short sid, char *sql_str, unsigned int sql_str_len);
typedef int (*dms_get_itl_lock_by_xid)(void *db_handle, char xid[DMS_XID_SIZE], char *ilock, unsigned int ilock_len);
typedef void (*dms_get_tlock_by_rm)(void *db_handle, unsigned short sid, unsigned short rmid, int type, char *tlock,
unsigned int tlock_len);
typedef int (*dms_get_tlock_by_tid)(void *db_handle, char *tlock, char *out_msg);
typedef void (*dms_get_tlock_by_tid_ack)(char *data, char *stack, char *w_marks, unsigned int *cnt);
typedef int (*dms_switchover_demote)(void *db_handle);
typedef int (*dms_switchover_promote_opengauss)(void *db_handle, unsigned char origPrimaryId);
typedef int (*dms_failover_promote_opengauss)(void *db_handle);
typedef int (*dms_reform_done_notify)(void *db_handle);
typedef int (*dms_log_wait_flush)(void *db_handle, unsigned long long lsn);
typedef int (*dms_wait_ckpt)(void *db_handle);
typedef void (*dms_verify_page)(dms_buf_ctrl_t *buf_ctrl, char *new_page);
typedef int (*dms_drc_validate)(void *db_handle);
typedef int (*dms_db_check_lock)(void *db_handle);
typedef int (*dms_cache_msg)(void *db_handle, char* msg);
typedef void (*dms_ckpt_enque_one_page)(void *db_handle, dms_buf_ctrl_t *ctrl);
typedef int (*dms_set_remove_point)(void *db_handle, unsigned int node_id, void *curr_point);
typedef int (*dms_get_enable_checksum)(void *db_handle);
typedef unsigned int (*dms_calc_page_checksum)(void *db_handle, dms_buf_ctrl_t *ctrl, unsigned int page_size);
typedef int (*dms_verify_page_checksum)(void *db_handle, dms_buf_ctrl_t *ctrl, unsigned int page_size, int cks);
typedef int (*dms_update_node_oldest_xmin)(void *db_handle, unsigned char inst_id, unsigned long long oldest_xmin);
typedef void (*dms_set_inst_behavior)(void *db_handle, dms_inst_behavior_t inst_behavior);
typedef int (*dms_db_prepare)(void *db_handle);
typedef void (*dms_get_buf_info)(char* resid, stat_buf_info_t *buf_info);
typedef int (*dms_end_xa)(void *db_handle, void *knl_xa_xid, unsigned long long flags, unsigned long long scn,
unsigned char is_commit);
typedef unsigned char (*dms_xa_inuse)(void *db_handle, void *knl_xa_xid);
typedef int (*dms_ddl_2phase_rcy)(void *db_handle, unsigned long long inst_remove_bitmap);
typedef int (*dms_reform_is_need_ddl_2phase_rcy)(void *db_handle);
typedef void (*dms_buf_ctrl_recycle)(void *db_handle);
typedef void *(*dms_malloc_prot_proc)(size_t size);
typedef void (*dms_free_prot_proc)(void *ptr);
typedef int (*dms_get_kernel_error_code)();
typedef int (*dms_invld_tlock_ownership)(void *db_handle, char *resid, unsigned char req_mode, unsigned char is_try);
typedef unsigned short (*dms_get_tlock_mode)(void *db_handle, char *resid);
typedef void (*dms_set_current_point)(void *db_handle);
typedef void (*dms_get_db_role)(void *db_handle, unsigned int *role);
typedef int (*dms_sync_node_lfn)(void *db_handle, int reform_type, unsigned long long online_list);
typedef void (*dms_reset_link)(void *db_handle);
typedef void (*dms_set_online_list)(void *db_handle, unsigned long long online_list, unsigned int reformer_id);
typedef int (*dms_standby_update_remove_node_ctrl)(void *db_handle, unsigned long long online_list);
typedef int (*dms_standby_stop_thread)(void *db_handle);
typedef int (*dms_standby_reload_node_ctrl)(void *db_handle);
typedef int (*dms_standby_stop_server)(void *db_handle);
typedef int (*dms_standby_resume_server)(void *db_handle);
typedef int (*dms_start_lrpl)(void *db_handle, int is_reformer);
typedef int (*dms_stop_lrpl)(void *db_handle, int is_reformer);
typedef int (*dms_calibrate_log_file)(void *db_handle);
typedef int (*dms_az_switchover_demote_phase1)(void *db_handle);
typedef int (*dms_az_switchover_demote_stop_ckpt)(void *db_handle);
typedef int (*dms_az_switchover_demote_update_node_ctrl)(void *db_handle, unsigned long long online_list);
typedef int (*dms_az_switchover_demote_change_role)(void *db_handle);
typedef int (*dms_az_switchover_demote_approve)(void *db_handle);
typedef int (*dms_az_switchover_demote_phase2)(void *db_handle);
typedef int (*dms_az_switchover_promote_prepare)(void *db_handle);
typedef int (*dms_az_switchover_promote_phase1)(void *db_handle);
typedef int (*dms_az_switchover_promote_switch_log)(void *db_handle);
typedef int (*dms_az_switchover_promote_phase2)(void *db_handle);
typedef int (*dms_az_promote_success)(void *db_handle);
typedef void (*dms_dyn_log)(void *db_handle, long long dyn_log_time);
typedef int (*dms_invld_alock_ownership)(void *db_handle, char *resid, unsigned char req_mode, unsigned char is_try);
typedef unsigned short (*dms_get_alock_mode)(void *db_handle, char *resid);
typedef int (*dms_get_alock_wait_info)(void *db_handle, char *resid, char *info_buf, unsigned int buf_len,
unsigned int *info_len);
typedef int (*dms_az_failover_promote_phase1)(void *db_handle);
typedef int (*dms_az_failover_promote_resetlog)(void *db_handle);
typedef int (*dms_az_failover_promote_phase2)(void *db_handle);
typedef int (*dms_check_shutdown_consistency)(void *db_handle, instance_list_t *old_remove);
typedef int (*dms_check_db_readwrite)(void *db_handle);
typedef unsigned int (*dms_check_is_maintain)(void);
typedef dms_session_e(*dms_get_session_type)(unsigned int sid);
typedef unsigned char(*dms_get_intercept_type)(unsigned int sid);
typedef unsigned char(*dms_db_in_rollback)(void *db_handle);
typedef char* (*dms_get_imcstore_delta)(unsigned int tableid, unsigned int rowgroupid,
unsigned char *bitmap, unsigned long long *maxSize);
typedef struct st_dms_callback {
dms_get_list_stable get_list_stable;
dms_save_list_stable save_list_stable;
dms_get_dms_status get_dms_status;
dms_set_dms_status set_dms_status;
dms_confirm_converting confirm_converting;
dms_flush_copy flush_copy;
dms_disk_lsn disk_lsn;
dms_recovery recovery;
dms_recovery_analyse recovery_analyse;
dms_dw_recovery dw_recovery;
dms_df_recovery df_recovery;
dms_space_reload space_reload;
dms_undo_init undo_init;
dms_tx_area_init tx_area_init;
dms_tx_area_load tx_area_load;
dms_tx_rollback_start tx_rollback_start;
dms_convert_to_readwrite convert_to_readwrite;
dms_tx_rollback_finish tx_rollback_finish;
dms_recovery_in_progress recovery_in_progress;
dms_drc_buf_res_rebuild dms_reform_rebuild_buf_res;
dms_drc_buf_res_rebuild_parallel dms_reform_rebuild_parallel;
dms_drc_tlock_rebuild_parallel dms_reform_rebuild_tlock_parallel;
dms_ctl_rcy_clean_parallel_t dms_ctl_rcy_clean_parallel;
dms_check_if_build_complete check_if_build_complete;
dms_check_if_restore_recover check_if_restore_recover;
dms_reset_user reset_user;
dms_drc_xa_res_rebuild dms_reform_rebuild_xa_res;
dms_reform_shrink_xa_rms dms_shrink_xa_rms;
dms_ckpt_unblock_rcy_local ckpt_unblock_rcy_local;
dms_drc_rebuild_parallel rebuild_alock_parallel;
dms_thread_init_t dms_thread_init;
dms_thread_deinit_t dms_thread_deinit;
dms_get_db_primary_id get_db_primary_id;
dms_opengauss_startup opengauss_startup;
dms_opengauss_recovery_standby opengauss_recovery_standby;
dms_opengauss_recovery_primary opengauss_recovery_primary;
dms_opengauss_ondemand_redo_buffer opengauss_ondemand_redo_buffer;
dms_reform_start_notify reform_start_notify;
dms_reform_set_dms_role reform_set_dms_role;
dms_inc_and_get_srsn inc_and_get_srsn;
dms_get_page_hash_val get_page_hash_val;
dms_get_page_lsn get_page_lsn;
dms_set_buf_load_status set_buf_load_status;
dms_update_global_scn update_global_scn;
dms_update_global_lsn update_global_lsn;
dms_update_page_lfn update_page_lfn;
dms_get_global_scn get_global_scn;
dms_get_global_lsn get_global_lsn;
dms_get_global_lfn get_global_lfn;
dms_get_page_lfn get_page_lfn;
dms_get_global_flushed_lfn get_global_flushed_lfn;
dms_read_local_page4transfer read_local_page4transfer;
dms_page_is_dirty page_is_dirty;
dms_leave_local_page leave_local_page;
dms_get_pageid get_pageid;
dms_get_page get_page;
dms_invalidate_page invalidate_page;
dms_get_db_handle get_db_handle;
dms_release_db_handle release_db_handle;
dms_get_wxid_from_cr_cursor get_wxid_from_cr_cursor;
dms_set_page_force_request set_page_force_request;
dms_get_entry_pageid_from_cr_cursor get_entry_pageid_from_cr_cursor;
dms_get_index_profile_from_cr_cursor get_index_profile_from_cr_cursor;
dms_get_xid_from_cr_cursor get_xid_from_cr_cursor;
dms_get_rowid_from_cr_cursor get_rowid_from_cr_cursor;
dms_heap_construct_cr_page heap_construct_cr_page;
dms_btree_construct_cr_page btree_construct_cr_page;
dms_check_heap_page_visible check_heap_page_visible;
dms_read_page read_page;
dms_leave_page leave_page;
dms_verify_page verify_page;
dms_stats_buf stats_buf;
dms_mem_alloc mem_alloc;
dms_mem_free mem_free;
dms_mem_reset mem_reset;
dms_drc_alloc drc_malloc_prot;
dms_drc_free drc_free_prot;
dms_process_broadcast process_broadcast;
dms_process_broadcast_ack process_broadcast_ack;
dms_get_txn_info get_txn_info;
dms_get_opengauss_xid_csn get_opengauss_xid_csn;
dms_get_opengauss_update_xid get_opengauss_update_xid;
dms_get_opengauss_txn_status get_opengauss_txn_status;
dms_opengauss_lock_buffer opengauss_lock_buffer;
dms_opengauss_do_ckpt_immediate opengauss_do_ckpt_immediate;
dms_reform_check_opengauss reform_check_opengauss;
dms_get_txn_snapshot get_txn_snapshot;
dms_get_opengauss_txn_snapshot get_opengauss_txn_snapshot;
dms_get_opengauss_txn_of_master get_opengauss_txn_of_master;
dms_get_opengauss_page_status get_opengauss_page_status;
dms_log_output log_output;
dms_log_flush log_flush;
dms_log_conditional_flush log_conditional_flush;
dms_lsnd_wait lsnd_wait;
dms_process_edp ckpt_edp;
dms_process_edp clean_edp;
dms_ckpt_session ckpt_session;
dms_clean_ctrl_edp clean_ctrl_edp;
dms_display_pageid display_pageid;
dms_display_xid display_xid;
dms_display_rowid display_rowid;
dms_check_session_invalid check_session_invalid;
dms_get_sid_by_rmid get_sid_by_rmid;
dms_get_txn_dlock_by_rmid get_txn_dlock_by_rmid;
dms_get_rowid_by_rmid get_rowid_by_rmid;
dms_get_sql_from_session get_sql_from_session;
dms_get_itl_lock_by_xid get_itl_lock_by_xid;
dms_get_tlock_by_rm get_tlock_by_rm;
dms_get_tlock_by_tid get_tlock_by_tid;
dms_get_tlock_by_tid_ack get_tlock_by_tid_ack;
dms_switchover_demote switchover_demote;
dms_switchover_promote_opengauss switchover_promote_opengauss;
dms_failover_promote_opengauss failover_promote_opengauss;
dms_set_switchover_result set_switchover_result;
dms_mount_to_recovery mount_to_recovery;
dms_reform_done_notify reform_done_notify;
dms_log_wait_flush log_wait_flush;
dms_wait_ckpt wait_ckpt;
dms_drc_validate drc_validate;
dms_db_check_lock db_check_lock;
dms_cache_msg cache_msg;
dms_ckpt_enque_one_page ckpt_enque_one_page;
dms_set_remove_point set_remove_point;
dms_get_enable_checksum get_enable_checksum;
dms_calc_page_checksum calc_page_checksum;
dms_verify_page_checksum verify_page_checksum;
dms_update_node_oldest_xmin update_node_oldest_xmin;
dms_set_inst_behavior set_inst_behavior;
dms_db_prepare db_prepare;
dms_get_buf_info get_buf_info;
dms_end_xa end_xa;
dms_xa_inuse xa_inuse;
dms_ddl_2phase_rcy ddl_2phase_rcy;
dms_reform_is_need_ddl_2phase_rcy reform_is_need_ddl_2phase_rcy;
dms_buf_ctrl_recycle buf_ctrl_recycle;
dms_malloc_prot_proc dms_malloc_prot;
dms_free_prot_proc dms_free_prot;
dms_get_kernel_error_code db_get_kernel_error_code;
dms_invld_tlock_ownership invld_tlock_ownership;
dms_invld_alock_ownership invld_alock_ownership;
dms_get_alock_mode get_alock_mode;
dms_get_tlock_mode get_tlock_mode;
dms_set_current_point set_current_point;
dms_update_node_lfn update_node_lfn;
dms_update_node_lfns update_node_lfns;
dms_get_node_lfns get_node_lfns;
dms_update_replay_lfns update_replay_lfns;
dms_get_replay_lfns get_replay_lfns;
dms_get_db_role get_db_role;
dms_sync_node_lfn sync_node_lfn;
dms_reset_link reset_link;
dms_set_online_list set_online_list;
dms_standby_update_remove_node_ctrl standby_update_remove_node_ctrl;
dms_standby_stop_thread standby_stop_thread;
dms_standby_reload_node_ctrl standby_reload_node_ctrl;
dms_standby_stop_server standby_stop_server;
dms_standby_resume_server standby_resume_server;
dms_start_lrpl start_lrpl;
dms_stop_lrpl stop_lrpl;
dms_calibrate_log_file calibrate_log_file;
dms_az_switchover_demote_phase1 az_switchover_demote_phase1;
dms_az_switchover_demote_stop_ckpt az_switchover_demote_stop_ckpt;
dms_az_switchover_demote_update_node_ctrl az_switchover_demote_update_node_ctrl;
dms_az_switchover_demote_change_role az_switchover_demote_change_role;
dms_az_switchover_demote_approve az_switchover_demote_approve;
dms_az_switchover_demote_phase2 az_switchover_demote_phase2;
dms_az_switchover_promote_prepare az_switchover_promote_prepare;
dms_az_switchover_promote_phase1 az_switchover_promote_phase1;
dms_az_switchover_promote_switch_log az_switchover_promote_switch_log;
dms_az_switchover_promote_phase2 az_switchover_promote_phase2;
dms_az_promote_success az_promote_success;
dms_az_failover_promote_phase1 az_failover_promote_phase1;
dms_az_failover_promote_resetlog az_failover_promote_resetlog;
dms_az_failover_promote_phase2 az_failover_promote_phase2;
dms_dyn_log dyn_log;
dms_get_alock_wait_info get_alock_wait_info;
dms_check_shutdown_consistency check_shutdown_consistency;
dms_check_db_readwrite check_db_readwrite;
dms_check_is_maintain check_is_maintain;
dms_get_session_type get_session_type;
dms_get_intercept_type get_intercept_type;
dms_db_in_rollback db_in_rollback;
dms_get_imcstore_delta get_imcstore_delta;
} dms_callback_t;
typedef struct st_dms_instance_net_addr {
unsigned int inst_id;
char ip[DMS_MAX_IP_LEN];
char secondary_ip[DMS_MAX_IP_LEN];
unsigned short port;
unsigned char need_connect;
unsigned char reserved[1];
} dms_instance_net_addr_t;
Must stay in sync with MES_SHM_UB_QUEUE_NUM (MES_PRIORITY_CEIL + 1) in mes_interface.h. */
#define DMS_SHM_UB_COMM_QUEUE_NUM 9
typedef struct st_dms_profile {
unsigned int inst_id;
unsigned long long inst_map;
dms_callback_t callback;
unsigned long long data_buffer_size;
unsigned int channel_cnt;
unsigned int work_thread_cnt;
unsigned int max_session_cnt;
unsigned short mfc_tickets;
unsigned short mfc_max_wait_ticket_time;
unsigned int page_size;
unsigned long long recv_msg_buf_size;
unsigned int log_level;
unsigned long long log_max_file_size;
unsigned int log_backup_file_count;
dms_conn_mode_t pipe_type;
unsigned int inst_cnt;
dms_instance_net_addr_t inst_net_addr[DMS_MAX_INSTANCES];
unsigned int conn_created_during_init : 1;
unsigned int resource_catalog_centralized : 1;
unsigned int time_stat_enabled : 1;
unsigned int reserved : 29;
unsigned char elapsed_switch;
unsigned char rdma_rpc_use_busypoll;
unsigned char rdma_rpc_is_bind_core;
unsigned char rdma_rpc_bind_core_start;
unsigned char rdma_rpc_bind_core_end;
int mes_shm_ub_comm_cpu_ids[DMS_SHM_UB_COMM_QUEUE_NUM];
char ock_log_path[DMS_OCK_LOG_PATH_LEN];
unsigned char enable_scrlock;
unsigned int primary_inst_id;
unsigned char enable_ssl;
unsigned int scrlock_log_level;
unsigned char enable_scrlock_worker_bind_core;
unsigned int scrlock_worker_cnt;
unsigned char scrlock_worker_bind_core_start;
unsigned char scrlock_worker_bind_core_end;
unsigned int scrlock_server_port;
unsigned char enable_scrlock_server_sleep_mode;
unsigned char scrlock_server_bind_core_start;
unsigned char scrlock_server_bind_core_end;
unsigned char parallel_thread_num;
unsigned int max_wait_time;
char gsdb_home[DMS_LOG_PATH_LEN];
unsigned char enable_mes_task_threadpool;
unsigned int mes_task_worker_max_cnt;
unsigned int max_alive_time_for_abnormal_status;
unsigned char enable_dyn_trace;
unsigned char enable_reform_trace;
unsigned long long drc_buf_size;
unsigned int spin_sleep_time_nsec;
} dms_profile_t;
typedef struct st_logger_param {
unsigned int log_level;
unsigned long long log_max_file_size;
unsigned int log_backup_file_count;
char log_home[DMS_LOG_PATH_LEN];
} logger_param_t;
#define DMS_BUF_CTRL_IS_OWNER(ctrl) ((ctrl)->lock_mode == DMS_LOCK_EXCLUSIVE || \
((ctrl)->lock_mode == DMS_LOCK_SHARE))
#define DMS_BUF_CTRL_NOT_LOCK(ctrl) ((ctrl)->lock_mode == DMS_LOCK_NULL)
typedef enum en_dms_info_id {
DMS_INFO_REFORM_CURRENT = 0,
DMS_INFO_REFORM_LAST = 1,
} dms_info_id_e;
typedef struct st_wait_cmd_stat_result {
char name[DMS_MAX_NAME_LEN];
char p1[DMS_MAX_NAME_LEN];
char wait_class[DMS_MAX_NAME_LEN];
unsigned long long wait_count;
unsigned long long wait_time;
unsigned char is_valid;
} wait_cmd_stat_result_t;
typedef struct st_drc_local_lock_res_result {
char lock_id[DMS_MAX_NAME_LEN];
unsigned char releasing;
unsigned char unused;
unsigned short shared_count;
unsigned short stat;
unsigned short sid;
unsigned char lock_mode;
unsigned char is_valid;
} drc_local_lock_res_result_t;
typedef enum en_reform_callback_stat {
REFORM_CALLBACK_STAT_BUCKET_LOCK = 0,
REFORM_CALLBACK_STAT_SS_READ_LOCK,
REFORM_CALLBACK_STAT_SS_CKPT_COPY_LOCK,
REFORM_CALLBACK_STAT_REBUILD_TLOCK_REMOTE,
REFORM_CALLBACK_STAT_GET_DISK_LSN,
REFORM_CALLBACK_STAT_DRC_EXIST,
REFORM_CALLBACK_STAT_CLEAN_EDP,
REFORM_CALLBACK_STAT_NEED_NOT_REBUILD,
REFORM_CALLBACK_STAT_EXPIRE,
REFORM_MES_TASK_STAT_CONFIRM_OWNER_BUCKET_LOCK,
REFORM_MES_TASK_STAT_CONFIRM_OWNER_GET_DISK_LSN,
REFORM_MES_TASK_STAT_CONFIRM_CVT_BUCKET_LOCK,
REFORM_MES_TASK_STAT_CONFIRM_CVT_SS_READ_LOCK,
REFORM_CALLBACK_STAT_REBUILD_ALOCK_LOCAL,
REFORM_CALLBACK_STAT_REBUILD_DRC_ALOCK_REMOTE,
REFORM_CALLBACK_STAT_OPEN_DATAFILE,
REFORM_CALLBACK_STAT_GET_DATAFILE_SIZE,
REFORM_CALLBACK_STAT_OPEN_CTRLFILE,
REFORM_CALLBACK_STAT_GET_CTRLFILE_SIZE,
REFORM_CALLBACK_STAT_OPEN_DW_FILE,
REFORM_CALLBACK_STAT_READ_DW_FILE,
REFORM_CALLBACK_STAT_CHECK_REDO,
REFORM_CALLBACK_STAT_SPC_DW_FLUSH,
REFORM_CALLBACK_STAT_COUNT
} reform_callback_stat_e;
typedef enum en_db_call_dms_trigger_fi_point_name {
DB_FI_CHANGE_STATUS_AFTER_TRANSFER_PAGE = 10800,
DB_FI_ENTRY_END = 11024,
} db_call_dms_trigger_fi_point_name;
typedef enum en_dms_call_db_trigger_fi_point_name {
DMS_FI_TRIGGER_IN_DB_ENTRY_BEGIN = 800,
DMS_FI_ENTRY_END
} dms_call_db_trigger_fi_point_name;
typedef struct st_dms_tlock_info {
dms_drid_t resid;
unsigned char lock_mode;
unsigned char unused[3];
} dms_tlock_info_t;
typedef struct thread_info {
char thread_name[DMS_MAX_NAME_LEN];
void *thread_info;
} thread_info_t;
typedef struct thread_set {
thread_info_t threads[MAX_DMS_THREAD_NUM];
int thread_count;
} thread_set_t;
typedef struct st_dms_alock_info {
alockid_t alockid;
unsigned char lock_mode;
unsigned char unused[3];
} dms_alock_info_t;
typedef struct st_driver_ping_info {
unsigned long long rw_bitmap;
dms_role_t dms_role;
unsigned long long major_version;
unsigned long long minor_version;
} driver_ping_info_t;
typedef struct st_mes_msg_info {
unsigned int cmd;
unsigned short sid;
} mes_msg_info_t;
typedef struct st_mes_worker_msg_stats_info {
unsigned char is_active;
unsigned int tid;
int priority;
unsigned long long get_msgitem_time;
unsigned long long msg_ruid;
unsigned int msg_src_inst;
mes_msg_info_t msg_info;
char msg_cmd_desc[DMS_CMD_DESC_LEN];
} mes_worker_msg_stats_info_t;
typedef struct st_mes_task_priority_stats_info {
int priority;
unsigned int worker_num;
unsigned long long inqueue_msgitem_num;
unsigned long long finished_msgitem_num;
unsigned long long msgitem_free_num;
} mes_task_priority_stats_info_t;
typedef struct st_mem_info_stat {
const char *area;
unsigned long long total;
unsigned long long used;
double used_percentage;
} mem_info_stat_t;
typedef enum en_dms_param_index {
DMS_PARAM_SS_INTERCONNECT_URL = 0,
DMS_PARAM_SS_ELAPSED_SWITCH,
DMS_PARAM_SS_DRC_MEM_MAX_SIZE,
#if defined(_DEBUG) || defined(DEBUG) || defined(DB_DEBUG_VERSION)
DMS_PARAM_SS_FI_PACKET_LOSS_ENTRIES,
DMS_PARAM_SS_FI_NET_LATENCY_ENTRIES,
DMS_PARAM_SS_FI_CPU_LATENCY_ENTRIES,
DMS_PARAM_SS_FI_PROCESS_FAULT_ENTRIES,
DMS_PARAM_SS_FI_CUSTOM_FAULT_ENTRIES,
DMS_PARAM_SS_FI_PACKET_LOSS_PROB,
DMS_PARAM_SS_FI_NET_LATENCY_MS,
DMS_PARAM_SS_FI_CPU_LATENCY_MS,
DMS_PARAM_SS_FI_PROCESS_FAULT_PROB,
DMS_PARAM_SS_FI_CUSTOM_FAULT_PARAM,
#endif
DMS_PARAM_SS_COUNT,
} dms_param_index;
#ifdef __cplusplus
}
#endif
#endif