diff options
Diffstat (limited to 'src/backend/catalog/storage.c')
-rw-r--r-- | src/backend/catalog/storage.c | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index 671aaff133a..0bd0451f008 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -74,6 +74,7 @@ static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */ typedef struct xl_smgr_create { RelFileNode rnode; + ForkNumber forkNum; } xl_smgr_create; typedef struct xl_smgr_truncate @@ -98,9 +99,6 @@ void RelationCreateStorage(RelFileNode rnode, char relpersistence) { PendingRelDelete *pending; - XLogRecPtr lsn; - XLogRecData rdata; - xl_smgr_create xlrec; SMgrRelation srel; BackendId backend; bool needs_wal; @@ -111,6 +109,10 @@ RelationCreateStorage(RelFileNode rnode, char relpersistence) backend = MyBackendId; needs_wal = false; break; + case RELPERSISTENCE_UNLOGGED: + backend = InvalidBackendId; + needs_wal = false; + break; case RELPERSISTENCE_PERMANENT: backend = InvalidBackendId; needs_wal = true; @@ -124,19 +126,7 @@ RelationCreateStorage(RelFileNode rnode, char relpersistence) smgrcreate(srel, MAIN_FORKNUM, false); if (needs_wal) - { - /* - * Make an XLOG entry reporting the file creation. - */ - xlrec.rnode = rnode; - - rdata.data = (char *) &xlrec; - rdata.len = sizeof(xlrec); - rdata.buffer = InvalidBuffer; - rdata.next = NULL; - - lsn = XLogInsert(RM_SMGR_ID, XLOG_SMGR_CREATE, &rdata); - } + log_smgrcreate(&srel->smgr_rnode.node, MAIN_FORKNUM); /* Add the relation to the list of stuff to delete at abort */ pending = (PendingRelDelete *) @@ -150,6 +140,29 @@ RelationCreateStorage(RelFileNode rnode, char relpersistence) } /* + * Perform XLogInsert of a XLOG_SMGR_CREATE record to WAL. + */ +void +log_smgrcreate(RelFileNode *rnode, ForkNumber forkNum) +{ + xl_smgr_create xlrec; + XLogRecData rdata; + + /* + * Make an XLOG entry reporting the file creation. + */ + xlrec.rnode = *rnode; + xlrec.forkNum = forkNum; + + rdata.data = (char *) &xlrec; + rdata.len = sizeof(xlrec); + rdata.buffer = InvalidBuffer; + rdata.next = NULL; + + XLogInsert(RM_SMGR_ID, XLOG_SMGR_CREATE, &rdata); +} + +/* * RelationDropStorage * Schedule unlinking of physical storage at transaction commit. */ @@ -478,7 +491,7 @@ smgr_redo(XLogRecPtr lsn, XLogRecord *record) SMgrRelation reln; reln = smgropen(xlrec->rnode, InvalidBackendId); - smgrcreate(reln, MAIN_FORKNUM, true); + smgrcreate(reln, xlrec->forkNum, true); } else if (info == XLOG_SMGR_TRUNCATE) { @@ -523,7 +536,7 @@ smgr_desc(StringInfo buf, uint8 xl_info, char *rec) if (info == XLOG_SMGR_CREATE) { xl_smgr_create *xlrec = (xl_smgr_create *) rec; - char *path = relpathperm(xlrec->rnode, MAIN_FORKNUM); + char *path = relpathperm(xlrec->rnode, xlrec->forkNum); appendStringInfo(buf, "file create: %s", path); pfree(path); |