Add context type field to pg_backend_memory_contexts

Since we now (as of v17) have 4 MemoryContext types, the type of context
seems like useful information to include in the pg_backend_memory_contexts
view.  Here we add that.

Reviewed-by: David Christensen, Michael Paquier
Discussion: https://postgr.es/m/CAApHDvrXX1OR09Zjb5TnB0AwCKze9exZN%3D9Nxxg1ZCVV8W-3BA%40mail.gmail.com
This commit is contained in:
David Rowley 2024-07-01 21:19:01 +12:00
parent e26d313bad
commit 12227a1d5f
7 changed files with 53 additions and 22 deletions

View File

@ -490,6 +490,15 @@
</para></entry>
</row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>type</structfield> <type>text</type>
</para>
<para>
Type of the memory context
</para></entry>
</row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>level</structfield> <type>int4</type>

View File

@ -36,7 +36,7 @@ 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];
@ -44,6 +44,7 @@ PutMemoryContextsStatsTupleStore(Tuplestorestate *tupstore,
MemoryContext child;
const char *name;
const char *ident;
const char *type;
Assert(MemoryContextIsValid(context));
@ -96,12 +97,32 @@ PutMemoryContextsStatsTupleStore(Tuplestorestate *tupstore,
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);
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[3] = CStringGetTextDatum(type);
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)

View File

@ -57,6 +57,6 @@
*/
/* yyyymmddN */
#define CATALOG_VERSION_NO 202406281
#define CATALOG_VERSION_NO 202407011
#endif

View File

@ -8279,9 +8279,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 => '{name, ident, parent, type, level, total_bytes, total_nblocks, free_bytes, free_chunks, used_bytes}',
prosrc => 'pg_get_backend_memory_contexts' },
# logging memory contexts of the specified backend

View File

@ -1306,13 +1306,14 @@ pg_available_extensions| SELECT e.name,
pg_backend_memory_contexts| SELECT name,
ident,
parent,
type,
level,
total_bytes,
total_nblocks,
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(name, ident, parent, type, level, total_bytes, total_nblocks, free_bytes, free_chunks, used_bytes);
pg_config| SELECT name,
setting
FROM pg_config() pg_config(name, setting);

View File

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

View File

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