From 1699504b3773566a76f624a198d52208226fbeff Mon Sep 17 00:00:00 2001 From: Melih Mutlu Date: Tue, 13 Jun 2023 15:00:05 +0300 Subject: [PATCH] Adding id/parent_id into pg_backend_memory_contexts Added two new fields into the tuples returned by pg_get_backend_memory_contexts() to specify the parent/child relation between memory contexts. Context names cannot be relied on since they're not unique. Therefore, unique id and parent_id are needed for each context. Those new id's are assigned during pg_get_backend_memory_contexts() call and not stored anywhere. So they may change in each pg_get_backend_memory_contexts() call and shouldn't be used across differenct pg_get_backend_memory_contexts() calls. Context id's are start from 0 which is assigned to TopMemoryContext. --- doc/src/sgml/system-views.sgml | 18 ++++++++++++++++++ src/backend/utils/adt/mcxtfuncs.c | 19 ++++++++++++++----- src/include/catalog/pg_proc.dat | 6 +++--- src/test/regress/expected/rules.out | 6 ++++-- 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/doc/src/sgml/system-views.sgml b/doc/src/sgml/system-views.sgml index 57b228076e..5d216ddf7b 100644 --- a/doc/src/sgml/system-views.sgml +++ b/doc/src/sgml/system-views.sgml @@ -538,6 +538,24 @@ Used space in bytes + + + + context_id int4 + + + Current context id + + + + + + parent_id int4 + + + Parent context id + + diff --git a/src/backend/utils/adt/mcxtfuncs.c b/src/backend/utils/adt/mcxtfuncs.c index 92ca5b2f72..bd8943cd83 100644 --- a/src/backend/utils/adt/mcxtfuncs.c +++ b/src/backend/utils/adt/mcxtfuncs.c @@ -35,9 +35,10 @@ static void PutMemoryContextsStatsTupleStore(Tuplestorestate *tupstore, TupleDesc tupdesc, MemoryContext context, - const char *parent, int level) + const char *parent, int level, int *context_id, + int parent_id) { -#define PG_GET_BACKEND_MEMORY_CONTEXTS_COLS 9 +#define PG_GET_BACKEND_MEMORY_CONTEXTS_COLS 11 Datum values[PG_GET_BACKEND_MEMORY_CONTEXTS_COLS]; bool nulls[PG_GET_BACKEND_MEMORY_CONTEXTS_COLS]; @@ -45,6 +46,7 @@ PutMemoryContextsStatsTupleStore(Tuplestorestate *tupstore, MemoryContext child; const char *name; const char *ident; + int current_context_id = (*context_id)++; Assert(MemoryContextIsValid(context)); @@ -103,12 +105,18 @@ PutMemoryContextsStatsTupleStore(Tuplestorestate *tupstore, values[6] = Int64GetDatum(stat.freespace); values[7] = Int64GetDatum(stat.freechunks); values[8] = Int64GetDatum(stat.totalspace - stat.freespace); + values[9] = Int32GetDatum(current_context_id); + if(parent_id < 0) + /* TopMemoryContext has no parent context */ + nulls[10] = true; + else + values[10] = Int32GetDatum(parent_id); tuplestore_putvalues(tupstore, tupdesc, values, nulls); for (child = context->firstchild; child != NULL; child = child->nextchild) { - PutMemoryContextsStatsTupleStore(tupstore, tupdesc, - child, name, level + 1); + PutMemoryContextsStatsTupleStore(tupstore, tupdesc, child, + name, level + 1, context_id, current_context_id); } } @@ -120,10 +128,11 @@ Datum pg_get_backend_memory_contexts(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; + int context_id = 0; InitMaterializedSRF(fcinfo, 0); PutMemoryContextsStatsTupleStore(rsinfo->setResult, rsinfo->setDesc, - TopMemoryContext, NULL, 0); + TopMemoryContext, NULL, 0, &context_id, -1); return (Datum) 0; } diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 6996073989..dcdb30da7a 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -8212,9 +8212,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,int4,int8,int8,int8,int8,int8,int4,int4}', + proargmodes => '{o,o,o,o,o,o,o,o,o,o,o}', + proargnames => '{name, ident, parent, level, total_bytes, total_nblocks, free_bytes, free_chunks, used_bytes, id, parent_id}', 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 7fd81e6a7d..ba6eab5a9c 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -1311,8 +1311,10 @@ pg_backend_memory_contexts| SELECT name, 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); + used_bytes, + id, + parent_id + 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, id, parent_id); pg_config| SELECT name, setting FROM pg_config() pg_config(name, setting); -- 2.25.1