diff --git a/src/common/backend/catalog/builtin_funcs.ini b/src/common/backend/catalog/builtin_funcs.ini index 7c2a8e7665309506fa202668fff06358c96e8852..70fa85c7161fc44c85169d34a63c90b98d1779cf 100644 --- a/src/common/backend/catalog/builtin_funcs.ini +++ b/src/common/backend/catalog/builtin_funcs.ini @@ -3759,7 +3759,7 @@ ), AddFuncGroup( "gs_get_preparse_location", 1, - AddBuiltinFunc(_0(2874), _1("gs_get_preparse_location"), _2(0), _3(false), _4(true), _5(gs_get_preparse_location), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(10), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(3, 25, 25, 25), _22(3, 'o', 'o', 'o'), _23(3, "preparse_start_location", "preparse_end_location", "last_valid_record"), _24(NULL), _25("gs_get_preparse_location"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("statistics: information about WAL locations"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)) + AddBuiltinFunc(_0(2874), _1("gs_get_preparse_location"), _2(0), _3(false), _4(true), _5(gs_get_preparse_location), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(10), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(3, 25, 25, 25), _22(3, 'o', 'o', 'o'), _23(3, "preparse_start_location", "preparse_end_location", "last_valid_record"), _24(NULL), _25("gs_get_preparse_location"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33("statistics: information about WAL locations"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)) ), AddFuncGroup( "gs_get_standby_cluster_barrier_status", 1, @@ -8673,8 +8673,8 @@ ), AddFuncGroup( "pg_prepared_statement", 2, - AddBuiltinFunc(_0(2510), _1("pg_prepared_statement"), _2(0), _3(true), _4(true), _5(pg_prepared_statement), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(5, 25, 25, 1184, 2211, 16), _22(5, 'o', 'o', 'o', 'o', 'o'), _23(5, "name", "statement", "prepare_time", "parameter_types", "from_sql"), _24(NULL), _25("pg_prepared_statement"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(true), _33("get the prepared statements for this session"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)), - AddBuiltinFunc(_0(3702), _1("pg_prepared_statement"), _2(1), _3(true), _4(true), _5(pg_prepared_statement_global), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 20), _21(8, 20, 20, 25, 25, 25, 1184, 2211, 16), _22(8, 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(8,"in_sessionid", "sessionid", "username", "name", "statement", "prepare_time", "parameter_types", "from_sql"), _24(NULL), _25("pg_prepared_statement_global"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(true), _33("get the prepared statements for specified session"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)) + AddBuiltinFunc(_0(2510), _1("pg_prepared_statement"), _2(0), _3(true), _4(true), _5(pg_prepared_statement), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(5, 25, 25, 1184, 2211, 16), _22(5, 'o', 'o', 'o', 'o', 'o'), _23(5, "name", "statement", "prepare_time", "parameter_types", "from_sql"), _24(NULL), _25("pg_prepared_statement"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(true), _33("get the prepared statements for this session"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)), + AddBuiltinFunc(_0(3702), _1("pg_prepared_statement"), _2(1), _3(true), _4(true), _5(pg_prepared_statement_global), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 20), _21(8, 20, 20, 25, 25, 25, 1184, 2211, 16), _22(8, 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(8,"in_sessionid", "sessionid", "username", "name", "statement", "prepare_time", "parameter_types", "from_sql"), _24(NULL), _25("pg_prepared_statement_global"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(true), _33("get the prepared statements for specified session"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)) ), AddFuncGroup( "pg_prepared_xact", 1, diff --git a/src/gausskernel/ddes/adapter/ss_dms_callback.cpp b/src/gausskernel/ddes/adapter/ss_dms_callback.cpp index 7c172d5585781e53ceee4d8b3718bf87cd09de5e..6412121ee8429522ae3e7a61c7d85d9540403e1f 100644 --- a/src/gausskernel/ddes/adapter/ss_dms_callback.cpp +++ b/src/gausskernel/ddes/adapter/ss_dms_callback.cpp @@ -57,6 +57,8 @@ #include "storage/ipc.h" #include "utils/elog.h" +XLogRecPtr lastLsn = InvalidXLogRecPtr; + static void ReleaseResource(); static inline void IniRedoInfo() @@ -1429,6 +1431,8 @@ static int32 SSBufRebuildOneDrcInternal(BufferDesc *buf_desc, unsigned char thre buf_desc->tag.rnode.bucketNode, buf_desc->tag.forkNum, buf_desc->tag.blockNum))); return ret; } + int threadIndex = (int)thread_index; + g_instance.dms_cxt.reform_check_status[threadIndex] = buf_desc->buf_id; return DMS_SUCCESS; } @@ -1484,6 +1488,7 @@ static int32 CBBufRebuildDrcInternal(int begin, int len, unsigned char thread_in ereport(LOG, (errmodule(MOD_DMS), errmsg("[SS reform] rebuild page: success." "rebuild buf thread_index:%d, buf_if start from:%d to:%d, max_buf_id:%d.", (int)thread_index, begin, end, (TOTAL_BUFFER_NUM - 1)))); + g_instance.dms_cxt.reform_check_status[thread_index] = InvalidBuffer; return GS_SUCCESS; } @@ -1692,7 +1697,7 @@ static int CBRecoveryPrimary(void *db_handle, int inst_id) return GS_SUCCESS; } -static int CBFlushCopy(void *db_handle, char *pageid) +static int CBFlushCopy(void *db_handle, char *pageid, unsigned char thread_index) { /* * only two occasions @@ -1739,6 +1744,8 @@ static int CBFlushCopy(void *db_handle, char *pageid) Assert(0); } } + int threadIndex = (int)thread_index; + g_instance.dms_cxt.reform_check_status[threadIndex] = buffer; /* * when remote DB instance reboot, this round reform fail @@ -1767,6 +1774,7 @@ static int CBFlushCopy(void *db_handle, char *pageid) } LockBuffer(buffer, BUFFER_LOCK_UNLOCK); ReleaseBuffer(buffer); + g_instance.dms_cxt.reform_check_status[threadIndex] = buffer; return GS_SUCCESS; } @@ -2025,6 +2033,22 @@ static void FailoverStartNotify(dms_reform_start_context_t *rs_cxt) } } +void InitReformCheckStatus() +{ + int max_threads = g_instance.attr.attr_storage.dms_attr.parallel_thread_num; + + g_instance.dms_cxt.reform_check_status = (int*)palloc(max_threads * sizeof(int)); + for (int i = 0; i < max_threads; i++) { + g_instance.dms_cxt.reform_check_status[i] = InvalidBuffer; + } + + t_thrd.dms_cxt.reform_check_status = (int*)palloc(max_threads * sizeof(int)); + for (int i = 0; i < max_threads; i++) { + t_thrd.dms_cxt.reform_check_status[i] = InvalidBuffer; + } + +} + static void CBReformStartNotify(void *db_handle, dms_reform_start_context_t *rs_cxt) { ereport(LOG, (errmodule(MOD_DMS), errmsg("[SS reform] reform start enter: pmState=%d, SSClusterState=%d, demotion=%d-%d, rec=%d", @@ -2052,6 +2076,7 @@ static void CBReformStartNotify(void *db_handle, dms_reform_start_context_t *rs_ g_instance.dms_cxt.SSRecoveryInfo.startup_need_exit_normally = false; g_instance.dms_cxt.resetSyscache = true; g_instance.dms_cxt.SSRecoveryInfo.in_failover = false; + InitReformCheckStatus(); FailoverStartNotify(rs_cxt); reform_info->reform_start_time = GetCurrentTimestamp(); @@ -2358,6 +2383,72 @@ int CBBufCtrlRcyClean(void *db_handle, unsigned char thread_index, unsigned char return GS_SUCCESS; } +static void CBReformHealthCheck(void *db_handle, unsigned int current_step, unsigned int current_role, long long dyn_log_time) +{ + XLogRecPtr currentLsn = XLogSegSize + SizeOfXLogLongPHD; + + if (current_step == DMS_REFORM_STEP_DONE) { + if (g_instance.dms_cxt.SSXminInfo.snapshot_available) { + return; + } + if (dyn_log_time < DMS_REFORM_HEALTH_TRIGGER_DYN * MICROSECS_PER_SECOND * 2) { + return; + } + /*print stack and exit*/ + print_all_stack(); + DmsThreadDeinit(); + } + + if (current_step == DMS_REFORM_STEP_RECOVERY) { + if (dyn_log_time < DMS_REFORM_HEALTH_TRIGGER_DYN * MICROSECS_PER_SECOND * 5) { + return; + } + if (XLogRecPtrIsInvalid(lastLsn) || XLogRecPtrIsInvalid(currentLsn)) { + return; + } + if (lastLsn == currentLsn) { + print_all_stack(); + DmsThreadDeinit(); + } + lastLsn = currentLsn; + } + + if (current_step == DMS_REFORM_STEP_REBUILD) { + /*check buffer_id*/ + if (dyn_log_time < DMS_REFORM_HEALTH_TRIGGER_DYN * MICROSECS_PER_SECOND * 5) { + return; + } + for (uint32 i = 0; i < g_instance.attr.attr_storage.dms_attr.parallel_thread_num; i++) { + if (BufferIsInvalid(t_thrd.dms_cxt.reform_check_status[i]) || BufferIsInvalid(g_instance.dms_cxt.reform_check_status[i])) { + continue; + } + + if (t_thrd.dms_cxt.reform_check_status[i] == g_instance.dms_cxt.reform_check_status[i]) { + print_all_stack(); + DmsThreadDeinit(); + } + t_thrd.dms_cxt.reform_check_status[i] = g_instance.dms_cxt.reform_check_status[i]; + } + } + + if (current_step == DMS_REFORM_STEP_REPAIR) { + /*check buffer_id*/ + if (dyn_log_time < DMS_REFORM_HEALTH_TRIGGER_DYN * MICROSECS_PER_SECOND * 5) { + return; + } + for (uint32 i = 0; i < g_instance.attr.attr_storage.dms_attr.parallel_thread_num; i++) { + if (BufferIsInvalid(t_thrd.dms_cxt.reform_check_status[i]) || BufferIsInvalid(g_instance.dms_cxt.reform_check_status[i])) { + continue; + } + if (t_thrd.dms_cxt.reform_check_status[i] == g_instance.dms_cxt.reform_check_status[i]) { + print_all_stack(); + DmsThreadDeinit(); + } + t_thrd.dms_cxt.reform_check_status[i] = g_instance.dms_cxt.reform_check_status[i]; + } + } +} + void DmsInitCallback(dms_callback_t *callback) { // used in reform @@ -2428,4 +2519,5 @@ void DmsInitCallback(dms_callback_t *callback) callback->dms_thread_deinit = DmsThreadDeinit; callback->opengauss_do_ckpt_immediate = CBDoCheckpointImmediately; callback->dms_ctl_rcy_clean_parallel = CBBufCtrlRcyClean; + callback->reform_check_opengauss = CBReformHealthCheck; } diff --git a/src/include/ddes/dms/dms_api.h b/src/include/ddes/dms/dms_api.h index 33feb6447c8a1e523c373b75d9f8a1cda076fd18..1403f2a30be919ff30ccda7028809cfaa9b646c3 100644 --- a/src/include/ddes/dms/dms_api.h +++ b/src/include/ddes/dms/dms_api.h @@ -816,7 +816,7 @@ 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); +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); @@ -931,6 +931,7 @@ 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); // for ssl typedef int(*dms_decrypt_pwd_t)(const char *cipher, unsigned int len, char *plain, unsigned int size); @@ -1107,6 +1108,7 @@ typedef struct st_dms_callback { dms_opengauss_lock_buffer opengauss_lock_buffer; dms_opengauss_do_ckpt_immediate opengauss_do_ckpt_immediate; dms_get_txn_snapshot get_txn_snapshot; + dms_reform_check_opengauss reform_check_opengauss; 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; diff --git a/src/include/ddes/dms/ss_dms_callback.h b/src/include/ddes/dms/ss_dms_callback.h index 1821f9ee5ad205fa36a08bed50d19d78362e3583..2e761a0ec10a9beb619d8b5c5c0d2296524d975e 100644 --- a/src/include/ddes/dms/ss_dms_callback.h +++ b/src/include/ddes/dms/ss_dms_callback.h @@ -33,6 +33,8 @@ #define DMS_LOGGER_BUFFER_SIZE 2048 #define REFORM_START_CLEAN_TICKS 100 #define FAILOVER_TIME_CONVERT 1000000 +#define DMS_REFORM_HEALTH_TRIGGER_DYN 60 +#define MICROSECS_PER_SECOND (1000000) typedef struct st_ss_fake_seesion_context { slock_t lock; diff --git a/src/include/ddes/dms/ss_reform_common.h b/src/include/ddes/dms/ss_reform_common.h index 86ad1e84618e069d73af1254206759752526ab2d..166d078a90176c486e0dc4af16bfd25d740978c1 100644 --- a/src/include/ddes/dms/ss_reform_common.h +++ b/src/include/ddes/dms/ss_reform_common.h @@ -40,10 +40,91 @@ #define SS_RTO_LIMIT (10 * 1000 * 1000) /* 10 sec */ +extern XLogRecPtr lastLsn; + typedef struct SSBroadcastCancelTrx { SSBroadcastOp type; // must be first } SSBroadcastCancelTrx; +// Notice: every step should not be dependent on its Value, Value is only used for distinguish different step +typedef enum en_reform_step { + DMS_REFORM_STEP_DONE, + DMS_REFORM_STEP_PREPARE, // just sync wait reformer. do nothing + DMS_REFORM_STEP_START, // no need to set last_fail before this step + DMS_REFORM_STEP_DISCONNECT, + DMS_REFORM_STEP_RECONNECT, + DMS_REFORM_STEP_DRC_CLEAN, + DMS_REFORM_STEP_FULL_CLEAN, + DMS_REFORM_STEP_MIGRATE, + DMS_REFORM_STEP_REBUILD, + DMS_REFORM_STEP_REMASTER, + DMS_REFORM_STEP_REPAIR, + DMS_REFORM_STEP_SWITCH_LOCK, + DMS_REFORM_STEP_SWITCHOVER_DEMOTE, + DMS_REFORM_STEP_RECOVERY, + DMS_REFORM_STEP_RECOVERY_OPENGAUSS, + DMS_REFORM_STEP_DRC_RCY_CLEAN, + DMS_REFORM_STEP_CTL_RCY_CLEAN, + DMS_REFORM_STEP_TXN_DEPOSIT, + DMS_REFORM_STEP_ROLLBACK_PREPARE, + DMS_REFORM_STEP_ROLLBACK_START, + DMS_REFORM_STEP_SUCCESS, + DMS_REFORM_STEP_SELF_FAIL, // cause by self + DMS_REFORM_STEP_REFORM_FAIL, // cause by notification from reformer + DMS_REFORM_STEP_SYNC_WAIT, // tips: can not use before reconnect + DMS_REFORM_STEP_PAGE_ACCESS, // set page accessible + DMS_REFORM_STEP_DW_RECOVERY, // recovery the dw area + DMS_REFORM_STEP_DF_RECOVERY, + DMS_REFORM_STEP_SPACE_RELOAD, + DMS_REFORM_STEP_DRC_ACCESS, // set drc accessible + DMS_REFORM_STEP_DRC_INACCESS, // set drc inaccessible + DMS_REFORM_STEP_SWITCHOVER_PROMOTE_OPENGAUSS, + DMS_REFORM_STEP_FAILOVER_PROMOTE_OPENGAUSS, + DMS_REFORM_STEP_STARTUP_OPENGAUSS, // for opengauss + DMS_REFORM_STEP_DONE_CHECK, + DMS_REFORM_STEP_SET_PHASE, // for Gauss100 + DMS_REFORM_STEP_WAIT_DB, // for Gauss100 + DMS_REFORM_STEP_FILE_UNBLOCKED, // for Gauss100 + DMS_REFORM_STEP_FILE_BLOCKED, // for Gauss100 + DMS_REFORM_STEP_UPDATE_SCN, + DMS_REFORM_STEP_WAIT_CKPT, // for Gauss100 + DMS_REFORM_STEP_DRC_VALIDATE, + DMS_REFORM_STEP_LOCK_INSTANCE, // get X mode instance lock for reform + DMS_REFORM_STEP_PUSH_GCV_AND_UNLOCK, // push GCV in X instance lock, then unlock X + DMS_REFORM_STEP_SET_REMOVE_POINT, // for Gauss100, set rcy point who is removed node after ckpt + DMS_REFORM_STEP_RESET_USER, + DMS_REFORM_STEP_RECOVERY_ANALYSE, // for Gauss100, set rcy flag for pages which in redo log + DMS_REFORM_STEP_XA_DRC_ACCESS, // for Gauss100, set xa drc access + DMS_REFORM_STEP_DDL_2PHASE_DRC_ACCESS, + DMS_REFORM_STEP_DDL_2PHASE_RCY, + DMS_REFORM_STEP_DRC_LOCK_ALL_ACCESS, + DMS_REFORM_STEP_SET_CURRENT_POINT, + DMS_REFORM_STEP_STANDBY_UPDATE_REMOVE_NODE_CTRL, + DMS_REFORM_STEP_STANDBY_STOP_THREAD, + DMS_REFORM_STEP_STANDBY_RELOAD_NODE_CTRL, + DMS_REFORM_STEP_STANDBY_SET_ONLINE_LIST, + DMS_REFORM_STEP_STOP_SERVER, + DMS_REFORM_STEP_RESUME_SERVER_FOR_REFORMER, + DMS_REFORM_STEP_RESUME_SERVER_FOR_PARTNER, + DMS_REFORM_STEP_START_LRPL, // for Gauss100, start log replay + DMS_REFORM_STEP_STOP_LRPL, // for Gauss100, stop log replay + + DMS_REFORM_STEP_AZ_SWITCH_DEMOTE_PHASE1, // for Gauss100, AZ SWITCHOVER primary to standby + DMS_REFORM_STEP_AZ_SWITCH_DEMOTE_STOP_CKPT, + DMS_REFORM_STEP_AZ_SWITCH_DEMOTE_UPDATE_NODE_CTRL, + DMS_REFORM_STEP_AZ_SWITCH_DEMOTE_CHANGE_ROLE, + DMS_REFORM_STEP_AZ_SWITCH_DEMOTE_APPROVE, // for Gauss100, AZ SWITCHOVER primary to standby + DMS_REFORM_STEP_AZ_SWITCH_DEMOTE_PHASE2, // for Gauss100, AZ SWITCHOVER primary to standby + DMS_REFORM_STEP_AZ_SWITCH_PROMOTE_PREPARE, // for Gauss100, AZ SWITCHOVER standby to primary + DMS_REFORM_STEP_AZ_SWITCH_PROMOTE_PHASE1, // for Gauss100, AZ SWITCHOVER standby to primary + DMS_REFORM_STEP_AZ_SWITCH_PROMOTE_PHASE2, // for Gauss100, AZ SWITCHOVER standby to primary + DMS_REFORM_STEP_AZ_FAILOVER_PROMOTE_PHASE1, // for Gauss100, AZ FAILOVER standby to primary + DMS_REFORM_STEP_AZ_FAILOVER_PROMOTE_RESETLOG, // for Gauss100, AZ FAILOVER standby to primary + DMS_REFORM_STEP_AZ_FAILOVER_PROMOTE_PHASE2, // for Gauss100, AZ FAILOVER standby to primary + DMS_REFORM_STEP_RELOAD_TXN, + DMS_REFORM_STEP_COUNT +} reform_step_t; + int SSReadXlogInternal(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, XLogRecPtr targetRecPtr, char *buf, int readLen); XLogReaderState *SSXLogReaderAllocate(XLogPageReadCB pagereadfunc, void *private_data, Size alignedSize); diff --git a/src/include/knl/knl_instance.h b/src/include/knl/knl_instance.h index c1380f585b378e247c293a909024a34e4cb4298d..081b43a2bb64dee1a6ab4af52eac644a1960505e 100755 --- a/src/include/knl/knl_instance.h +++ b/src/include/knl/knl_instance.h @@ -1371,6 +1371,7 @@ typedef struct knl_g_dms_context { char dmsInstAddr[MAX_REPLNODE_NUM][DMS_MAX_IP_LEN]; char conninfo[MAXPGPATH]; ss_dfx_stats_t SSDFxStats; + int* reform_check_status; ss_xmin_info_t SSXminInfo; ss_fake_seesion_context_t SSFakeSessionCxt; } knl_g_dms_context; diff --git a/src/include/knl/knl_thread.h b/src/include/knl/knl_thread.h index f8d497f1dd5a09af3032f76ccd3db807fb8d2251..65cf49e9bfd96b5d46a5d59d0a20a75bc32c4818 100755 --- a/src/include/knl/knl_thread.h +++ b/src/include/knl/knl_thread.h @@ -3453,6 +3453,7 @@ typedef struct knl_t_dms_context { PinnedBufferItem* pincount_array; bool need_check_pincount; bool in_ondemand_redo; + int* reform_check_status; } knl_t_dms_context; typedef struct knl_t_dms_auxiliary_context {