Revert: Allow table AM to store complex data structures in rd_amcache
authorAlexander Korotkov <[email protected]>
Thu, 11 Apr 2024 12:54:25 +0000 (15:54 +0300)
committerAlexander Korotkov <[email protected]>
Thu, 11 Apr 2024 13:02:49 +0000 (16:02 +0300)
This commit reverts 02eb07ea89 per review by Andres Freund.

Discussion: https://postgr.es/m/20240410165236.rwyrny7ihi4ddxw4%40awork3.anarazel.de

src/backend/access/heap/heapam_handler.c
src/backend/utils/cache/relcache.c
src/include/access/tableam.h
src/include/utils/rel.h

index c019d96a162eb072d9884ae0d0920957d49e17f6..3428d80817cd620d43aed475fe6c156c33027578 100644 (file)
@@ -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,
index 3fe74dabd00dbc34f4e2b39721486e5f25432de7..262c9878dd31bbc6bbc27779705b903943158a57 100644 (file)
@@ -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
index ac24c999453e5071c778b631203a3545e6ec2b47..1cc395317e52626ef122b3c48621788fe0407664 100644 (file)
@@ -687,14 +687,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().
     *
@@ -1816,32 +1808,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
index f25f769af2b2a0a7352dc957692d4a07874d59ba..87002049538a8990aa64a9814a4e3a88dd350eea 100644 (file)
@@ -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 */