diff --git a/src/common/backend/catalog/builtin_funcs.ini b/src/common/backend/catalog/builtin_funcs.ini index 32fc752da..a94ce6bd0 100644 --- a/src/common/backend/catalog/builtin_funcs.ini +++ b/src/common/backend/catalog/builtin_funcs.ini @@ -2509,6 +2509,10 @@ "ondemand_recovery_status", 1, AddBuiltinFunc(_0(6991), _1("ondemand_recovery_status"), _2(0), _3(false), _4(true), _5(get_ondemand_recovery_status), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(10), _11(10), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(12, TEXTOID, TEXTOID, OIDOID, OIDOID, OIDOID, OIDOID, BOOLOID, TEXTOID, TEXTOID, TEXTOID, OIDOID, OIDOID), _22(12, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(12, "primary_checkpoint_redo_lsn", "realtime_build_replayed_lsn", "hashmap_used_blocks", "hashmap_total_blocks", "trxn_queue_blocks", "seg_queue_blocks", "in_ondemand_recovery", "ondemand_recovery_status", "realtime_build_status", "recovery_pause_status", "record_item_num", "record_item_mbytes"), _24(NULL), _25("get_ondemand_recovery_status"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)) ), + AddFuncGroup( + "realtime_build_log_ctrl_status", 1, + AddBuiltinFunc(_0(6992), _1("realtime_build_log_ctrl_status"), _2(0), _3(false), _4(true), _5(get_realtime_build_log_ctrl_status), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(64), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(11, INT4OID, INT8OID, TIMESTAMPTZOID, TIMESTAMPTZOID, TIMESTAMPTZOID, INT8OID, INT8OID, TEXTOID, TEXTOID, TEXTOID, INT4OID), _22(11, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(11, "ins_id", "current_rto", "prev_reply_time", "prev_calculate_time", "reply_time", "period_total_build", "build_rate", "prev_build_ptr", "realtime_build_ptr", "current_insert_ptr", "sleep_time"), _24(NULL), _25("get_realtime_build_log_ctrl_status"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)) + ), AddFuncGroup( "dss_io_stat", 1, AddBuiltinFunc(_0(6990), _1("dss_io_stat"), _2(1), _3(true), _4(false), _5(dss_io_stat), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, INT4OID), _21(4, INT4OID, INT8OID, INT8OID, INT4OID), _22(4, 'i', 'o', 'o', 'o'), _23(4, "duration", "read_kilobyte_per_sec", "write_kilobyte_per_sec", "io_times"), _24(NULL), _25("dss_io_stat"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)) diff --git a/src/common/backend/utils/adt/pgstatfuncs.cpp b/src/common/backend/utils/adt/pgstatfuncs.cpp index 3af604e57..fc8408b47 100644 --- a/src/common/backend/utils/adt/pgstatfuncs.cpp +++ b/src/common/backend/utils/adt/pgstatfuncs.cpp @@ -15013,6 +15013,89 @@ Datum dss_io_stat(PG_FUNCTION_ARGS) result = HeapTupleGetDatum(heap_tuple); PG_RETURN_DATUM(result); } + +Datum get_realtime_build_log_ctrl_status(PG_FUNCTION_ARGS) +{ + if (!ENABLE_DMS) { + ereport(ERROR, (errmsg("This function only supports shared storage."))); + } + const int realtimeBuildCtrlStatColumnNum = 11; + const int shiftSpeed = 3; + Datum result; + TupleDesc tupdesc; + ReturnSetInfo* rsinfo = (ReturnSetInfo*)fcinfo->resultinfo; + MemoryContext oldcontext = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory); + errno_t errorno = EOK; + int i = 0; + tupdesc = CreateTemplateTupleDesc(realtimeBuildCtrlStatColumnNum, false); + const char *attrNames[realtimeBuildCtrlStatColumnNum] = { + "ins_id", "current_rto", "prev_reply_time", "prev_calculate_time", "reply_time", + "period_total_build", "build_rate", "prev_build_ptr", "realtime_build_ptr", + "current_insert_ptr", "sleep_time" + }; + Oid attr_types[realtimeBuildCtrlStatColumnNum] = { + INT4OID, INT8OID, TIMESTAMPTZOID, TIMESTAMPTZOID, TIMESTAMPTZOID, + INT8OID, INT8OID, TEXTOID, TEXTOID, TEXTOID, INT4OID + }; + + for (i = 0; i < realtimeBuildCtrlStatColumnNum; i++) { + TupleDescInitEntry(tupdesc, (AttrNumber)(i + 1), attrNames[i], attr_types[i], -1, 0); + } + tupdesc = BlessTupleDesc(tupdesc); + + Tuplestorestate *tupstore = tuplestore_begin_heap(rsinfo->allowedModes & SFRM_Materialize_Random, + false, u_sess->attr.attr_memory.work_mem); + MemoryContextSwitchTo(oldcontext); + + if (SS_PRIMARY_ENABLE_TARGET_RTO) { + for (int instId = 0; instId < DMS_MAX_INSTANCES; instId++) { + realtime_build_ctrl_t rtBuildCtrl = g_instance.dms_cxt.SSRecoveryInfo.rtBuildCtrl[instId]; + if (rtBuildCtrl.replyTime == 0) { + continue; + } + + Datum values[realtimeBuildCtrlStatColumnNum]; + bool nulls[realtimeBuildCtrlStatColumnNum] = {false}; + + char prevBuildPtr[MAXFNAMELEN]; + char realtimeBuildPtr[MAXFNAMELEN]; + char currentInsertPtr[MAXFNAMELEN]; + + errorno = snprintf_s(prevBuildPtr, sizeof(prevBuildPtr), sizeof(prevBuildPtr) - 1, "%X/%X", + (uint32)(rtBuildCtrl.prevBuildPtr >> 32), (uint32)rtBuildCtrl.prevBuildPtr); + securec_check_ss(errorno, "", ""); + errorno = snprintf_s(realtimeBuildPtr, sizeof(realtimeBuildPtr), sizeof(realtimeBuildPtr) - 1, "%X/%X", + (uint32)(rtBuildCtrl.realtimeBuildPtr >> 32), (uint32)rtBuildCtrl.realtimeBuildPtr); + securec_check_ss(errorno, "", ""); + XLogRecPtr currentInsertLsn = GetXLogInsertEndRecPtr(); + errorno = snprintf_s(currentInsertPtr, sizeof(currentInsertPtr), sizeof(currentInsertPtr) - 1, "%X/%X", + (uint32)(currentInsertLsn >> 32), (uint32)currentInsertLsn); + securec_check_ss(errorno, "", ""); + i = 0; + values[i++] = Int32GetDatum(instId); + values[i++] = Int64GetDatum(rtBuildCtrl.currentRTO); + values[i++] = TimestampTzGetDatum(rtBuildCtrl.prevReplyTime); + values[i++] = TimestampTzGetDatum(rtBuildCtrl.prevCalculateTime); + values[i++] = TimestampTzGetDatum(rtBuildCtrl.replyTime); + values[i++] = Int64GetDatum(rtBuildCtrl.periodTotalBuild); + values[i++] = Int64GetDatum(rtBuildCtrl.buildRate >> shiftSpeed); + values[i++] = CStringGetTextDatum(prevBuildPtr); + values[i++] = CStringGetTextDatum(realtimeBuildPtr); + values[i++] = CStringGetTextDatum(currentInsertPtr); + values[i++] = Int32GetDatum(rtBuildCtrl.sleepTime); + + tuplestore_putvalues(tupstore, tupdesc, values, nulls); + } + } + + tuplestore_donestoring(tupstore); + rsinfo->returnMode = SFRM_Materialize; + rsinfo->setResult = tupstore; + rsinfo->setDesc = tupdesc; + + return (Datum)0; +} + #ifdef ENABLE_MULTIPLE_NODES /* Get the head row of the view of index status */ TupleDesc get_index_status_view_frist_row() diff --git a/src/include/catalog/upgrade_sql/rollback_catalog_maindb/rollback-post_catalog_maindb_93_025.sql b/src/include/catalog/upgrade_sql/rollback_catalog_maindb/rollback-post_catalog_maindb_93_025.sql new file mode 100644 index 000000000..78d4abddd --- /dev/null +++ b/src/include/catalog/upgrade_sql/rollback_catalog_maindb/rollback-post_catalog_maindb_93_025.sql @@ -0,0 +1 @@ +DROP FUNCTION IF EXISTS pg_catalog.realtime_build_log_ctrl_status() CASCADE; \ No newline at end of file diff --git a/src/include/catalog/upgrade_sql/rollback_catalog_otherdb/rollback-post_catalog_otherdb_93_025.sql b/src/include/catalog/upgrade_sql/rollback_catalog_otherdb/rollback-post_catalog_otherdb_93_025.sql new file mode 100644 index 000000000..78d4abddd --- /dev/null +++ b/src/include/catalog/upgrade_sql/rollback_catalog_otherdb/rollback-post_catalog_otherdb_93_025.sql @@ -0,0 +1 @@ +DROP FUNCTION IF EXISTS pg_catalog.realtime_build_log_ctrl_status() CASCADE; \ No newline at end of file diff --git a/src/include/catalog/upgrade_sql/upgrade_catalog_maindb/upgrade-post_catalog_maindb_93_025.sql b/src/include/catalog/upgrade_sql/upgrade_catalog_maindb/upgrade-post_catalog_maindb_93_025.sql new file mode 100644 index 000000000..9c0127412 --- /dev/null +++ b/src/include/catalog/upgrade_sql/upgrade_catalog_maindb/upgrade-post_catalog_maindb_93_025.sql @@ -0,0 +1,16 @@ +DROP FUNCTION IF EXISTS pg_catalog.realtime_build_log_ctrl_status() CASCADE; +SET LOCAL inplace_upgrade_next_system_object_oids=IUO_PROC, 6992; +CREATE FUNCTION pg_catalog.realtime_build_log_ctrl_status( + out ins_id int4, + out current_rto int8, + out prev_reply_time timestamp with time zone, + out prev_calculate_time timestamp with time zone, + out reply_time timestamp with time zone, + out period_total_build int8, + out build_rate int8, + out prev_build_ptr text, + out realtime_build_ptr text, + out current_insert_lsn text, + out sleepTime int4 +) +RETURNS SETOF record LANGUAGE INTERNAL as 'realtime_build_log_ctrl_status' stable; \ No newline at end of file diff --git a/src/include/catalog/upgrade_sql/upgrade_catalog_otherdb/upgrade-post_catalog_otherdb_93_025.sql b/src/include/catalog/upgrade_sql/upgrade_catalog_otherdb/upgrade-post_catalog_otherdb_93_025.sql new file mode 100644 index 000000000..9c0127412 --- /dev/null +++ b/src/include/catalog/upgrade_sql/upgrade_catalog_otherdb/upgrade-post_catalog_otherdb_93_025.sql @@ -0,0 +1,16 @@ +DROP FUNCTION IF EXISTS pg_catalog.realtime_build_log_ctrl_status() CASCADE; +SET LOCAL inplace_upgrade_next_system_object_oids=IUO_PROC, 6992; +CREATE FUNCTION pg_catalog.realtime_build_log_ctrl_status( + out ins_id int4, + out current_rto int8, + out prev_reply_time timestamp with time zone, + out prev_calculate_time timestamp with time zone, + out reply_time timestamp with time zone, + out period_total_build int8, + out build_rate int8, + out prev_build_ptr text, + out realtime_build_ptr text, + out current_insert_lsn text, + out sleepTime int4 +) +RETURNS SETOF record LANGUAGE INTERNAL as 'realtime_build_log_ctrl_status' stable; \ No newline at end of file diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index 7259b1e87..5d6968a9b 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -1881,6 +1881,7 @@ extern Datum compress_statistic_info(PG_FUNCTION_ARGS); extern Datum pg_read_binary_file_blocks(PG_FUNCTION_ARGS); extern Datum dss_io_stat(PG_FUNCTION_ARGS); extern Datum get_ondemand_recovery_status(PG_FUNCTION_ARGS); +extern Datum get_realtime_build_log_ctrl_status(PG_FUNCTION_ARGS); /* plhandler.cpp */ extern Datum generate_procoverage_report(PG_FUNCTION_ARGS);