0001-Adding-id-parent_id-into-pg_backend_memory_contexts.patch
application/octet-stream
Filename: 0001-Adding-id-parent_id-into-pg_backend_memory_contexts.patch
Type: application/octet-stream
Part: 0
Patch
Format: format-patch
Series: patch 0001
Subject: Adding id/parent_id into pg_backend_memory_contexts
| File | + | − |
|---|---|---|
| doc/src/sgml/system-views.sgml | 18 | 0 |
| src/backend/utils/adt/mcxtfuncs.c | 14 | 5 |
| src/include/catalog/pg_proc.dat | 3 | 3 |
| src/test/regress/expected/rules.out | 4 | 2 |
From 1699504b3773566a76f624a198d52208226fbeff Mon Sep 17 00:00:00 2001
From: Melih Mutlu <m.melihmutlu@gmail.com>
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
</para></entry>
</row>
+
+ <row>
+ <entry role="catalog_table_entry"><para role="column_definition">
+ <structfield>context_id</structfield> <type>int4</type>
+ </para>
+ <para>
+ Current context id
+ </para></entry>
+ </row>
+
+ <row>
+ <entry role="catalog_table_entry"><para role="column_definition">
+ <structfield>parent_id</structfield> <type>int4</type>
+ </para>
+ <para>
+ Parent context id
+ </para></entry>
+ </row>
</tbody>
</tgroup>
</table>
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