!2945 添加dms event视图

Merge pull request !2945 from 叶佳才/master
This commit is contained in:
opengauss-bot
2023-02-22 02:36:30 +00:00
committed by Gitee
7 changed files with 267 additions and 7 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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)
{

View File

@ -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);

View File

@ -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() -
*

View File

@ -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);

View File

@ -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);