From 632be6de363e8f9975722debbd620665f3a0ea71 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Tue, 16 Apr 2024 13:05:34 +1200 Subject: [PATCH v2] Add context type field to pg_backend_memory_contexts --- doc/src/sgml/system-views.sgml | 9 +++++ src/backend/utils/adt/mcxtfuncs.c | 50 ++++++++++++++++++-------- src/include/catalog/pg_proc.dat | 6 ++-- src/test/regress/expected/rules.out | 5 +-- src/test/regress/expected/sysviews.out | 16 ++++----- src/test/regress/sql/sysviews.sql | 4 +-- 6 files changed, 61 insertions(+), 29 deletions(-) diff --git a/doc/src/sgml/system-views.sgml b/doc/src/sgml/system-views.sgml index 7ed617170f..18ae5b9138 100644 --- a/doc/src/sgml/system-views.sgml +++ b/doc/src/sgml/system-views.sgml @@ -463,6 +463,15 @@ + + + type text + + + Type of the memory context + + + name text diff --git a/src/backend/utils/adt/mcxtfuncs.c b/src/backend/utils/adt/mcxtfuncs.c index 4d4a70915b..fe52d57fd4 100644 --- a/src/backend/utils/adt/mcxtfuncs.c +++ b/src/backend/utils/adt/mcxtfuncs.c @@ -36,12 +36,13 @@ PutMemoryContextsStatsTupleStore(Tuplestorestate *tupstore, TupleDesc tupdesc, MemoryContext context, const char *parent, int level) { -#define PG_GET_BACKEND_MEMORY_CONTEXTS_COLS 9 +#define PG_GET_BACKEND_MEMORY_CONTEXTS_COLS 10 Datum values[PG_GET_BACKEND_MEMORY_CONTEXTS_COLS]; bool nulls[PG_GET_BACKEND_MEMORY_CONTEXTS_COLS]; MemoryContextCounters stat; MemoryContext child; + const char *type; const char *name; const char *ident; @@ -67,10 +68,31 @@ PutMemoryContextsStatsTupleStore(Tuplestorestate *tupstore, memset(values, 0, sizeof(values)); memset(nulls, 0, sizeof(nulls)); + switch (context->type) + { + case T_AllocSetContext: + type = "AllocSet"; + break; + case T_GenerationContext: + type = "Generation"; + break; + case T_SlabContext: + type = "Slab"; + break; + case T_BumpContext: + type = "Bump"; + break; + default: + type = "???"; + break; + } + + values[0] = CStringGetTextDatum(type); + if (name) - values[0] = CStringGetTextDatum(name); + values[1] = CStringGetTextDatum(name); else - nulls[0] = true; + nulls[1] = true; if (ident) { @@ -86,22 +108,22 @@ PutMemoryContextsStatsTupleStore(Tuplestorestate *tupstore, memcpy(clipped_ident, ident, idlen); clipped_ident[idlen] = '\0'; - values[1] = CStringGetTextDatum(clipped_ident); + values[2] = CStringGetTextDatum(clipped_ident); } else - nulls[1] = true; + nulls[2] = true; if (parent) - values[2] = CStringGetTextDatum(parent); + values[3] = CStringGetTextDatum(parent); else - nulls[2] = true; - - values[3] = Int32GetDatum(level); - values[4] = Int64GetDatum(stat.totalspace); - values[5] = Int64GetDatum(stat.nblocks); - values[6] = Int64GetDatum(stat.freespace); - values[7] = Int64GetDatum(stat.freechunks); - values[8] = Int64GetDatum(stat.totalspace - stat.freespace); + nulls[3] = true; + + values[4] = Int32GetDatum(level); + values[5] = Int64GetDatum(stat.totalspace); + values[6] = Int64GetDatum(stat.nblocks); + values[7] = Int64GetDatum(stat.freespace); + values[8] = Int64GetDatum(stat.freechunks); + values[9] = Int64GetDatum(stat.totalspace - stat.freespace); tuplestore_putvalues(tupstore, tupdesc, values, nulls); for (child = context->firstchild; child != NULL; child = child->nextchild) diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 134e3b22fd..adda675887 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -8277,9 +8277,9 @@ proname => 'pg_get_backend_memory_contexts', prorows => '100', proretset => 't', provolatile => 'v', proparallel => 'r', prorettype => 'record', proargtypes => '', - proallargtypes => '{text,text,text,int4,int8,int8,int8,int8,int8}', - proargmodes => '{o,o,o,o,o,o,o,o,o}', - proargnames => '{name, ident, parent, level, total_bytes, total_nblocks, free_bytes, free_chunks, used_bytes}', + proallargtypes => '{text,text,text,text,int4,int8,int8,int8,int8,int8}', + proargmodes => '{o,o,o,o,o,o,o,o,o,o}', + proargnames => '{type, name, ident, parent, level, total_bytes, total_nblocks, free_bytes, free_chunks, used_bytes}', prosrc => 'pg_get_backend_memory_contexts' }, # logging memory contexts of the specified backend diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index f4a0f36377..a8ac58201d 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -1303,7 +1303,8 @@ pg_available_extensions| SELECT e.name, e.comment FROM (pg_available_extensions() e(name, default_version, comment) LEFT JOIN pg_extension x ON ((e.name = x.extname))); -pg_backend_memory_contexts| SELECT name, +pg_backend_memory_contexts| SELECT type, + name, ident, parent, level, @@ -1312,7 +1313,7 @@ pg_backend_memory_contexts| SELECT name, free_bytes, free_chunks, used_bytes - FROM pg_get_backend_memory_contexts() pg_get_backend_memory_contexts(name, ident, parent, level, total_bytes, total_nblocks, free_bytes, free_chunks, used_bytes); + FROM pg_get_backend_memory_contexts() pg_get_backend_memory_contexts(type, name, ident, parent, level, total_bytes, total_nblocks, free_bytes, free_chunks, used_bytes); pg_config| SELECT name, setting FROM pg_config() pg_config(name, setting); diff --git a/src/test/regress/expected/sysviews.out b/src/test/regress/expected/sysviews.out index 2f3eb4e7f1..60ff45081a 100644 --- a/src/test/regress/expected/sysviews.out +++ b/src/test/regress/expected/sysviews.out @@ -21,11 +21,11 @@ select count(*) >= 0 as ok from pg_available_extensions; -- The entire output of pg_backend_memory_contexts is not stable, -- we test only the existence and basic condition of TopMemoryContext. -select name, ident, parent, level, total_bytes >= free_bytes +select type, name, ident, parent, level, total_bytes >= free_bytes from pg_backend_memory_contexts where level = 0; - name | ident | parent | level | ?column? -------------------+-------+--------+-------+---------- - TopMemoryContext | | | 0 | t + type | name | ident | parent | level | ?column? +----------+------------------+-------+--------+-------+---------- + AllocSet | TopMemoryContext | | | 0 | t (1 row) -- We can exercise some MemoryContext type stats functions. Most of the @@ -43,11 +43,11 @@ fetch 1 from cur; bbbbbbbbbb | 2 (1 row) -select name, parent, total_bytes > 0, total_nblocks, free_bytes > 0, free_chunks +select type, name, parent, total_bytes > 0, total_nblocks, free_bytes > 0, free_chunks from pg_backend_memory_contexts where name = 'Caller tuples'; - name | parent | ?column? | total_nblocks | ?column? | free_chunks ----------------+----------------+----------+---------------+----------+------------- - Caller tuples | TupleSort sort | t | 2 | t | 0 + type | name | parent | ?column? | total_nblocks | ?column? | free_chunks +------+---------------+----------------+----------+---------------+----------+------------- + Bump | Caller tuples | TupleSort sort | t | 2 | t | 0 (1 row) rollback; diff --git a/src/test/regress/sql/sysviews.sql b/src/test/regress/sql/sysviews.sql index c4f59ddc89..b899de174f 100644 --- a/src/test/regress/sql/sysviews.sql +++ b/src/test/regress/sql/sysviews.sql @@ -14,7 +14,7 @@ select count(*) >= 0 as ok from pg_available_extensions; -- The entire output of pg_backend_memory_contexts is not stable, -- we test only the existence and basic condition of TopMemoryContext. -select name, ident, parent, level, total_bytes >= free_bytes +select type, name, ident, parent, level, total_bytes >= free_bytes from pg_backend_memory_contexts where level = 0; -- We can exercise some MemoryContext type stats functions. Most of the @@ -28,7 +28,7 @@ declare cur cursor for select left(a,10), b from (values(repeat('a', 512 * 1024),1),(repeat('b', 512),2)) v(a,b) order by v.a desc; fetch 1 from cur; -select name, parent, total_bytes > 0, total_nblocks, free_bytes > 0, free_chunks +select type, name, parent, total_bytes > 0, total_nblocks, free_bytes > 0, free_chunks from pg_backend_memory_contexts where name = 'Caller tuples'; rollback; -- 2.40.1.windows.1