diff options
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/access/heapam.h | 5 | ||||
| -rw-r--r-- | src/include/access/htup.h | 3 | ||||
| -rw-r--r-- | src/include/access/xact.h | 14 | ||||
| -rw-r--r-- | src/include/access/xlog_internal.h | 3 | ||||
| -rw-r--r-- | src/include/access/xlogutils.h | 9 | ||||
| -rw-r--r-- | src/include/catalog/catalog.h | 4 | ||||
| -rw-r--r-- | src/include/postmaster/bgwriter.h | 5 | ||||
| -rw-r--r-- | src/include/storage/buf_internals.h | 16 | ||||
| -rw-r--r-- | src/include/storage/bufmgr.h | 15 | ||||
| -rw-r--r-- | src/include/storage/relfilenode.h | 30 | ||||
| -rw-r--r-- | src/include/storage/smgr.h | 66 |
11 files changed, 110 insertions, 60 deletions
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index c6b7d5dc11..d6f9473c5e 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/heapam.h,v 1.137 2008/06/19 00:46:06 alvherre Exp $ + * $PostgreSQL: pgsql/src/include/access/heapam.h,v 1.138 2008/08/11 11:05:11 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -127,7 +127,8 @@ extern XLogRecPtr log_heap_clean(Relation reln, Buffer buffer, extern XLogRecPtr log_heap_freeze(Relation reln, Buffer buffer, TransactionId cutoff_xid, OffsetNumber *offsets, int offcnt); -extern XLogRecPtr log_newpage(RelFileNode *rnode, BlockNumber blk, Page page); +extern XLogRecPtr log_newpage(RelFileNode *rnode, ForkNumber forkNum, + BlockNumber blk, Page page); /* in heap/pruneheap.c */ extern void heap_page_prune_opt(Relation relation, Buffer buffer, diff --git a/src/include/access/htup.h b/src/include/access/htup.h index 8bfdf26697..85271c26c3 100644 --- a/src/include/access/htup.h +++ b/src/include/access/htup.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/htup.h,v 1.100 2008/07/13 20:45:47 tgl Exp $ + * $PostgreSQL: pgsql/src/include/access/htup.h,v 1.101 2008/08/11 11:05:11 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -670,6 +670,7 @@ typedef struct xl_heap_clean typedef struct xl_heap_newpage { RelFileNode node; + ForkNumber forknum; BlockNumber blkno; /* location of new page */ /* entire page contents follow at end of record */ } xl_heap_newpage; diff --git a/src/include/access/xact.h b/src/include/access/xact.h index dff05c73db..c887716e59 100644 --- a/src/include/access/xact.h +++ b/src/include/access/xact.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.94 2008/03/04 19:54:06 tgl Exp $ + * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.95 2008/08/11 11:05:11 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -88,10 +88,10 @@ typedef void (*SubXactCallback) (SubXactEvent event, SubTransactionId mySubid, typedef struct xl_xact_commit { TimestampTz xact_time; /* time of commit */ - int nrels; /* number of RelFileNodes */ + int nrels; /* number of RelFileForks */ int nsubxacts; /* number of subtransaction XIDs */ - /* Array of RelFileNode(s) to drop at commit */ - RelFileNode xnodes[1]; /* VARIABLE LENGTH ARRAY */ + /* Array of RelFileFork(s) to drop at commit */ + RelFileFork xnodes[1]; /* VARIABLE LENGTH ARRAY */ /* ARRAY OF COMMITTED SUBTRANSACTION XIDs FOLLOWS */ } xl_xact_commit; @@ -100,10 +100,10 @@ typedef struct xl_xact_commit typedef struct xl_xact_abort { TimestampTz xact_time; /* time of abort */ - int nrels; /* number of RelFileNodes */ + int nrels; /* number of RelFileForks */ int nsubxacts; /* number of subtransaction XIDs */ - /* Array of RelFileNode(s) to drop at abort */ - RelFileNode xnodes[1]; /* VARIABLE LENGTH ARRAY */ + /* Array of RelFileFork(s) to drop at abort */ + RelFileFork xnodes[1]; /* VARIABLE LENGTH ARRAY */ /* ARRAY OF ABORTED SUBTRANSACTION XIDs FOLLOWS */ } xl_xact_abort; diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h index 88fe0b6a95..c5f1a0f502 100644 --- a/src/include/access/xlog_internal.h +++ b/src/include/access/xlog_internal.h @@ -11,7 +11,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/xlog_internal.h,v 1.23 2008/02/17 02:09:30 tgl Exp $ + * $PostgreSQL: pgsql/src/include/access/xlog_internal.h,v 1.24 2008/08/11 11:05:11 heikki Exp $ */ #ifndef XLOG_INTERNAL_H #define XLOG_INTERNAL_H @@ -40,6 +40,7 @@ typedef struct BkpBlock { RelFileNode node; /* relation containing block */ + ForkNumber fork; /* fork within the relation */ BlockNumber block; /* block number */ uint16 hole_offset; /* number of bytes before "hole" */ uint16 hole_length; /* number of bytes in "hole" */ diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index f1585c032a..0c81d42e44 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/xlogutils.h,v 1.25 2008/06/19 00:46:06 alvherre Exp $ + * $PostgreSQL: pgsql/src/include/access/xlogutils.h,v 1.26 2008/08/11 11:05:11 heikki Exp $ */ #ifndef XLOG_UTILS_H #define XLOG_UTILS_H @@ -19,11 +19,14 @@ extern void XLogCheckInvalidPages(void); -extern void XLogDropRelation(RelFileNode rnode); +extern void XLogDropRelation(RelFileNode rnode, ForkNumber forknum); extern void XLogDropDatabase(Oid dbid); -extern void XLogTruncateRelation(RelFileNode rnode, BlockNumber nblocks); +extern void XLogTruncateRelation(RelFileNode rnode, ForkNumber forkNum, + BlockNumber nblocks); extern Buffer XLogReadBuffer(RelFileNode rnode, BlockNumber blkno, bool init); +extern Buffer XLogReadBufferWithFork(RelFileNode rnode, ForkNumber forknum, + BlockNumber blkno, bool init); extern Relation CreateFakeRelcacheEntry(RelFileNode rnode); extern void FreeFakeRelcacheEntry(Relation fakerel); diff --git a/src/include/catalog/catalog.h b/src/include/catalog/catalog.h index 845ef035bd..52a69e1341 100644 --- a/src/include/catalog/catalog.h +++ b/src/include/catalog/catalog.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/catalog/catalog.h,v 1.40 2008/06/19 00:46:06 alvherre Exp $ + * $PostgreSQL: pgsql/src/include/catalog/catalog.h,v 1.41 2008/08/11 11:05:11 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -19,7 +19,7 @@ #include "utils/relcache.h" -extern char *relpath(RelFileNode rnode); +extern char *relpath(RelFileNode rnode, ForkNumber forknum); extern char *GetDatabasePath(Oid dbNode, Oid spcNode); extern bool IsSystemRelation(Relation relation); diff --git a/src/include/postmaster/bgwriter.h b/src/include/postmaster/bgwriter.h index b1c6fd59fc..3dc02bc400 100644 --- a/src/include/postmaster/bgwriter.h +++ b/src/include/postmaster/bgwriter.h @@ -5,7 +5,7 @@ * * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/include/postmaster/bgwriter.h,v 1.11 2008/01/01 19:45:58 momjian Exp $ + * $PostgreSQL: pgsql/src/include/postmaster/bgwriter.h,v 1.12 2008/08/11 11:05:11 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -27,7 +27,8 @@ extern void BackgroundWriterMain(void); extern void RequestCheckpoint(int flags); extern void CheckpointWriteDelay(int flags, double progress); -extern bool ForwardFsyncRequest(RelFileNode rnode, BlockNumber segno); +extern bool ForwardFsyncRequest(RelFileNode rnode, ForkNumber forknum, + BlockNumber segno); extern void AbsorbFsyncRequests(void); extern Size BgWriterShmemSize(void); diff --git a/src/include/storage/buf_internals.h b/src/include/storage/buf_internals.h index 589baa0a7e..a8861d29a8 100644 --- a/src/include/storage/buf_internals.h +++ b/src/include/storage/buf_internals.h @@ -8,7 +8,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/storage/buf_internals.h,v 1.97 2008/06/19 00:46:06 alvherre Exp $ + * $PostgreSQL: pgsql/src/include/storage/buf_internals.h,v 1.98 2008/08/11 11:05:11 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -65,6 +65,7 @@ typedef bits16 BufFlags; typedef struct buftag { RelFileNode rnode; /* physical relation identifier */ + ForkNumber forkNum; BlockNumber blockNum; /* blknum relative to begin of reln */ } BufferTag; @@ -73,19 +74,22 @@ typedef struct buftag (a).rnode.spcNode = InvalidOid, \ (a).rnode.dbNode = InvalidOid, \ (a).rnode.relNode = InvalidOid, \ + (a).forkNum = InvalidForkNumber, \ (a).blockNum = InvalidBlockNumber \ ) -#define INIT_BUFFERTAG(a,xx_rnode,xx_blockNum) \ +#define INIT_BUFFERTAG(a,xx_rnode,xx_forkNum,xx_blockNum) \ ( \ (a).rnode = (xx_rnode), \ + (a).forkNum = (xx_forkNum), \ (a).blockNum = (xx_blockNum) \ ) #define BUFFERTAGS_EQUAL(a,b) \ ( \ RelFileNodeEquals((a).rnode, (b).rnode) && \ - (a).blockNum == (b).blockNum \ + (a).blockNum == (b).blockNum && \ + (a).forkNum == (b).forkNum \ ) /* @@ -202,10 +206,10 @@ extern int BufTableInsert(BufferTag *tagPtr, uint32 hashcode, int buf_id); extern void BufTableDelete(BufferTag *tagPtr, uint32 hashcode); /* localbuf.c */ -extern BufferDesc *LocalBufferAlloc(SMgrRelation reln, BlockNumber blockNum, - bool *foundPtr); +extern BufferDesc *LocalBufferAlloc(SMgrRelation reln, ForkNumber forkNum, + BlockNumber blockNum, bool *foundPtr); extern void MarkLocalBufferDirty(Buffer buffer); -extern void DropRelFileNodeLocalBuffers(RelFileNode rnode, +extern void DropRelFileNodeLocalBuffers(RelFileNode rnode, ForkNumber forkNum, BlockNumber firstDelBlock); extern void AtEOXact_LocalBuffers(bool isCommit); diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h index f940ae466d..72d4aec397 100644 --- a/src/include/storage/bufmgr.h +++ b/src/include/storage/bufmgr.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.114 2008/06/19 00:46:06 alvherre Exp $ + * $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.115 2008/08/11 11:05:11 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -144,11 +144,13 @@ extern PGDLLIMPORT int32 *LocalRefCount; * prototypes for functions in bufmgr.c */ extern Buffer ReadBuffer(Relation reln, BlockNumber blockNum); +extern Buffer ReadBufferWithFork(Relation reln, ForkNumber forkNum, BlockNumber blockNum); extern Buffer ReadBufferWithStrategy(Relation reln, BlockNumber blockNum, BufferAccessStrategy strategy); -extern Buffer ReadOrZeroBuffer(Relation reln, BlockNumber blockNum); +extern Buffer ReadOrZeroBuffer(Relation reln, ForkNumber forkNum, + BlockNumber blockNum); extern Buffer ReadBufferWithoutRelcache(RelFileNode rnode, bool isTemp, - BlockNumber blockNum, bool zeroPage); + ForkNumber forkNum, BlockNumber blockNum, bool zeroPage); extern void ReleaseBuffer(Buffer buffer); extern void UnlockReleaseBuffer(Buffer buffer); extern void MarkBufferDirty(Buffer buffer); @@ -169,15 +171,16 @@ extern BlockNumber RelationGetNumberOfBlocks(Relation relation); extern void RelationTruncate(Relation rel, BlockNumber nblocks); extern void FlushRelationBuffers(Relation rel); extern void FlushDatabaseBuffers(Oid dbid); -extern void DropRelFileNodeBuffers(RelFileNode rnode, bool istemp, - BlockNumber firstDelBlock); +extern void DropRelFileNodeBuffers(RelFileNode rnode, ForkNumber forkNum, + bool istemp, BlockNumber firstDelBlock); extern void DropDatabaseBuffers(Oid dbid); #ifdef NOT_USED extern void PrintPinnedBufs(void); #endif extern Size BufferShmemSize(void); -extern RelFileNode BufferGetFileNode(Buffer buffer); +extern void BufferGetTag(Buffer buffer, RelFileNode *rnode, + ForkNumber *forknum, BlockNumber *blknum); extern void SetBufferCommitInfoNeedsSave(Buffer buffer); diff --git a/src/include/storage/relfilenode.h b/src/include/storage/relfilenode.h index 9638294b4a..8ac8147ed9 100644 --- a/src/include/storage/relfilenode.h +++ b/src/include/storage/relfilenode.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/storage/relfilenode.h,v 1.15 2008/01/01 19:45:59 momjian Exp $ + * $PostgreSQL: pgsql/src/include/storage/relfilenode.h,v 1.16 2008/08/11 11:05:11 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -15,8 +15,25 @@ #define RELFILENODE_H /* + * The physical storage of a relation consists of one or more forks. The + * main fork is always created, but in addition to that there can be + * additional forks for storing various metadata. ForkNumber is used when + * we need to refer to a specific fork in a relation. + */ +typedef enum ForkNumber +{ + InvalidForkNumber = -1, + MAIN_FORKNUM = 0 + /* NOTE: change NUM_FORKS below when you add new forks */ +} ForkNumber; + +#define MAX_FORKNUM MAIN_FORKNUM + +/* * RelFileNode must provide all that we need to know to physically access - * a relation. + * a relation. Note, however, that a "physical" relation is comprised of + * multiple files on the filesystem, as each fork is stored as a separate + * file, and each fork can be divided into multiple segments. See md.c. * * spcNode identifies the tablespace of the relation. It corresponds to * pg_tablespace.oid. @@ -57,4 +74,13 @@ typedef struct RelFileNode (node1).dbNode == (node2).dbNode && \ (node1).spcNode == (node2).spcNode) +/* + * RelFileFork identifies a particular fork of a relation. + */ +typedef struct RelFileFork +{ + RelFileNode rnode; + ForkNumber forknum; +} RelFileFork; + #endif /* RELFILENODE_H */ diff --git a/src/include/storage/smgr.h b/src/include/storage/smgr.h index 9e9c6c023b..d4999c1049 100644 --- a/src/include/storage/smgr.h +++ b/src/include/storage/smgr.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/storage/smgr.h,v 1.62 2008/01/01 19:45:59 momjian Exp $ + * $PostgreSQL: pgsql/src/include/storage/smgr.h,v 1.63 2008/08/11 11:05:11 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -51,7 +51,8 @@ typedef struct SMgrRelationData */ int smgr_which; /* storage manager selector */ - struct _MdfdVec *md_fd; /* for md.c; NULL if not open */ + /* for md.c; NULL for forks that are not open */ + struct _MdfdVec *md_fd[MAX_FORKNUM + 1]; } SMgrRelationData; typedef SMgrRelationData *SMgrRelation; @@ -59,24 +60,29 @@ typedef SMgrRelationData *SMgrRelation; extern void smgrinit(void); extern SMgrRelation smgropen(RelFileNode rnode); +extern bool smgrexists(SMgrRelation reln, ForkNumber forknum); extern void smgrsetowner(SMgrRelation *owner, SMgrRelation reln); extern void smgrclose(SMgrRelation reln); extern void smgrcloseall(void); extern void smgrclosenode(RelFileNode rnode); -extern void smgrcreate(SMgrRelation reln, bool isTemp, bool isRedo); -extern void smgrscheduleunlink(SMgrRelation reln, bool isTemp); -extern void smgrdounlink(SMgrRelation reln, bool isTemp, bool isRedo); -extern void smgrextend(SMgrRelation reln, BlockNumber blocknum, char *buffer, - bool isTemp); -extern void smgrread(SMgrRelation reln, BlockNumber blocknum, char *buffer); -extern void smgrwrite(SMgrRelation reln, BlockNumber blocknum, char *buffer, - bool isTemp); -extern BlockNumber smgrnblocks(SMgrRelation reln); -extern void smgrtruncate(SMgrRelation reln, BlockNumber nblocks, - bool isTemp); -extern void smgrimmedsync(SMgrRelation reln); +extern void smgrcreate(SMgrRelation reln, ForkNumber forknum, + bool isTemp, bool isRedo); +extern void smgrscheduleunlink(SMgrRelation reln, ForkNumber forknum, + bool isTemp); +extern void smgrdounlink(SMgrRelation reln, ForkNumber forknum, + bool isTemp, bool isRedo); +extern void smgrextend(SMgrRelation reln, ForkNumber forknum, + BlockNumber blocknum, char *buffer, bool isTemp); +extern void smgrread(SMgrRelation reln, ForkNumber forknum, + BlockNumber blocknum, char *buffer); +extern void smgrwrite(SMgrRelation reln, ForkNumber forknum, + BlockNumber blocknum, char *buffer, bool isTemp); +extern BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum); +extern void smgrtruncate(SMgrRelation reln, ForkNumber forknum, + BlockNumber nblocks, bool isTemp); +extern void smgrimmedsync(SMgrRelation reln, ForkNumber forknum); extern void smgrDoPendingDeletes(bool isCommit); -extern int smgrGetPendingDeletes(bool forCommit, RelFileNode **ptr, +extern int smgrGetPendingDeletes(bool forCommit, RelFileFork **ptr, bool *haveNonTemp); extern void AtSubCommit_smgr(void); extern void AtSubAbort_smgr(void); @@ -95,23 +101,27 @@ extern void smgr_desc(StringInfo buf, uint8 xl_info, char *rec); /* in md.c */ extern void mdinit(void); -extern void mdclose(SMgrRelation reln); -extern void mdcreate(SMgrRelation reln, bool isRedo); -extern void mdunlink(RelFileNode rnode, bool isRedo); -extern void mdextend(SMgrRelation reln, BlockNumber blocknum, char *buffer, - bool isTemp); -extern void mdread(SMgrRelation reln, BlockNumber blocknum, char *buffer); -extern void mdwrite(SMgrRelation reln, BlockNumber blocknum, char *buffer, - bool isTemp); -extern BlockNumber mdnblocks(SMgrRelation reln); -extern void mdtruncate(SMgrRelation reln, BlockNumber nblocks, bool isTemp); -extern void mdimmedsync(SMgrRelation reln); +extern void mdclose(SMgrRelation reln, ForkNumber forknum); +extern void mdcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo); +extern bool mdexists(SMgrRelation reln, ForkNumber forknum); +extern void mdunlink(RelFileNode rnode, ForkNumber forknum, bool isRedo); +extern void mdextend(SMgrRelation reln, ForkNumber forknum, + BlockNumber blocknum, char *buffer, bool isTemp); +extern void mdread(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, + char *buffer); +extern void mdwrite(SMgrRelation reln, ForkNumber forknum, + BlockNumber blocknum, char *buffer, bool isTemp); +extern BlockNumber mdnblocks(SMgrRelation reln, ForkNumber forknum); +extern void mdtruncate(SMgrRelation reln, ForkNumber forknum, + BlockNumber nblocks, bool isTemp); +extern void mdimmedsync(SMgrRelation reln, ForkNumber forknum); extern void mdpreckpt(void); extern void mdsync(void); extern void mdpostckpt(void); -extern void RememberFsyncRequest(RelFileNode rnode, BlockNumber segno); -extern void ForgetRelationFsyncRequests(RelFileNode rnode); +extern void RememberFsyncRequest(RelFileNode rnode, ForkNumber forknum, + BlockNumber segno); +extern void ForgetRelationFsyncRequests(RelFileNode rnode, ForkNumber forknum); extern void ForgetDatabaseFsyncRequests(Oid dbid); /* smgrtype.c */ |
