@ -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);
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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() -
|
||||
*
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user