You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudberry.apache.org by re...@apache.org on 2026/01/16 20:47:44 UTC

(cloudberry) branch main updated: Use smgr-interface provided create_ao function. (#1534)

This is an automated email from the ASF dual-hosted git repository.

reshke pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git


The following commit(s) were added to refs/heads/main by this push:
     new c80e93d4d57 Use smgr-interface provided create_ao function. (#1534)
c80e93d4d57 is described below

commit c80e93d4d57ad2a3f6ca0bd7c71d804eab08a9a3
Author: reshke <re...@double.cloud>
AuthorDate: Sat Jan 17 01:47:39 2026 +0500

    Use smgr-interface provided create_ao function. (#1534)
    
    * Use smgr-interface provided create_ao function.
    
    Extensible SMGR is one of usefull Cloudberry features
    that allow to hijack storage execution flow from extension.
    smgrcreate_ao however does not follow this memo. Fix that.
    
    * Add assertion and comment
---
 src/backend/cdb/cdbappendonlystoragewrite.c |  2 +-
 src/backend/storage/smgr/smgr.c             | 12 ++++++++++--
 src/include/storage/smgr.h                  |  5 ++++-
 3 files changed, 15 insertions(+), 4 deletions(-)

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,


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org