diff --git a/src/gausskernel/cbb/instruments/event/instr_waitevent.cpp b/src/gausskernel/cbb/instruments/event/instr_waitevent.cpp index ffcaeb911..c0fdaab09 100644 --- a/src/gausskernel/cbb/instruments/event/instr_waitevent.cpp +++ b/src/gausskernel/cbb/instruments/event/instr_waitevent.cpp @@ -34,6 +34,7 @@ #include "workload/statctl.h" #include "instruments/instr_statement.h" #include "instruments/instr_waitevent.h" +#include "ddes/dms/ss_dms.h" const int MASK_CLASS_ID = 0xFF000000; const int MASK_EVENT_ID = 0x00FFFFFF; @@ -110,6 +111,13 @@ static uint32 get_event_id(uint32 wait_event_info) eventId = UINT32_MAX; } break; + case PG_WAIT_DMS: + eventId = (WaitEventDMS)wait_event_info - (WaitEventDMS)WAIT_EVENT_IDLE_WAIT; + if (eventId >= DMS_EVENT_NUM) { + ereport(LOG, (errmsg("dms eventId %u", wait_event_info))); + eventId = UINT32_MAX; + } + break; default: eventId = UINT32_MAX; break; @@ -159,6 +167,11 @@ void InstrWaitEventInitLastUpdated(PgBackendStatus* current_entry, TimestampTz c current_entry->waitInfo.event_info.io_info[i].last_updated = current_time; } + /* dms event */ + for (i = 0; i < DMS_EVENT_NUM; i++) { + current_entry->waitInfo.event_info.dms_info[i].last_updated = current_time; + } + /* lock info */ for (i = 0; i < LOCK_EVENT_NUM; i++) { current_entry->waitInfo.event_info.lock_info[i].last_updated = current_time; @@ -239,6 +252,14 @@ void UpdateWaitEventStat(WaitInfo* instrWaitInfo, uint32 wait_event_info, int64 instrWaitInfo->event_info.io_info[eventId].counter++; } break; + case PG_WAIT_DMS: + UpdateMinValue(duration, + &(instrWaitInfo->event_info.dms_info[eventId].min_duration)); + instrWaitInfo->event_info.dms_info[eventId].counter++; + instrWaitInfo->event_info.dms_info[eventId].total_duration += duration; + UpdateMaxValue(duration, &(instrWaitInfo->event_info.dms_info[eventId].max_duration)); + instrWaitInfo->event_info.dms_info[eventId].last_updated = currentTime; + break; default: break; } @@ -287,6 +308,21 @@ void CollectWaitInfo(WaitInfo* gsInstrWaitInfo, WaitStatusInfo status_info, Wait } } + /* update Dms Event wait info */ + for (int i = 0; i < DMS_EVENT_NUM; i++) { + WaitStatisticsInfo *dms_info = &gsInstrWaitInfo->event_info.dms_info[i]; + + update_max_last_updated(dms_info, event_info.dms_info[i].last_updated); + if (event_info.dms_info[i].counter != 0) { + updateMinValueForAtomicType(event_info.dms_info[i].min_duration, + &dms_info->min_duration); + updateMaxValueForAtomicType(event_info.dms_info[i].max_duration, &dms_info->max_duration); + dms_info->counter += event_info.dms_info[i].counter; + dms_info->total_duration += event_info.dms_info[i].total_duration; + dms_info->avg_duration = dms_info->total_duration / dms_info->counter; + } + } + /* update Lock Event wait info */ for (int i = 0; i < LOCK_EVENT_NUM; i++) { WaitStatisticsInfo *lock_info = &gsInstrWaitInfo->event_info.lock_info[i]; @@ -361,6 +397,22 @@ static void set_io_event_tuple_value(WaitInfo* gsInstrWaitInfo, Datum* values, i values[++i] = TimestampTzGetDatum(gsInstrWaitInfo->event_info.io_info[eventId].last_updated); } +static void set_dms_event_tuple_value(WaitInfo* gsInstrWaitInfo, Datum* values, int i, uint32 eventId) +{ + values[++i] = CStringGetTextDatum("DMS_EVENT"); + values[++i] = CStringGetTextDatum(pgstat_get_wait_dms(WaitEventDMS(eventId + PG_WAIT_DMS))); + unsigned long long cnt = 0; + unsigned long long time = 0; + dms_get_event(dms_wait_event_t(eventId), &cnt, &time); + values[++i] = Int64GetDatum(cnt); + values[++i] = Int64GetDatum(gsInstrWaitInfo->event_info.dms_info[eventId].failed_counter); + values[++i] = Int64GetDatum(time); + values[++i] = Int64GetDatum(cnt == 0 ? 0 : time / cnt); + values[++i] = Int64GetDatum(gsInstrWaitInfo->event_info.dms_info[eventId].max_duration); + values[++i] = Int64GetDatum(gsInstrWaitInfo->event_info.dms_info[eventId].min_duration); + values[++i] = TimestampTzGetDatum(gsInstrWaitInfo->event_info.dms_info[eventId].last_updated); +} + static void set_lock_event_tuple_value(WaitInfo* gsInstrWaitInfo, Datum* values, int i, uint32 eventId) { values[++i] = CStringGetTextDatum("LOCK_EVENT"); @@ -409,6 +461,9 @@ static void set_tuple_value( } else if (call_cn < LOCK_EVENT_NUM + IO_EVENT_NUM + STATE_WAIT_NUM + LWLOCK_EVENT_NUM) { eventId = call_cn - LOCK_EVENT_NUM - IO_EVENT_NUM - STATE_WAIT_NUM; set_lwlock_event_tuple_value(gsInstrWaitInfo, values, i, eventId, nulls); + } else if (call_cn < LOCK_EVENT_NUM + IO_EVENT_NUM + STATE_WAIT_NUM + LWLOCK_EVENT_NUM + DMS_EVENT_NUM) { + eventId = call_cn - LOCK_EVENT_NUM - IO_EVENT_NUM - STATE_WAIT_NUM - LWLOCK_EVENT_NUM; + set_dms_event_tuple_value(gsInstrWaitInfo, values, i, eventId); } } @@ -438,7 +493,7 @@ Datum get_instr_wait_event(PG_FUNCTION_ARGS) } funcctx->user_fctx = read_current_instr_wait_info(); - funcctx->max_calls = STATE_WAIT_NUM + IO_EVENT_NUM + LOCK_EVENT_NUM + LWLOCK_EVENT_NUM; + funcctx->max_calls = STATE_WAIT_NUM + IO_EVENT_NUM + LOCK_EVENT_NUM + LWLOCK_EVENT_NUM + DMS_EVENT_NUM; MemoryContextSwitchTo(oldcontext); diff --git a/src/gausskernel/cbb/instruments/statement/instr_statement.cpp b/src/gausskernel/cbb/instruments/statement/instr_statement.cpp index e2cd90a30..bae9e72fb 100755 --- a/src/gausskernel/cbb/instruments/statement/instr_statement.cpp +++ b/src/gausskernel/cbb/instruments/statement/instr_statement.cpp @@ -89,6 +89,7 @@ #define STATEMENT_EVENT_TYPE_LOCK (2) #define STATEMENT_EVENT_TYPE_LWLOCK (3) #define STATEMENT_EVENT_TYPE_STATUS (4) +#define STATEMENT_EVENT_TYPE_DMS (5) /* stbyStmtHistSlow and stbyStmtHistFast always have the same life cycle. */ #define STBYSTMTHIST_IS_READY (g_instance.stat_cxt.stbyStmtHistSlow->state != MFCHAIN_STATE_NOT_READY) @@ -116,7 +117,8 @@ typedef struct { } StmtEventRecord; static const int wait_event_io_event_max_index = IO_EVENT_NUM; -static const int wait_event_lock_event_max_index = wait_event_io_event_max_index + LOCK_EVENT_NUM; +static const int wait_event_dms_event_max_index = wait_event_io_event_max_index + DMS_EVENT_NUM; +static const int wait_event_lock_event_max_index = wait_event_dms_event_max_index + LOCK_EVENT_NUM; static const int wait_event_lwlock_event_max_index = wait_event_lock_event_max_index + LWLOCK_EVENT_NUM; static const int wait_event_state_wait_max_index = wait_event_lwlock_event_max_index + STATE_WAIT_NUM; @@ -1627,6 +1629,8 @@ static const char *get_stmt_event_type_str(uint8 event_type) switch (event_type) { case STATEMENT_EVENT_TYPE_IO: return "IO_EVENT"; + case STATEMENT_EVENT_TYPE_DMS: + return "DMS_EVENT"; case STATEMENT_EVENT_TYPE_LOCK: return "LOCK_EVENT"; case STATEMENT_EVENT_TYPE_LWLOCK: @@ -2299,6 +2303,10 @@ static int32 get_wait_events_idx_in_bms(uint32 class_id, uint32 event_id) ereport(DEBUG4, (errmodule(MOD_INSTR), errmsg("[Statement] tracked event - IO"))); event_idx = event_id; break; + case PG_WAIT_DMS: + ereport(DEBUG4, (errmodule(MOD_INSTR), errmsg("[Statement] tracked event - DMS"))); + event_idx = event_id; + break; case PG_WAIT_LOCK: ereport(DEBUG4, (errmodule(MOD_INSTR), errmsg("[Statement] tracked event - LOCK"))); event_idx = event_id + wait_event_io_event_max_index; @@ -2369,8 +2377,12 @@ static void get_wait_events_full_info(StatementStatContext *statement_stat, Stri event_idx = virt_event_idx; event_str = pgstat_get_wait_io(WaitEventIO(event_idx + PG_WAIT_IO)); event_type = STATEMENT_EVENT_TYPE_IO; - } else if (virt_event_idx < wait_event_lock_event_max_index) { + } else if (virt_event_idx < wait_event_dms_event_max_index) { event_idx = virt_event_idx - wait_event_io_event_max_index; + event_str = pgstat_get_wait_dms(WaitEventDMS(event_idx + PG_WAIT_DMS)); + event_type = STATEMENT_EVENT_TYPE_DMS; + }else if (virt_event_idx < wait_event_lock_event_max_index) { + event_idx = virt_event_idx - wait_event_dms_event_max_index; event_str = GetLockNameFromTagType(event_idx); event_type = STATEMENT_EVENT_TYPE_LOCK; } else if (virt_event_idx < wait_event_lwlock_event_max_index) { @@ -2452,15 +2464,24 @@ void instr_stmt_copy_wait_events() mark_session_bms(start_idx, u_sess->statement_cxt.wait_events[start_idx].total_duration); } - wait_event_info = t_thrd.shemem_ptr_cxt.MyBEEntry->waitInfo.event_info.lock_info; + wait_event_info = t_thrd.shemem_ptr_cxt.MyBEEntry->waitInfo.event_info.dms_info; start_idx = wait_event_io_event_max_index; - end_idx = wait_event_lock_event_max_index; + end_idx = wait_event_dms_event_max_index; for (; start_idx < end_idx; start_idx++) { u_sess->statement_cxt.wait_events[start_idx].total_duration = wait_event_info[start_idx - wait_event_io_event_max_index].total_duration; mark_session_bms(start_idx, u_sess->statement_cxt.wait_events[start_idx].total_duration); } + wait_event_info = t_thrd.shemem_ptr_cxt.MyBEEntry->waitInfo.event_info.lock_info; + start_idx = wait_event_dms_event_max_index; + end_idx = wait_event_lock_event_max_index; + for (; start_idx < end_idx; start_idx++) { + u_sess->statement_cxt.wait_events[start_idx].total_duration = + wait_event_info[start_idx - wait_event_dms_event_max_index].total_duration; + mark_session_bms(start_idx, u_sess->statement_cxt.wait_events[start_idx].total_duration); + } + wait_event_info = t_thrd.shemem_ptr_cxt.MyBEEntry->waitInfo.event_info.lwlock_info; start_idx = wait_event_lock_event_max_index; end_idx = wait_event_lwlock_event_max_index; @@ -2546,9 +2567,13 @@ static bool instr_stmt_get_event_data(int32 event_idx, uint8 *event_type, int32 *event_real_id = event_idx; *total_duration = wait_info->event_info.io_info[*event_real_id].total_duration; *event_type = STATEMENT_EVENT_TYPE_IO; - } else if (event_idx < wait_event_lock_event_max_index) { + } else if (event_idx < wait_event_dms_event_max_index) { *event_real_id = event_idx - wait_event_io_event_max_index; *total_duration = wait_info->event_info.lock_info[*event_real_id].total_duration; + *event_type = STATEMENT_EVENT_TYPE_DMS; + } else if (event_idx < wait_event_lock_event_max_index) { + *event_real_id = event_idx - wait_event_dms_event_max_index; + *total_duration = wait_info->event_info.lock_info[*event_real_id].total_duration; *event_type = STATEMENT_EVENT_TYPE_LOCK; } else if (event_idx < wait_event_lwlock_event_max_index) { *event_real_id = event_idx - wait_event_lock_event_max_index; diff --git a/src/gausskernel/ddes/adapter/ss_dms.cpp b/src/gausskernel/ddes/adapter/ss_dms.cpp index a64073cc1..67b4a767d 100644 --- a/src/gausskernel/ddes/adapter/ss_dms.cpp +++ b/src/gausskernel/ddes/adapter/ss_dms.cpp @@ -104,6 +104,7 @@ int ss_dms_func_init() SS_RETURN_IFERR(DMS_LOAD_SYMBOL_FUNC(dms_register_thread_init)); SS_RETURN_IFERR(DMS_LOAD_SYMBOL_FUNC(dms_release_owner)); SS_RETURN_IFERR(DMS_LOAD_SYMBOL_FUNC(dms_wait_reform)); + SS_RETURN_IFERR(DMS_LOAD_SYMBOL_FUNC(dms_get_event)); SS_RETURN_IFERR(DMS_LOAD_SYMBOL_FUNC(dms_buf_res_rebuild_drc)); SS_RETURN_IFERR(DMS_LOAD_SYMBOL_FUNC(dms_is_recovery_session)); SS_RETURN_IFERR(DMS_LOAD_SYMBOL_FUNC(drc_get_page_master_id)); @@ -256,6 +257,11 @@ int dms_wait_reform(unsigned int *has_offline) return g_ss_dms_func.dms_wait_reform(has_offline); } +void dms_get_event(dms_wait_event_t event_type, unsigned long long *event_cnt, unsigned long long *event_time) +{ + return g_ss_dms_func.dms_get_event(event_type, event_cnt, event_time); +} + int dms_buf_res_rebuild_drc(dms_context_t *dms_ctx, dms_buf_ctrl_t *ctrl, unsigned long long lsn, unsigned char is_dirty) { diff --git a/src/gausskernel/ddes/adapter/ss_init.cpp b/src/gausskernel/ddes/adapter/ss_init.cpp index 3c1000b10..4913be62c 100644 --- a/src/gausskernel/ddes/adapter/ss_init.cpp +++ b/src/gausskernel/ddes/adapter/ss_init.cpp @@ -362,7 +362,7 @@ static void setDMSProfile(dms_profile_t* profile) profile->channel_cnt = (uint32)dms_attr->channel_count; profile->work_thread_cnt = (uint32)dms_attr->work_thread_count; profile->max_session_cnt = DMS_MAX_SESSIONS; - profile->time_stat_enabled = FALSE; + profile->time_stat_enabled = TRUE; profile->pipe_type = convertInterconnectType(); profile->conn_created_during_init = TRUE; setRdmaWorkConfig(profile); diff --git a/src/gausskernel/process/postmaster/pgstat.cpp b/src/gausskernel/process/postmaster/pgstat.cpp index 6b30c6b05..987fd9c75 100644 --- a/src/gausskernel/process/postmaster/pgstat.cpp +++ b/src/gausskernel/process/postmaster/pgstat.cpp @@ -374,6 +374,7 @@ static void pgstat_collect_thread_status_setup_memcxt(void); static void pgstat_collect_thread_status_clear_resource(void); const char* pgstat_get_wait_io(WaitEventIO w); +const char* pgstat_get_wait_dms(WaitEventDMS w); static void pgstat_setheader(PgStat_MsgHdr* hdr, StatMsgType mtype); void pgstat_send(void* msg, int len); @@ -4338,6 +4339,11 @@ const char* pgstat_get_wait_event(uint32 wait_event_info) event_name = pgstat_get_wait_io(w); break; } + case PG_WAIT_DMS: { + WaitEventDMS w = (WaitEventDMS)wait_event_info; + event_name = pgstat_get_wait_dms(w); + break; + } default: event_name = "unknown wait event"; break; @@ -4605,6 +4611,129 @@ const char* pgstat_get_wait_io(WaitEventIO w) return event_name; } +/* ---------- + * pgstat_get_wait_dms() - + * + * Convert WaitEventDMS to string. + * ---------- + */ +const char* pgstat_get_wait_dms(WaitEventDMS w) +{ + const char* event_name = "unknown wait event"; + + switch (w) { + case WAIT_EVENT_IDLE_WAIT: + event_name = "IdleWait"; + break; + case WAIT_EVENT_GC_BUFFER_BUSY: + event_name = "GcBufferBusy"; + break; + case WAIT_EVENT_DCS_REQ_MASTER4PAGE_1WAY: + event_name = "DcsReqMaster4Page1Way"; + break; + case WAIT_EVENT_DCS_REQ_MASTER4PAGE_2WAY: + event_name = "DcsReqMaster4Page2Way"; + break; + case WAIT_EVENT_DCS_REQ_MASTER4PAGE_3WAY: + event_name = "DcsReqMaster4Page3Way"; + break; + case WAIT_EVENT_DCS_REQ_MASTER4PAGE_TRY: + event_name = "DcsReqMaster4PageTry"; + break; + case WAIT_EVENT_DCS_REQ_OWNER4PAGE: + event_name = "DcsReqOwner4Page"; + break; + case WAIT_EVENT_DCS_CLAIM_OWNER: + event_name = "DcsCliamOwner"; + break; + case WAIT_EVENT_DCS_RELEASE_OWNER: + event_name = "DcsReleaseOwner"; + break; + case WAIT_EVENT_DCS_INVLDT_SHARE_COPY_REQ: + event_name = "DcsInvldtShareCopyReq"; + break; + case WAIT_EVENT_DCS_INVLDT_SHARE_COPY_PROCESS: + event_name = "DcsInvldtShareCopyProcess"; + break; + case WAIT_EVENT_DCS_TRANSFER_PAGE_LATCH: + event_name = "DcsTransferPageLatch"; + break; + case WAIT_EVENT_DCS_TRANSFER_PAGE_READONLY2X: + event_name = "DcsTransferPageReadonly2X"; + break; + case WAIT_EVENT_DCS_TRANSFER_PAGE_FLUSHLOG: + event_name = "DcsTransferPageFlushlog"; + break; + case WAIT_EVENT_DCS_TRANSFER_PAGE: + event_name = "DcsTransferPage"; + break; + case WAIT_EVENT_PCR_REQ_BTREE_PAGE: + event_name = "PcrReqBtreePage"; + break; + case WAIT_EVENT_PCR_REQ_HEAP_PAGE: + event_name = "PcrReqHeapPage"; + break; + case WAIT_EVENT_PCR_REQ_MASTER: + event_name = "PcrReqMaster"; + break; + case WAIT_EVENT_PCR_REQ_OWNER: + event_name = "PcrReqOwner"; + break; + case WAIT_EVENT_PCR_CHECK_CURR_VISIBLE: + event_name = "PcrCheckCurrVisible"; + break; + case WAIT_EVENT_TXN_REQ_INFO: + event_name = "TxnReqInfo"; + break; + case WAIT_EVENT_TXN_REQ_SNAPSHOT: + event_name = "TxnReqSnapshot"; + break; + case WAIT_EVENT_DLS_REQ_LOCK: + event_name = "DlsReqLock"; + break; + case WAIT_EVENT_DLS_REQ_TABLE: + event_name = "DlsReqTable"; + break; + case WAIT_EVENT_DLS_WAIT_TXN: + event_name = "DlsWaitTxn"; + break; + case WAIT_EVENT_DEAD_LOCK_TXN: + event_name = "DeadLockTxn"; + break; + case WAIT_EVENT_DEAD_LOCK_TABLE: + event_name = "DeadLockTable"; + break; + case WAIT_EVENT_DEAD_LOCK_ITL: + event_name = "DeadLockItl"; + break; + case WAIT_EVENT_BROADCAST_BTREE_SPLIT: + event_name = "BroadcastBtreeSplit"; + break; + case WAIT_EVENT_BROADCAST_ROOT_PAGE: + event_name = "BroadcastBootPage"; + break; + case WAIT_EVENT_QUERY_OWNER_ID: + event_name = "QueryOwnerId"; + break; + case WAIT_EVENT_LATCH_X: + event_name = "LatchX"; + break; + case WAIT_EVENT_LATCH_S: + event_name = "LatchS"; + break; + case WAIT_EVENT_LATCH_X_REMOTE: + event_name = "LatchXRemote"; + break; + case WAIT_EVENT_LATCH_S_REMOTE: + event_name = "LatchSRemote"; + break; + default: + event_name = "unknown wait event"; + break; + } + return event_name; +} + /* ---------- * pgstat_get_current_active_numbackends() - * diff --git a/src/include/ddes/dms/ss_dms.h b/src/include/ddes/dms/ss_dms.h index 4e0b1be2d..5532f331d 100644 --- a/src/include/ddes/dms/ss_dms.h +++ b/src/include/ddes/dms/ss_dms.h @@ -54,6 +54,7 @@ typedef struct st_ss_dms_func { int (*dms_register_thread_init)(dms_thread_init_t thrd_init); int (*dms_release_owner)(dms_context_t *dms_ctx, dms_buf_ctrl_t *ctrl, unsigned char *released); int (*dms_wait_reform)(unsigned int *has_offline); + void (*dms_get_event)(dms_wait_event_t event_type, unsigned long long *event_cnt, unsigned long long *event_time); int (*dms_buf_res_rebuild_drc)(dms_context_t *dms_ctx, dms_buf_ctrl_t *ctrl, unsigned long long lsn, unsigned char is_dirty); int (*dms_is_recovery_session)(unsigned int sid); @@ -99,6 +100,7 @@ int dms_request_opengauss_txn_snapshot(dms_context_t *dms_ctx, int dms_register_thread_init(dms_thread_init_t thrd_init); int dms_release_owner(dms_context_t *dms_ctx, dms_buf_ctrl_t *ctrl, unsigned char *released); int dms_wait_reform(unsigned int *has_offline); +void dms_get_event(dms_wait_event_t event_type, unsigned long long *event_cnt, unsigned long long *event_time); int dms_buf_res_rebuild_drc(dms_context_t *dms_ctx, dms_buf_ctrl_t *ctrl, unsigned long long lsn, unsigned char is_dirty); int dms_is_recovery_session(unsigned int sid); diff --git a/src/include/pgstat.h b/src/include/pgstat.h index b08a763bc..f39673b29 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -1257,6 +1257,7 @@ typedef enum WaitStatePhase { #define PG_WAIT_IO 0x0A000000U #define PG_WAIT_SQL 0x0B000000U #define PG_WAIT_STATE 0x0C000000U +#define PG_WAIT_DMS 0x0D000000U /* ---------- * Wait Events - IO @@ -1346,6 +1347,46 @@ typedef enum WaitEventIO { IO_EVENT_NUM = WAIT_EVENT_LOGCTRL_SLEEP - WAIT_EVENT_BUFFILE_READ + 1 // MUST be last, DO NOT use this value. } WaitEventIO; +typedef enum WaitEventDMS { + WAIT_EVENT_IDLE_WAIT = PG_WAIT_DMS, + + WAIT_EVENT_GC_BUFFER_BUSY, + WAIT_EVENT_DCS_REQ_MASTER4PAGE_1WAY, + WAIT_EVENT_DCS_REQ_MASTER4PAGE_2WAY, + WAIT_EVENT_DCS_REQ_MASTER4PAGE_3WAY, + WAIT_EVENT_DCS_REQ_MASTER4PAGE_TRY, + WAIT_EVENT_DCS_REQ_OWNER4PAGE, + WAIT_EVENT_DCS_CLAIM_OWNER, + WAIT_EVENT_DCS_RELEASE_OWNER, + WAIT_EVENT_DCS_INVLDT_SHARE_COPY_REQ, + WAIT_EVENT_DCS_INVLDT_SHARE_COPY_PROCESS, + WAIT_EVENT_DCS_TRANSFER_PAGE_LATCH, + WAIT_EVENT_DCS_TRANSFER_PAGE_READONLY2X, + WAIT_EVENT_DCS_TRANSFER_PAGE_FLUSHLOG, + WAIT_EVENT_DCS_TRANSFER_PAGE, + WAIT_EVENT_PCR_REQ_BTREE_PAGE, + WAIT_EVENT_PCR_REQ_HEAP_PAGE, + WAIT_EVENT_PCR_REQ_MASTER, + WAIT_EVENT_PCR_REQ_OWNER, + WAIT_EVENT_PCR_CHECK_CURR_VISIBLE, + WAIT_EVENT_TXN_REQ_INFO, + WAIT_EVENT_TXN_REQ_SNAPSHOT, + WAIT_EVENT_DLS_REQ_LOCK, + WAIT_EVENT_DLS_REQ_TABLE, + WAIT_EVENT_DLS_WAIT_TXN, + WAIT_EVENT_DEAD_LOCK_TXN, + WAIT_EVENT_DEAD_LOCK_TABLE, + WAIT_EVENT_DEAD_LOCK_ITL, + WAIT_EVENT_BROADCAST_BTREE_SPLIT, + WAIT_EVENT_BROADCAST_ROOT_PAGE, + WAIT_EVENT_QUERY_OWNER_ID, + WAIT_EVENT_LATCH_X, + WAIT_EVENT_LATCH_S, + WAIT_EVENT_LATCH_X_REMOTE, + WAIT_EVENT_LATCH_S_REMOTE, + DMS_EVENT_NUM = WAIT_EVENT_LATCH_S_REMOTE - WAIT_EVENT_IDLE_WAIT + 1 // MUST be last, DO NOT use this value. +} WaitEventDMS; + /* ---------- * Wait Events - SQL * @@ -1478,6 +1519,7 @@ typedef struct WaitEventInfo { int64 start_time; // current wait starttime int64 duration; // current wait duration WaitStatisticsInfo io_info[IO_EVENT_NUM]; + WaitStatisticsInfo dms_info[DMS_EVENT_NUM]; WaitStatisticsInfo lock_info[LOCK_EVENT_NUM]; WaitStatisticsInfo lwlock_info[LWLOCK_EVENT_NUM]; } WaitEventInfo; @@ -1746,6 +1788,7 @@ extern void pgstat_couple_decouple_session(bool is_couple); extern void pgstat_beshutdown_session(int ctrl_index); extern const char* pgstat_get_wait_io(WaitEventIO w); +extern const char* pgstat_get_wait_dms(WaitEventDMS w); extern void pgstat_report_activity(BackendState state, const char* cmd_str); extern void pgstat_report_tempfile(size_t filesize); extern void pgstat_report_memReserved(int4 memReserved, int reserve_or_release);