Add context type field to pg_backend_memory_contexts
authorDavid Rowley <[email protected]>
Mon, 1 Jul 2024 09:19:01 +0000 (21:19 +1200)
committerDavid Rowley <[email protected]>
Mon, 1 Jul 2024 09:19:01 +0000 (21:19 +1200)
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

doc/src/sgml/system-views.sgml
src/backend/utils/adt/mcxtfuncs.c
src/include/catalog/catversion.h
src/include/catalog/pg_proc.dat
src/test/regress/expected/rules.out
src/test/regress/expected/sysviews.out
src/test/regress/sql/sysviews.sql

index 8c18bea902fba24633de82771e3255123c3e2c5c..bdc34cf94e87b07e6e293f63e44f9f150f0173c3 100644 (file)
       </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>
index 4d4a70915bb3a56490c77fd922b303a602b6a608..108594148480850bd9dfacb4731dfa7d9a6984fd 100644 (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)
index 9b4442eb181a30f42232b1d6f22bc84928e5da97..7363a445fc475912b12b0acca3cc4b1543d4a946 100644 (file)
@@ -57,6 +57,6 @@
  */
 
 /*                         yyyymmddN */
-#define CATALOG_VERSION_NO 202406281
+#define CATALOG_VERSION_NO 202407011
 
 #endif
index 6a5476d3c4c2142656f10ffb9d95c0f69ebe01f4..d4ac578ae6464e3292eb214050346afa45d1dd27 100644 (file)
   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
index 13178e2b3df28ba1a27f08e7642eb287f54e8a68..e12ef4336a25d95e4ef72d1e4c5c2f74ef2154db 100644 (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);
index 2176a54bca1aec4fd66f31cafb7764965abb07c1..729620de13c8027556509e792c099cc16d67246f 100644 (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;
index b047fb55e708bba1eb56dd15fd6dbf26a4899946..7edac2fde148c5f8dbaf0a4e16a5aae83be3ea7d 100644 (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;