diff options
| author | Heikki Linnakangas | 2008-08-11 11:05:11 +0000 |
|---|---|---|
| committer | Heikki Linnakangas | 2008-08-11 11:05:11 +0000 |
| commit | 3f0e808c4a487b1c12546acd80e6140d5093227b (patch) | |
| tree | 2ebd25f364f751d6591ae27f18588041dec4d978 /src/include | |
| parent | eca1388629facd9e65d2c7ce405e079ba2bc60c4 (diff) | |
Introduce the concept of relation forks. An smgr relation can now consist
of multiple forks, and each fork can be created and grown separately.
The bulk of this patch is about changing the smgr API to include an extra
ForkNumber argument in every smgr function. Also, smgrscheduleunlink and
smgrdounlink no longer implicitly call smgrclose, because other forks might
still exist after unlinking one. The callers of those functions have been
modified to call smgrclose instead.
This patch in itself doesn't have any user-visible effect, but provides the
infrastructure needed for upcoming patches. The additional forks envisioned
are a rewritten FSM implementation that doesn't rely on a fixed-size shared
memory block, and a visibility map to allow skipping portions of a table in
VACUUM that have no dead tuples.
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 c6b7d5dc114..d6f9473c5ee 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 8bfdf26697e..85271c26c3a 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 dff05c73db5..c887716e591 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 88fe0b6a95f..c5f1a0f502f 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 f1585c032a5..0c81d42e44d 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 845ef035bd5..52a69e13419 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 b1c6fd59fcb..3dc02bc400d 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 589baa0a7e5..a8861d29a8e 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 f940ae466d5..72d4aec3979 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 9638294b4a4..8ac8147ed93 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 9e9c6c023b9..d4999c1049a 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 */ |
