On Mon, May 6, 2019 at 7:14 AM Andres Freund <and...@anarazel.de> wrote: > > Hi, > > On May 6, 2019 3:40:55 AM PDT, Rafia Sabih <rafia.pghack...@gmail.com> wrote: > >I was trying the toyam patch and on make check it failed with > >segmentation fault at > > > >static void > >toyam_relation_set_new_filenode(Relation rel, > > char persistence, > > TransactionId *freezeXid, > > MultiXactId *minmulti) > >{ > > *freezeXid = InvalidTransactionId; > > > >Basically, on running create table t (i int, j int) using toytable, > >leads to this segmentation fault. > > > >Am I missing something here? > > I assume you got compiler warmings compiling it? The API for some callbacks > changed a bit.
Attached patch gets toy table AM implementation to match latest master API. The patch builds on top of patch from Heikki in [1]. Compiles and works but the test still continues to fail with WARNING for issue mentioned in [1] Noticed the typo in recently added comment for relation_set_new_filenode(). * Note that only the subset of the relcache filled by * RelationBuildLocalRelation() can be relied upon and that the relation's * catalog entries either will either not yet exist (new relation), or * will still reference the old relfilenode. seems should be * Note that only the subset of the relcache filled by * RelationBuildLocalRelation() can be relied upon and that the relation's * catalog entries will either not yet exist (new relation), or still * reference the old relfilenode. Also wish to point out, while working on Zedstore, we realized that TupleDesc from Relation object can be trusted at AM layer for scan_begin() API. As for ALTER TABLE rewrite case (ATRewriteTables()), catalog is updated first and hence the relation object passed to AM layer reflects new TupleDesc. For heapam its fine as it doesn't use the TupleDesc today during scans in AM layer for scan_getnextslot(). Only TupleDesc which can trusted and matches the on-disk layout of the tuple for scans hence is from TupleTableSlot. Which is little unfortunate as TupleTableSlot is only available in scan_getnextslot(), and not in scan_begin(). Means if AM wishes to do some initialization based on TupleDesc for scans can't be done in scan_begin() and forced to delay till has access to TupleTableSlot. We should at least add comment for scan_begin() to strongly clarify not to trust Relation object TupleDesc. Or maybe other alternative would be have separate API for rewrite case. 1] https://www.postgresql.org/message-id/9a7fb9cc-2419-5db7-8840-ddc10c93f122%40iki.fi
diff --git a/src/test/modules/toytable/toytableam.c b/src/test/modules/toytable/toytableam.c index 4cb2b5d75db..9f1ab534822 100644 --- a/src/test/modules/toytable/toytableam.c +++ b/src/test/modules/toytable/toytableam.c @@ -398,6 +398,7 @@ toyam_finish_bulk_insert(Relation rel, int options) static void toyam_relation_set_new_filenode(Relation rel, + const RelFileNode *newrnode, char persistence, TransactionId *freezeXid, MultiXactId *minmulti) @@ -410,7 +411,7 @@ toyam_relation_set_new_filenode(Relation rel, * RelationGetNumberOfBlocks, from index_update_stats(), and that * fails if the underlying file doesn't exist. */ - RelationCreateStorage(rel->rd_node, persistence); + RelationCreateStorage(*newrnode, persistence); } static void @@ -422,7 +423,7 @@ toyam_relation_nontransactional_truncate(Relation rel) } static void -toyam_relation_copy_data(Relation rel, RelFileNode newrnode) +toyam_relation_copy_data(Relation rel, const RelFileNode *newrnode) { ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -435,8 +436,8 @@ toyam_relation_copy_for_cluster(Relation NewHeap, Relation OldIndex, bool use_sort, TransactionId OldestXmin, - TransactionId FreezeXid, - MultiXactId MultiXactCutoff, + TransactionId *xid_cutoff, + MultiXactId *multi_cutoff, double *num_tuples, double *tups_vacuumed, double *tups_recently_dead)