aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Korotkov <akorotkov@postgresql.org>2024-04-11 15:54:25 +0300
committerAlexander Korotkov <akorotkov@postgresql.org>2024-04-11 16:02:49 +0300
commit922c4c461d213a422ee7eb6c38e399607539210a (patch)
treedcd17814810d1637851b2012acd5bf12c018d463
parent8dd0bb84da7d56a9e41241b26bfbf6b79644d574 (diff)
downloadpostgresql-922c4c461d213a422ee7eb6c38e399607539210a.tar.gz
postgresql-922c4c461d213a422ee7eb6c38e399607539210a.zip
Revert: Allow table AM to store complex data structures in rd_amcache
This commit reverts 02eb07ea89 per review by Andres Freund. Discussion: https://postgr.es/m/20240410165236.rwyrny7ihi4ddxw4%40awork3.anarazel.de
-rw-r--r--src/backend/access/heap/heapam_handler.c1
-rw-r--r--src/backend/utils/cache/relcache.c11
-rw-r--r--src/include/access/tableam.h34
-rw-r--r--src/include/utils/rel.h10
4 files changed, 12 insertions, 44 deletions
diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c
index c019d96a162..3428d80817c 100644
--- a/src/backend/access/heap/heapam_handler.c
+++ b/src/backend/access/heap/heapam_handler.c
@@ -2656,7 +2656,6 @@ static const TableAmRoutine heapam_methods = {
.index_validate_scan = heapam_index_validate_scan,
.relation_analyze = heapam_analyze,
- .free_rd_amcache = NULL,
.relation_size = table_block_relation_size,
.relation_needs_toast_table = heapam_relation_needs_toast_table,
.relation_toast_am = heapam_relation_toast_am,
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 3fe74dabd00..262c9878dd3 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -2269,7 +2269,9 @@ RelationReloadIndexInfo(Relation relation)
RelationCloseSmgr(relation);
/* Must free any AM cached data upon relcache flush */
- table_free_rd_amcache(relation);
+ if (relation->rd_amcache)
+ pfree(relation->rd_amcache);
+ relation->rd_amcache = NULL;
/*
* If it's a shared index, we might be called before backend startup has
@@ -2489,7 +2491,8 @@ RelationDestroyRelation(Relation relation, bool remember_tupdesc)
pfree(relation->rd_options);
if (relation->rd_indextuple)
pfree(relation->rd_indextuple);
- table_free_rd_amcache(relation);
+ if (relation->rd_amcache)
+ pfree(relation->rd_amcache);
if (relation->rd_fdwroutine)
pfree(relation->rd_fdwroutine);
if (relation->rd_indexcxt)
@@ -2551,7 +2554,9 @@ RelationClearRelation(Relation relation, bool rebuild)
RelationCloseSmgr(relation);
/* Free AM cached data, if any */
- table_free_rd_amcache(relation);
+ if (relation->rd_amcache)
+ pfree(relation->rd_amcache);
+ relation->rd_amcache = NULL;
/*
* Treat nailed-in system relations separately, they always need to be
diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h
index ac24c999453..1cc395317e5 100644
--- a/src/include/access/tableam.h
+++ b/src/include/access/tableam.h
@@ -688,14 +688,6 @@ typedef struct TableAmRoutine
*/
/*
- * This callback frees relation private cache data stored in rd_amcache.
- * After the call all memory related to rd_amcache must be freed,
- * rd_amcache must be set to NULL. If this callback is not provided,
- * rd_amcache is assumed to point to a single memory chunk.
- */
- void (*free_rd_amcache) (Relation rel);
-
- /*
* See table_relation_size().
*
* Note that currently a few callers use the MAIN_FORKNUM size to figure
@@ -1817,32 +1809,6 @@ table_relation_analyze(Relation relation, AcquireSampleRowsFunc *func,
*/
/*
- * Frees relation private cache data stored in rd_amcache. Uses
- * free_rd_amcache method if provided. Assumes rd_amcache to point to single
- * memory chunk otherwise.
- */
-static inline void
-table_free_rd_amcache(Relation rel)
-{
- if (rel->rd_tableam && rel->rd_tableam->free_rd_amcache)
- {
- rel->rd_tableam->free_rd_amcache(rel);
-
- /*
- * We are assuming free_rd_amcache() did clear the cache and left NULL
- * in rd_amcache.
- */
- Assert(rel->rd_amcache == NULL);
- }
- else
- {
- if (rel->rd_amcache)
- pfree(rel->rd_amcache);
- rel->rd_amcache = NULL;
- }
-}
-
-/*
* Return the current size of `rel` in bytes. If `forkNumber` is
* InvalidForkNumber, return the relation's overall size, otherwise the size
* for the indicated fork.
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f25f769af2b..87002049538 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -221,12 +221,10 @@ typedef struct RelationData
* rd_amcache is available for index and table AMs to cache private data
* about the relation. This must be just a cache since it may get reset
* at any time (in particular, it will get reset by a relcache inval
- * message for the relation). If used for table AM it must point to a
- * single memory chunk palloc'd in CacheMemoryContext, or more complex
- * data structure in that memory context to be freed by free_rd_amcache
- * method. If used for index AM it must point to a single memory chunk
- * palloc'd in rd_indexcxt memory context. A relcache reset will include
- * freeing that chunk and setting rd_amcache = NULL.
+ * message for the relation). If used, it must point to a single memory
+ * chunk palloc'd in CacheMemoryContext, or in rd_indexcxt for an index
+ * relation. A relcache reset will include freeing that chunk and setting
+ * rd_amcache = NULL.
*/
void *rd_amcache; /* available for use by index/table AM */