diff --git a/src/backend/cdb/cdbappendonlystoragewrite.c b/src/backend/cdb/cdbappendonlystoragewrite.c index 6a17e1cdd0f..bce2d069346 100755 --- a/src/backend/cdb/cdbappendonlystoragewrite.c +++ b/src/backend/cdb/cdbappendonlystoragewrite.c @@ -271,7 +271,7 @@ AppendOnlyStorageWrite_TransactionCreateFile(AppendOnlyStorageWrite *storageWrit // WALREP_FIXME: Pass isRedo == true, so that you don't get an error if it // exists already. That's currently OK, but in the future, other things // might depend on the isRedo flag, like whether to WAL-log the creation. - smgrcreate_ao(*relFileNode, segmentFileNum, true); + smgrcreate_ao(storageWrite->smgrAO, *relFileNode, segmentFileNum, true); /* * Create a WAL record, so that the segfile is also created after crash or diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c index a64c7384853..96e531e0798 100644 --- a/src/backend/storage/smgr/smgr.c +++ b/src/backend/storage/smgr/smgr.c @@ -127,6 +127,7 @@ static File AORelOpenSegFileXlog(RelFileNode node, int32 segmentFileNum, int fil static const f_smgr_ao smgrswao[] = { /* regular file */ { + .smgr_create_ao = mdcreate_ao, .smgr_FileClose = FileClose, .smgr_FileDiskSize = FileDiskSize, .smgr_FileTruncate = FileTruncate, @@ -492,9 +493,16 @@ smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo) * already because we are in a WAL replay sequence. */ void -smgrcreate_ao(RelFileNodeBackend rnode, int32 segmentFileNum, bool isRedo) +smgrcreate_ao(const struct f_smgr_ao *smgr, + RelFileNodeBackend rnode, + int32 segmentFileNum, bool isRedo) { - mdcreate_ao(rnode, segmentFileNum, isRedo); + /* If we get there, check that provided smgr structure is sane. + * First off all, outer Appendonly IO utilities should + * pass valid smgr. Also, in-kernel smgr interface implementation + * smgr_create_ao as mdcreate_ao, and extension should define its own. */ + Assert(smgr != NULL && smgr->smgr_create_ao != NULL); + smgr->smgr_create_ao(rnode, segmentFileNum, isRedo); if (file_create_hook) (*file_create_hook)(rnode); } diff --git a/src/include/storage/smgr.h b/src/include/storage/smgr.h index e7db1a43d49..4e3685dc55d 100644 --- a/src/include/storage/smgr.h +++ b/src/include/storage/smgr.h @@ -155,6 +155,7 @@ typedef struct f_smgr } f_smgr; typedef struct f_smgr_ao { + void (*smgr_create_ao) (RelFileNodeBackend rnode, int32 segmentFileNum, bool isRedo); off_t (*smgr_FileDiskSize) (File file); void (*smgr_FileClose) (File file); int (*smgr_FileTruncate) (File file, int64 offset, uint32 wait_event_info); @@ -193,7 +194,9 @@ extern void smgrclose(SMgrRelation reln); extern void smgrcloseall(void); extern void smgrclosenode(RelFileNodeBackend rnode); extern void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo); -extern void smgrcreate_ao(RelFileNodeBackend rnode, int32 segmentFileNum, bool isRedo); +extern void smgrcreate_ao(const struct f_smgr_ao *smgr, + RelFileNodeBackend rnode, + int32 segmentFileNum, bool isRedo); extern void smgrdosyncall(SMgrRelation *rels, int nrels); extern void smgrdounlinkall(SMgrRelation *rels, int nrels, bool isRedo); extern void smgrextend(SMgrRelation reln, ForkNumber forknum,