No more #ifdef XLOG.
This commit is contained in:
parent
b16516b887
commit
81c8c244b2
@ -6,7 +6,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/gist/gist.c,v 1.66 2000/11/21 21:15:53 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/gist/gist.c,v 1.67 2000/11/30 08:46:20 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -23,9 +23,7 @@
|
||||
#include "miscadmin.h"
|
||||
#include "utils/syscache.h"
|
||||
|
||||
#ifdef XLOG
|
||||
#include "access/xlogutils.h"
|
||||
#endif
|
||||
|
||||
/* non-export function prototypes */
|
||||
static InsertIndexResult gistdoinsert(Relation r, IndexTuple itup,
|
||||
@ -1348,7 +1346,6 @@ int_range_out(INTRANGE *r)
|
||||
|
||||
#endif /* defined GISTDEBUG */
|
||||
|
||||
#ifdef XLOG
|
||||
void
|
||||
gist_redo(XLogRecPtr lsn, XLogRecord *record)
|
||||
{
|
||||
@ -1365,4 +1362,3 @@ void
|
||||
gist_desc(char *buf, uint8 xl_info, char* rec)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/hash/hash.c,v 1.45 2000/11/21 21:15:54 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/hash/hash.c,v 1.46 2000/11/30 08:46:20 vadim Exp $
|
||||
*
|
||||
* NOTES
|
||||
* This file contains only the public interface routines.
|
||||
@ -27,9 +27,7 @@
|
||||
|
||||
bool BuildingHash = false;
|
||||
|
||||
#ifdef XLOG
|
||||
#include "access/xlogutils.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
@ -482,7 +480,6 @@ hashdelete(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
||||
#ifdef XLOG
|
||||
void
|
||||
hash_redo(XLogRecPtr lsn, XLogRecord *record)
|
||||
{
|
||||
@ -499,4 +496,3 @@ void
|
||||
hash_desc(char *buf, uint8 xl_info, char* rec)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.96 2000/11/21 21:15:54 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.97 2000/11/30 08:46:20 vadim Exp $
|
||||
*
|
||||
*
|
||||
* INTERFACE ROUTINES
|
||||
@ -86,7 +86,6 @@
|
||||
#include "utils/inval.h"
|
||||
#include "utils/relcache.h"
|
||||
|
||||
#ifdef XLOG
|
||||
#include "access/xlogutils.h"
|
||||
|
||||
XLogRecPtr log_heap_move(Relation reln, ItemPointerData from, HeapTuple newtup);
|
||||
@ -99,8 +98,6 @@ static XLogRecPtr log_heap_update(Relation reln, ItemPointerData from,
|
||||
|
||||
static void HeapPageCleanup(Buffer buffer);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* heap support routines
|
||||
@ -1370,7 +1367,6 @@ heap_insert(Relation relation, HeapTuple tup)
|
||||
/* NO ELOG(ERROR) from here till changes are logged */
|
||||
RelationPutHeapTuple(relation, buffer, tup);
|
||||
|
||||
#ifdef XLOG
|
||||
/* XLOG stuff */
|
||||
{
|
||||
xl_heap_insert xlrec;
|
||||
@ -1392,7 +1388,6 @@ heap_insert(Relation relation, HeapTuple tup)
|
||||
PageSetLSN(BufferGetPage(buffer), recptr);
|
||||
PageSetSUI(BufferGetPage(buffer), ThisStartUpID);
|
||||
}
|
||||
#endif
|
||||
|
||||
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
|
||||
WriteBuffer(buffer);
|
||||
@ -1485,7 +1480,6 @@ l1:
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef XLOG
|
||||
/* XLOG stuff */
|
||||
{
|
||||
xl_heap_delete xlrec;
|
||||
@ -1500,7 +1494,6 @@ l1:
|
||||
PageSetLSN(dp, recptr);
|
||||
PageSetSUI(dp, ThisStartUpID);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* store transaction information of xact deleting the tuple */
|
||||
TransactionIdStore(GetCurrentTransactionId(), &(tp.t_data->t_xmax));
|
||||
@ -1638,7 +1631,6 @@ l2:
|
||||
newbuf = buffer;
|
||||
else
|
||||
{
|
||||
#ifdef XLOG
|
||||
/*
|
||||
* We have to unlock old tuple buffer before extending table
|
||||
* file but have to keep lock on the old tuple. To avoid second
|
||||
@ -1650,7 +1642,7 @@ l2:
|
||||
_locked_tuple_.node = relation->rd_node;
|
||||
_locked_tuple_.tid = *otid;
|
||||
XactPushRollback(_heap_unlock_tuple, (void*) &_locked_tuple_);
|
||||
#endif
|
||||
|
||||
TransactionIdStore(GetCurrentTransactionId(), &(oldtup.t_data->t_xmax));
|
||||
oldtup.t_data->t_cmax = GetCurrentCommandId();
|
||||
oldtup.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED |
|
||||
@ -1677,15 +1669,12 @@ l2:
|
||||
else
|
||||
{
|
||||
oldtup.t_data->t_infomask &= ~HEAP_XMAX_UNLOGGED;
|
||||
#ifdef XLOG
|
||||
XactPopRollback();
|
||||
#endif
|
||||
}
|
||||
|
||||
/* record address of new tuple in t_ctid of old one */
|
||||
oldtup.t_data->t_ctid = newtup->t_self;
|
||||
|
||||
#ifdef XLOG
|
||||
/* XLOG stuff */
|
||||
{
|
||||
XLogRecPtr recptr = log_heap_update(relation,
|
||||
@ -1699,7 +1688,6 @@ l2:
|
||||
PageSetLSN(BufferGetPage(buffer), recptr);
|
||||
PageSetSUI(BufferGetPage(buffer), ThisStartUpID);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (newbuf != buffer)
|
||||
{
|
||||
@ -1791,13 +1779,11 @@ l3:
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef XLOG
|
||||
/*
|
||||
* XLOG stuff: no logging is required as long as we have no
|
||||
* savepoints. For savepoints private log could be used...
|
||||
*/
|
||||
((PageHeader) BufferGetPage(*buffer))->pd_sui = ThisStartUpID;
|
||||
#endif
|
||||
|
||||
/* store transaction information of xact marking the tuple */
|
||||
TransactionIdStore(GetCurrentTransactionId(), &(tuple->t_data->t_xmax));
|
||||
@ -1984,8 +1970,6 @@ heap_restrpos(HeapScanDesc scan)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef XLOG
|
||||
|
||||
static XLogRecPtr
|
||||
log_heap_update(Relation reln, ItemPointerData from,
|
||||
HeapTuple newtup, bool move)
|
||||
@ -2634,5 +2618,3 @@ heap_desc(char *buf, uint8 xl_info, char* rec)
|
||||
else
|
||||
strcat(buf, "UNKNOWN");
|
||||
}
|
||||
|
||||
#endif /* XLOG */
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.68 2000/11/16 05:50:58 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.69 2000/11/30 08:46:21 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -61,9 +61,7 @@ static void _bt_pgaddtup(Relation rel, Page page,
|
||||
static bool _bt_isequal(TupleDesc itupdesc, Page page, OffsetNumber offnum,
|
||||
int keysz, ScanKey scankey);
|
||||
|
||||
#ifdef XLOG
|
||||
static Relation _xlheapRel; /* temporary hack */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* _bt_doinsert() -- Handle insertion of a single btitem in the tree.
|
||||
@ -123,9 +121,7 @@ top:
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef XLOG
|
||||
_xlheapRel = heapRel; /* temporary hack */
|
||||
#endif
|
||||
|
||||
/* do the insertion */
|
||||
res = _bt_insertonpg(rel, buf, stack, natts, itup_scankey, btitem, 0);
|
||||
@ -522,7 +518,6 @@ _bt_insertonpg(Relation rel,
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef XLOG
|
||||
/* XLOG stuff */
|
||||
{
|
||||
char xlbuf[sizeof(xl_btree_insert) +
|
||||
@ -562,7 +557,7 @@ _bt_insertonpg(Relation rel,
|
||||
PageSetLSN(page, recptr);
|
||||
PageSetSUI(page, ThisStartUpID);
|
||||
}
|
||||
#endif
|
||||
|
||||
_bt_pgaddtup(rel, page, itemsz, btitem, newitemoff, "page");
|
||||
itup_off = newitemoff;
|
||||
itup_blkno = BufferGetBlockNumber(buf);
|
||||
@ -612,10 +607,7 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
|
||||
rightoff;
|
||||
OffsetNumber maxoff;
|
||||
OffsetNumber i;
|
||||
|
||||
#ifdef XLOG
|
||||
BTItem lhikey;
|
||||
#endif
|
||||
|
||||
rbuf = _bt_getbuf(rel, P_NEW, BT_WRITE);
|
||||
origpage = BufferGetPage(buf);
|
||||
@ -685,9 +677,7 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
|
||||
itemsz = ItemIdGetLength(itemid);
|
||||
item = (BTItem) PageGetItem(origpage, itemid);
|
||||
}
|
||||
#ifdef XLOG
|
||||
lhikey = item;
|
||||
#endif
|
||||
if (PageAddItem(leftpage, (Item) item, itemsz, leftoff,
|
||||
LP_USED) == InvalidOffsetNumber)
|
||||
elog(STOP, "btree: failed to add hikey to the left sibling");
|
||||
@ -775,7 +765,6 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
|
||||
spage = BufferGetPage(sbuf);
|
||||
}
|
||||
|
||||
#ifdef XLOG
|
||||
/*
|
||||
* Right sibling is locked, new siblings are prepared, but original
|
||||
* page is not updated yet. Log changes before continuing.
|
||||
@ -860,7 +849,6 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
|
||||
PageSetSUI(spage, ThisStartUpID);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* By here, the original data page has been split into two new halves,
|
||||
@ -1165,19 +1153,13 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
|
||||
BTItem item;
|
||||
Size itemsz;
|
||||
BTItem new_item;
|
||||
|
||||
#ifdef XLOG
|
||||
Buffer metabuf;
|
||||
#endif
|
||||
|
||||
/* get a new root page */
|
||||
rootbuf = _bt_getbuf(rel, P_NEW, BT_WRITE);
|
||||
rootpage = BufferGetPage(rootbuf);
|
||||
rootblknum = BufferGetBlockNumber(rootbuf);
|
||||
|
||||
#ifdef XLOG
|
||||
metabuf = _bt_getbuf(rel, BTREE_METAPAGE,BT_WRITE);
|
||||
#endif
|
||||
|
||||
/* NO ELOG(ERROR) from here till newroot op is logged */
|
||||
|
||||
@ -1237,7 +1219,6 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
|
||||
elog(STOP, "btree: failed to add rightkey to new root page");
|
||||
pfree(new_item);
|
||||
|
||||
#ifdef XLOG
|
||||
/* XLOG stuff */
|
||||
{
|
||||
xl_btree_newroot xlrec;
|
||||
@ -1267,16 +1248,10 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
|
||||
|
||||
_bt_wrtbuf(rel, metabuf);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* write and let go of the new root buffer */
|
||||
_bt_wrtbuf(rel, rootbuf);
|
||||
|
||||
#ifndef XLOG
|
||||
/* update metadata page with new root block number */
|
||||
_bt_metaproot(rel, rootblknum, 0);
|
||||
#endif
|
||||
|
||||
/* update and release new sibling, and finally the old root */
|
||||
_bt_wrtbuf(rel, rbuf);
|
||||
_bt_wrtbuf(rel, lbuf);
|
||||
|
@ -9,7 +9,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v 1.41 2000/11/30 01:39:06 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v 1.42 2000/11/30 08:46:21 vadim Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Postgres btree pages look like ordinary relation pages. The opaque
|
||||
@ -170,7 +170,6 @@ _bt_getroot(Relation rel, int access)
|
||||
rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpage);
|
||||
rootopaque->btpo_flags |= (BTP_LEAF | BTP_ROOT);
|
||||
|
||||
#ifdef XLOG
|
||||
/* XLOG stuff */
|
||||
{
|
||||
xl_btree_newroot xlrec;
|
||||
@ -187,7 +186,6 @@ _bt_getroot(Relation rel, int access)
|
||||
PageSetLSN(metapg, recptr);
|
||||
PageSetSUI(metapg, ThisStartUpID);
|
||||
}
|
||||
#endif
|
||||
|
||||
metad->btm_root = rootblkno;
|
||||
metad->btm_level = 1;
|
||||
@ -403,7 +401,6 @@ _bt_pagedel(Relation rel, ItemPointer tid)
|
||||
buf = _bt_getbuf(rel, blkno, BT_WRITE);
|
||||
page = BufferGetPage(buf);
|
||||
|
||||
#ifdef XLOG
|
||||
/* XLOG stuff */
|
||||
{
|
||||
xl_btree_delete xlrec;
|
||||
@ -417,7 +414,6 @@ _bt_pagedel(Relation rel, ItemPointer tid)
|
||||
PageSetLSN(page, recptr);
|
||||
PageSetSUI(page, ThisStartUpID);
|
||||
}
|
||||
#endif
|
||||
|
||||
PageIndexTupleDelete(page, offno);
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.71 2000/11/21 21:15:55 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.72 2000/11/30 08:46:21 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -32,11 +32,8 @@ bool BuildingBtree = false; /* see comment in btbuild() */
|
||||
bool FastBuild = true; /* use sort/build instead of insertion
|
||||
* build */
|
||||
|
||||
#ifdef XLOG
|
||||
#include "access/xlogutils.h"
|
||||
|
||||
#endif
|
||||
|
||||
static void _bt_restscan(IndexScanDesc scan);
|
||||
|
||||
/*
|
||||
@ -733,8 +730,6 @@ _bt_restscan(IndexScanDesc scan)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef XLOG
|
||||
|
||||
static bool
|
||||
_bt_cleanup_page(Page page, RelFileNode hnode)
|
||||
{
|
||||
@ -1529,5 +1524,3 @@ btree_desc(char *buf, uint8 xl_info, char* rec)
|
||||
else
|
||||
strcat(buf, "UNKNOWN");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtree.c,v 1.56 2000/11/21 21:15:55 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtree.c,v 1.57 2000/11/30 08:46:21 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -22,9 +22,7 @@
|
||||
#include "executor/executor.h"
|
||||
#include "miscadmin.h"
|
||||
|
||||
#ifdef XLOG
|
||||
#include "access/xlogutils.h"
|
||||
#endif
|
||||
|
||||
typedef struct SPLITVEC
|
||||
{
|
||||
@ -1069,7 +1067,6 @@ _rtdump(Relation r)
|
||||
|
||||
#endif /* defined RTDEBUG */
|
||||
|
||||
#ifdef XLOG
|
||||
void
|
||||
rtree_redo(XLogRecPtr lsn, XLogRecord *record)
|
||||
{
|
||||
@ -1086,4 +1083,3 @@ void
|
||||
rtree_desc(char *buf, uint8 xl_info, char* rec)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
@ -27,4 +27,3 @@ RmgrData RmgrTable[] = {
|
||||
{"Gist", gist_redo, gist_undo, gist_desc},
|
||||
{"Sequence", seq_redo, seq_undo, seq_desc}
|
||||
};
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/transam.c,v 1.37 2000/11/21 21:15:57 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/transam.c,v 1.38 2000/11/30 08:46:22 vadim Exp $
|
||||
*
|
||||
* NOTES
|
||||
* This file contains the high level access-method interface to the
|
||||
@ -424,23 +424,12 @@ InitializeTransactionLog(void)
|
||||
SpinAcquire(OidGenLockId);
|
||||
if (!TransactionIdDidCommit(AmiTransactionId))
|
||||
{
|
||||
|
||||
/* ----------------
|
||||
* SOMEDAY initialize the information stored in
|
||||
* the headers of the log/variable relations.
|
||||
* ----------------
|
||||
*/
|
||||
TransactionLogUpdate(AmiTransactionId, XID_COMMIT);
|
||||
TransactionIdStore(AmiTransactionId, &cachedTestXid);
|
||||
cachedTestXidStatus = XID_COMMIT;
|
||||
#ifdef XLOG
|
||||
Assert(!IsUnderPostmaster &&
|
||||
ShmemVariableCache->nextXid <= FirstTransactionId);
|
||||
ShmemVariableCache->nextXid = FirstTransactionId;
|
||||
#else
|
||||
VariableRelationPutNextXid(FirstTransactionId);
|
||||
#endif
|
||||
|
||||
}
|
||||
else if (RecoveryCheckingEnabled())
|
||||
{
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/Attic/transsup.c,v 1.26 2000/10/28 16:20:53 vadim Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/Attic/transsup.c,v 1.27 2000/11/30 08:46:22 vadim Exp $
|
||||
*
|
||||
* NOTES
|
||||
* This file contains support functions for the high
|
||||
@ -186,9 +186,7 @@ TransBlockGetXidStatus(Block tblock,
|
||||
bits8 bit2;
|
||||
BitIndex offset;
|
||||
|
||||
#ifdef XLOG
|
||||
tblock = (Block) ((char*) tblock + sizeof(XLogRecPtr));
|
||||
#endif
|
||||
|
||||
/* ----------------
|
||||
* calculate the index into the transaction data where
|
||||
@ -231,9 +229,7 @@ TransBlockSetXidStatus(Block tblock,
|
||||
Index index;
|
||||
BitIndex offset;
|
||||
|
||||
#ifdef XLOG
|
||||
tblock = (Block) ((char*) tblock + sizeof(XLogRecPtr));
|
||||
#endif
|
||||
|
||||
/* ----------------
|
||||
* calculate the index into the transaction data where
|
||||
|
@ -1,290 +1,51 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* varsup.c
|
||||
* postgres variable relation support routines
|
||||
*
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
* postgres OID & XID variables support routines
|
||||
*
|
||||
* Copyright (c) 2000, PostgreSQL, Inc
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.33 2000/11/20 16:47:30 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.34 2000/11/30 08:46:22 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
|
||||
#ifdef XLOG
|
||||
#include "xlog_varsup.c"
|
||||
#else
|
||||
|
||||
#include "access/heapam.h"
|
||||
#include "catalog/catname.h"
|
||||
#include "access/transam.h"
|
||||
#include "storage/proc.h"
|
||||
|
||||
static void GetNewObjectIdBlock(Oid *oid_return, int oid_block_size);
|
||||
static void VariableRelationGetNextOid(Oid *oid_return);
|
||||
static void VariableRelationGetNextXid(TransactionId *xidP);
|
||||
static void VariableRelationPutNextOid(Oid oid);
|
||||
SPINLOCK OidGenLockId;
|
||||
|
||||
/* ---------------------
|
||||
* spin lock for oid generation
|
||||
* ---------------------
|
||||
*/
|
||||
int OidGenLockId;
|
||||
extern SPINLOCK XidGenLockId;
|
||||
extern void XLogPutNextOid(Oid nextOid);
|
||||
|
||||
/* ---------------------
|
||||
* pointer to "variable cache" in shared memory (set up by shmem.c)
|
||||
* ---------------------
|
||||
*/
|
||||
/* pointer to "variable cache" in shared memory (set up by shmem.c) */
|
||||
VariableCache ShmemVariableCache = NULL;
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* variable relation query/update routines
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* --------------------------------
|
||||
* VariableRelationGetNextXid
|
||||
* --------------------------------
|
||||
*/
|
||||
static void
|
||||
VariableRelationGetNextXid(TransactionId *xidP)
|
||||
{
|
||||
Buffer buf;
|
||||
VariableRelationContents var;
|
||||
|
||||
/* ----------------
|
||||
* We assume that a spinlock has been acquired to guarantee
|
||||
* exclusive access to the variable relation.
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
/* ----------------
|
||||
* do nothing before things are initialized
|
||||
* ----------------
|
||||
*/
|
||||
if (!RelationIsValid(VariableRelation))
|
||||
return;
|
||||
|
||||
/* ----------------
|
||||
* read the variable page, get the the nextXid field and
|
||||
* release the buffer
|
||||
* ----------------
|
||||
*/
|
||||
buf = ReadBuffer(VariableRelation, 0);
|
||||
|
||||
if (!BufferIsValid(buf))
|
||||
{
|
||||
SpinRelease(OidGenLockId);
|
||||
elog(ERROR, "VariableRelationGetNextXid: ReadBuffer failed");
|
||||
}
|
||||
|
||||
var = (VariableRelationContents) BufferGetBlock(buf);
|
||||
|
||||
TransactionIdStore(var->nextXidData, xidP);
|
||||
|
||||
ReleaseBuffer(buf);
|
||||
}
|
||||
|
||||
/* --------------------------------
|
||||
* VariableRelationPutNextXid
|
||||
* --------------------------------
|
||||
*/
|
||||
void
|
||||
VariableRelationPutNextXid(TransactionId xid)
|
||||
{
|
||||
Buffer buf;
|
||||
VariableRelationContents var;
|
||||
|
||||
/* ----------------
|
||||
* We assume that a spinlock has been acquired to guarantee
|
||||
* exclusive access to the variable relation.
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
/* ----------------
|
||||
* do nothing before things are initialized
|
||||
* ----------------
|
||||
*/
|
||||
if (!RelationIsValid(VariableRelation))
|
||||
return;
|
||||
|
||||
/* ----------------
|
||||
* read the variable page, update the nextXid field and
|
||||
* write the page back out to disk (with immediate write).
|
||||
* ----------------
|
||||
*/
|
||||
buf = ReadBuffer(VariableRelation, 0);
|
||||
|
||||
if (!BufferIsValid(buf))
|
||||
{
|
||||
SpinRelease(OidGenLockId);
|
||||
elog(ERROR, "VariableRelationPutNextXid: ReadBuffer failed");
|
||||
}
|
||||
|
||||
var = (VariableRelationContents) BufferGetBlock(buf);
|
||||
|
||||
TransactionIdStore(xid, &(var->nextXidData));
|
||||
|
||||
FlushBuffer(buf, true, true);
|
||||
}
|
||||
|
||||
/* --------------------------------
|
||||
* VariableRelationGetNextOid
|
||||
* --------------------------------
|
||||
*/
|
||||
static void
|
||||
VariableRelationGetNextOid(Oid *oid_return)
|
||||
{
|
||||
Buffer buf;
|
||||
VariableRelationContents var;
|
||||
|
||||
/* ----------------
|
||||
* We assume that a spinlock has been acquired to guarantee
|
||||
* exclusive access to the variable relation.
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
/* ----------------
|
||||
* if the variable relation is not initialized, then we
|
||||
* assume we are running at bootstrap time and so we return
|
||||
* an invalid object id (this path should never be taken, probably).
|
||||
* ----------------
|
||||
*/
|
||||
if (!RelationIsValid(VariableRelation))
|
||||
{
|
||||
(*oid_return) = InvalidOid;
|
||||
return;
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
* read the variable page, get the the nextOid field and
|
||||
* release the buffer
|
||||
* ----------------
|
||||
*/
|
||||
buf = ReadBuffer(VariableRelation, 0);
|
||||
|
||||
if (!BufferIsValid(buf))
|
||||
{
|
||||
SpinRelease(OidGenLockId);
|
||||
elog(ERROR, "VariableRelationGetNextOid: ReadBuffer failed");
|
||||
}
|
||||
|
||||
var = (VariableRelationContents) BufferGetBlock(buf);
|
||||
|
||||
(*oid_return) = var->nextOid;
|
||||
|
||||
ReleaseBuffer(buf);
|
||||
}
|
||||
|
||||
/* --------------------------------
|
||||
* VariableRelationPutNextOid
|
||||
* --------------------------------
|
||||
*/
|
||||
static void
|
||||
VariableRelationPutNextOid(Oid oid)
|
||||
{
|
||||
Buffer buf;
|
||||
VariableRelationContents var;
|
||||
|
||||
/* ----------------
|
||||
* We assume that a spinlock has been acquired to guarantee
|
||||
* exclusive access to the variable relation.
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
/* ----------------
|
||||
* do nothing before things are initialized
|
||||
* ----------------
|
||||
*/
|
||||
if (!RelationIsValid(VariableRelation))
|
||||
return;
|
||||
|
||||
/* ----------------
|
||||
* read the variable page, update the nextXid field and
|
||||
* write the page back out to disk.
|
||||
* ----------------
|
||||
*/
|
||||
buf = ReadBuffer(VariableRelation, 0);
|
||||
|
||||
if (!BufferIsValid(buf))
|
||||
{
|
||||
SpinRelease(OidGenLockId);
|
||||
elog(ERROR, "VariableRelationPutNextOid: ReadBuffer failed");
|
||||
}
|
||||
|
||||
var = (VariableRelationContents) BufferGetBlock(buf);
|
||||
|
||||
var->nextOid = oid;
|
||||
|
||||
WriteBuffer(buf);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* transaction id generation support
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* ----------------
|
||||
* GetNewTransactionId
|
||||
*
|
||||
* Transaction IDs are allocated via a cache in shared memory.
|
||||
* Each time we need more IDs, we advance the "next XID" value
|
||||
* in pg_variable by VAR_XID_PREFETCH and set the cache to
|
||||
* show that many XIDs as available. Then, allocating those XIDs
|
||||
* requires just a spinlock and not a buffer read/write cycle.
|
||||
*
|
||||
* Since the cache is shared across all backends, cached but unused
|
||||
* XIDs are not lost when a backend exits, only when the postmaster
|
||||
* quits or forces shared memory reinit. So we can afford to have
|
||||
* a pretty big value of VAR_XID_PREFETCH.
|
||||
*
|
||||
* This code does not worry about initializing the transaction counter
|
||||
* (see transam.c's InitializeTransactionLog() for that). We also
|
||||
* ignore the possibility that the counter could someday wrap around.
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
#define VAR_XID_PREFETCH 1024
|
||||
|
||||
void
|
||||
GetNewTransactionId(TransactionId *xid)
|
||||
{
|
||||
|
||||
/* ----------------
|
||||
* during bootstrap initialization, we return the special
|
||||
* bootstrap transaction id.
|
||||
* ----------------
|
||||
/*
|
||||
* During bootstrap initialization, we return the special
|
||||
* bootstrap transaction id.
|
||||
*/
|
||||
if (AMI_OVERRIDE)
|
||||
{
|
||||
TransactionIdStore(AmiTransactionId, xid);
|
||||
*xid = AmiTransactionId;
|
||||
return;
|
||||
}
|
||||
|
||||
SpinAcquire(OidGenLockId); /* not good for concurrency... */
|
||||
|
||||
if (ShmemVariableCache->xid_count == 0)
|
||||
{
|
||||
TransactionId nextid;
|
||||
|
||||
VariableRelationGetNextXid(&nextid);
|
||||
TransactionIdStore(nextid, &(ShmemVariableCache->nextXid));
|
||||
ShmemVariableCache->xid_count = VAR_XID_PREFETCH;
|
||||
TransactionIdAdd(&nextid, VAR_XID_PREFETCH);
|
||||
VariableRelationPutNextXid(nextid);
|
||||
}
|
||||
|
||||
TransactionIdStore(ShmemVariableCache->nextXid, xid);
|
||||
TransactionIdAdd(&(ShmemVariableCache->nextXid), 1);
|
||||
(ShmemVariableCache->xid_count)--;
|
||||
SpinAcquire(XidGenLockId);
|
||||
*xid = ShmemVariableCache->nextXid;
|
||||
(ShmemVariableCache->nextXid)++;
|
||||
|
||||
if (MyProc != (PROC *) NULL)
|
||||
MyProc->xid = *xid;
|
||||
|
||||
SpinRelease(OidGenLockId);
|
||||
SpinRelease(XidGenLockId);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@ -294,30 +55,20 @@ void
|
||||
ReadNewTransactionId(TransactionId *xid)
|
||||
{
|
||||
|
||||
/* ----------------
|
||||
* during bootstrap initialization, we return the special
|
||||
* bootstrap transaction id.
|
||||
* ----------------
|
||||
/*
|
||||
* During bootstrap initialization, we return the special
|
||||
* bootstrap transaction id.
|
||||
*/
|
||||
if (AMI_OVERRIDE)
|
||||
{
|
||||
TransactionIdStore(AmiTransactionId, xid);
|
||||
*xid = AmiTransactionId;
|
||||
return;
|
||||
}
|
||||
|
||||
SpinAcquire(OidGenLockId); /* not good for concurrency... */
|
||||
SpinAcquire(XidGenLockId);
|
||||
*xid = ShmemVariableCache->nextXid;
|
||||
SpinRelease(XidGenLockId);
|
||||
|
||||
/*
|
||||
* Note that we don't check is ShmemVariableCache->xid_count equal to
|
||||
* 0 or not. This will work as long as we don't call
|
||||
* ReadNewTransactionId() before GetNewTransactionId().
|
||||
*/
|
||||
if (ShmemVariableCache->nextXid == 0)
|
||||
elog(ERROR, "ReadNewTransactionId: ShmemVariableCache->nextXid is not initialized");
|
||||
|
||||
TransactionIdStore(ShmemVariableCache->nextXid, xid);
|
||||
|
||||
SpinRelease(OidGenLockId);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
@ -325,199 +76,67 @@ ReadNewTransactionId(TransactionId *xid)
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* ----------------
|
||||
* GetNewObjectIdBlock
|
||||
*
|
||||
* This support function is used to allocate a block of object ids
|
||||
* of the given size.
|
||||
* ----------------
|
||||
*/
|
||||
static void
|
||||
GetNewObjectIdBlock(Oid *oid_return, /* place to return the first new
|
||||
* object id */
|
||||
int oid_block_size) /* number of oids desired */
|
||||
{
|
||||
Oid firstfreeoid;
|
||||
Oid nextoid;
|
||||
|
||||
/* ----------------
|
||||
* Obtain exclusive access to the variable relation page
|
||||
* ----------------
|
||||
*/
|
||||
SpinAcquire(OidGenLockId);
|
||||
|
||||
/* ----------------
|
||||
* get the "next" oid from the variable relation
|
||||
* ----------------
|
||||
*/
|
||||
VariableRelationGetNextOid(&firstfreeoid);
|
||||
|
||||
/* ----------------
|
||||
* Allocate the range of OIDs to be returned to the caller.
|
||||
*
|
||||
* There are two things going on here.
|
||||
*
|
||||
* One: in a virgin database pg_variable will initially contain zeroes,
|
||||
* so we will read out firstfreeoid = InvalidOid. We want to start
|
||||
* allocating OIDs at BootstrapObjectIdData instead (OIDs below that
|
||||
* are reserved for static assignment in the initial catalog data).
|
||||
*
|
||||
* Two: if a database is run long enough, the OID counter will wrap
|
||||
* around. We must not generate an invalid OID when that happens,
|
||||
* and it seems wise not to generate anything in the reserved range.
|
||||
* Therefore we advance to BootstrapObjectIdData in this case too.
|
||||
*
|
||||
* The comparison here assumes that Oid is an unsigned type.
|
||||
*/
|
||||
nextoid = firstfreeoid + oid_block_size;
|
||||
|
||||
if (! OidIsValid(firstfreeoid) || nextoid < firstfreeoid)
|
||||
{
|
||||
/* Initialization or wraparound time, force it up to safe range */
|
||||
firstfreeoid = BootstrapObjectIdData;
|
||||
nextoid = firstfreeoid + oid_block_size;
|
||||
}
|
||||
|
||||
(*oid_return) = firstfreeoid;
|
||||
|
||||
/* ----------------
|
||||
* Update the variable relation to show the block range as used.
|
||||
* ----------------
|
||||
*/
|
||||
VariableRelationPutNextOid(nextoid);
|
||||
|
||||
/* ----------------
|
||||
* Relinquish our lock on the variable relation page
|
||||
* ----------------
|
||||
*/
|
||||
SpinRelease(OidGenLockId);
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
* GetNewObjectId
|
||||
*
|
||||
* This function allocates and parses out object ids. Like
|
||||
* GetNewTransactionId(), it "prefetches" 32 object ids by
|
||||
* incrementing the nextOid stored in the var relation by 32 and then
|
||||
* returning these id's one at a time until they are exhausted.
|
||||
* This means we reduce the number of accesses to the variable
|
||||
* relation by 32 for each backend.
|
||||
*
|
||||
* Note: 32 has no special significance. We don't want the
|
||||
* number to be too large because when the backend
|
||||
* terminates, we lose the oids we cached.
|
||||
*
|
||||
* Question: couldn't we use a shared-memory cache just like XIDs?
|
||||
* That would allow a larger interval between pg_variable updates
|
||||
* without cache losses. Note, however, that we can assign an OID
|
||||
* without even a spinlock from the backend-local OID cache.
|
||||
* Maybe two levels of caching would be good.
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
#define VAR_OID_PREFETCH 32
|
||||
|
||||
static int prefetched_oid_count = 0;
|
||||
static Oid next_prefetched_oid;
|
||||
#define VAR_OID_PREFETCH 8192
|
||||
static Oid lastSeenOid = InvalidOid;
|
||||
|
||||
void
|
||||
GetNewObjectId(Oid *oid_return) /* place to return the new object id */
|
||||
GetNewObjectId(Oid *oid_return)
|
||||
{
|
||||
/* ----------------
|
||||
* if we run out of prefetched oids, then we get some
|
||||
* more before handing them out to the caller.
|
||||
* ----------------
|
||||
*/
|
||||
SpinAcquire(OidGenLockId);
|
||||
|
||||
if (prefetched_oid_count == 0)
|
||||
/* If we run out of logged for use oids then we log more */
|
||||
if (ShmemVariableCache->oidCount == 0)
|
||||
{
|
||||
int oid_block_size = VAR_OID_PREFETCH;
|
||||
|
||||
/* ----------------
|
||||
* Make sure pg_variable is open.
|
||||
* ----------------
|
||||
*/
|
||||
if (!RelationIsValid(VariableRelation))
|
||||
VariableRelation = heap_openr(VariableRelationName, NoLock);
|
||||
|
||||
/* ----------------
|
||||
* get a new block of prefetched object ids.
|
||||
* ----------------
|
||||
*/
|
||||
GetNewObjectIdBlock(&next_prefetched_oid, oid_block_size);
|
||||
|
||||
/* ----------------
|
||||
* now reset the prefetched_oid_count.
|
||||
* ----------------
|
||||
*/
|
||||
prefetched_oid_count = oid_block_size;
|
||||
XLogPutNextOid(ShmemVariableCache->nextOid + VAR_OID_PREFETCH);
|
||||
ShmemVariableCache->oidCount = VAR_OID_PREFETCH;
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
* return the next prefetched oid in the pointer passed by
|
||||
* the user and decrement the prefetch count.
|
||||
* ----------------
|
||||
*/
|
||||
if (PointerIsValid(oid_return))
|
||||
(*oid_return) = next_prefetched_oid;
|
||||
lastSeenOid = (*oid_return) = ShmemVariableCache->nextOid;
|
||||
|
||||
next_prefetched_oid++;
|
||||
prefetched_oid_count--;
|
||||
(ShmemVariableCache->nextOid)++;
|
||||
(ShmemVariableCache->oidCount)--;
|
||||
|
||||
SpinRelease(OidGenLockId);
|
||||
}
|
||||
|
||||
void
|
||||
CheckMaxObjectId(Oid assigned_oid)
|
||||
{
|
||||
Oid temp_oid;
|
||||
|
||||
if (prefetched_oid_count == 0) /* make sure next/max is set, or
|
||||
* reload */
|
||||
GetNewObjectId(&temp_oid);
|
||||
|
||||
/* ----------------
|
||||
* If we are below prefetched limits, do nothing
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
if (assigned_oid < next_prefetched_oid)
|
||||
if (lastSeenOid != InvalidOid && assigned_oid < lastSeenOid)
|
||||
return;
|
||||
|
||||
/* ----------------
|
||||
* If we are here, we are coming from a 'copy from' with oid's
|
||||
*
|
||||
* If we are in the prefetched oid range, just bump it up
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
if (assigned_oid <= next_prefetched_oid + prefetched_oid_count - 1)
|
||||
SpinAcquire(OidGenLockId);
|
||||
if (assigned_oid < ShmemVariableCache->nextOid)
|
||||
{
|
||||
prefetched_oid_count -= assigned_oid - next_prefetched_oid + 1;
|
||||
next_prefetched_oid = assigned_oid + 1;
|
||||
lastSeenOid = ShmemVariableCache->nextOid - 1;
|
||||
SpinRelease(OidGenLockId);
|
||||
return;
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
* We have exceeded the prefetch oid range
|
||||
*
|
||||
* We should lock the database and kill all other backends
|
||||
* but we are loading oid's that we can not guarantee are unique
|
||||
* anyway, so we must rely on the user
|
||||
*
|
||||
* We now:
|
||||
* set the variable relation with the new max oid
|
||||
* force the backend to reload its oid cache
|
||||
*
|
||||
* By reloading the oid cache, we don't have to update the variable
|
||||
* relation every time when sequential OIDs are being loaded by COPY.
|
||||
* ----------------
|
||||
/* If we are in the logged oid range, just bump nextOid up */
|
||||
if (assigned_oid <= ShmemVariableCache->nextOid +
|
||||
ShmemVariableCache->oidCount - 1)
|
||||
{
|
||||
ShmemVariableCache->oidCount -=
|
||||
assigned_oid - ShmemVariableCache->nextOid + 1;
|
||||
ShmemVariableCache->nextOid = assigned_oid + 1;
|
||||
SpinRelease(OidGenLockId);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* We have exceeded the logged oid range.
|
||||
* We should lock the database and kill all other backends
|
||||
* but we are loading oid's that we can not guarantee are unique
|
||||
* anyway, so we must rely on the user.
|
||||
*/
|
||||
|
||||
SpinAcquire(OidGenLockId);
|
||||
VariableRelationPutNextOid(assigned_oid);
|
||||
XLogPutNextOid(assigned_oid + VAR_OID_PREFETCH);
|
||||
ShmemVariableCache->oidCount = VAR_OID_PREFETCH - 1;
|
||||
ShmemVariableCache->nextOid = assigned_oid + 1;
|
||||
|
||||
SpinRelease(OidGenLockId);
|
||||
|
||||
prefetched_oid_count = 0; /* force reload */
|
||||
GetNewObjectId(&temp_oid); /* cause target OID to be allocated */
|
||||
}
|
||||
|
||||
#endif /* !XLOG */
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.85 2000/11/30 01:47:31 vadim Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.86 2000/11/30 08:46:22 vadim Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Transaction aborts can now occur two ways:
|
||||
@ -219,7 +219,6 @@ TransactionState CurrentTransactionState = &CurrentTransactionStateData;
|
||||
int DefaultXactIsoLevel = XACT_READ_COMMITTED;
|
||||
int XactIsoLevel;
|
||||
|
||||
#ifdef XLOG
|
||||
#include "access/xlogutils.h"
|
||||
|
||||
int CommitDelay = 5; /* 1/200000 sec */
|
||||
@ -227,8 +226,6 @@ int CommitDelay = 5; /* 1/200000 sec */
|
||||
static void (*_RollbackFunc)(void*) = NULL;
|
||||
static void *_RollbackData = NULL;
|
||||
|
||||
#endif
|
||||
|
||||
/* ----------------
|
||||
* info returned when the system is disabled
|
||||
*
|
||||
@ -662,19 +659,10 @@ RecordTransactionCommit()
|
||||
TransactionId xid;
|
||||
int leak;
|
||||
|
||||
/* ----------------
|
||||
* get the current transaction id
|
||||
* ----------------
|
||||
*/
|
||||
xid = GetCurrentTransactionId();
|
||||
|
||||
/*
|
||||
* flush the buffer manager pages. Note: if we have stable main
|
||||
* memory, dirty shared buffers are not flushed plai 8/7/90
|
||||
*/
|
||||
leak = BufferPoolCheckLeak();
|
||||
|
||||
#ifdef XLOG
|
||||
if (MyLastRecPtr.xrecoff != 0)
|
||||
{
|
||||
xl_xact_commit xlrec;
|
||||
@ -685,7 +673,7 @@ RecordTransactionCommit()
|
||||
|
||||
xlrec.xtime = time(NULL);
|
||||
/*
|
||||
* MUST SAVE ARRAY OF RELFILENODE-s TO DROP
|
||||
* SHOULD SAVE ARRAY OF RELFILENODE-s TO DROP
|
||||
*/
|
||||
recptr = XLogInsert(RM_XACT_ID, XLOG_XACT_COMMIT,
|
||||
(char*) &xlrec, SizeOfXactCommit, NULL, 0);
|
||||
@ -704,30 +692,6 @@ RecordTransactionCommit()
|
||||
|
||||
MyProc->logRec.xrecoff = 0;
|
||||
}
|
||||
#else
|
||||
/*
|
||||
* If no one shared buffer was changed by this transaction then we
|
||||
* don't flush shared buffers and don't record commit status.
|
||||
*/
|
||||
if (SharedBufferChanged)
|
||||
{
|
||||
FlushBufferPool();
|
||||
if (leak)
|
||||
ResetBufferPool(true);
|
||||
|
||||
/*
|
||||
* have the transaction access methods record the status of this
|
||||
* transaction id in the pg_log relation.
|
||||
*/
|
||||
TransactionIdCommit(xid);
|
||||
|
||||
/*
|
||||
* Now write the log info to the disk too.
|
||||
*/
|
||||
leak = BufferPoolCheckLeak();
|
||||
FlushBufferPool();
|
||||
}
|
||||
#endif
|
||||
|
||||
if (leak)
|
||||
ResetBufferPool(true);
|
||||
@ -815,23 +779,8 @@ AtCommit_Memory(void)
|
||||
static void
|
||||
RecordTransactionAbort(void)
|
||||
{
|
||||
TransactionId xid;
|
||||
TransactionId xid = GetCurrentTransactionId();
|
||||
|
||||
/* ----------------
|
||||
* get the current transaction id
|
||||
* ----------------
|
||||
*/
|
||||
xid = GetCurrentTransactionId();
|
||||
|
||||
/*
|
||||
* Have the transaction access methods record the status of this
|
||||
* transaction id in the pg_log relation. We skip it if no one shared
|
||||
* buffer was changed by this transaction.
|
||||
*/
|
||||
if (SharedBufferChanged && !TransactionIdDidCommit(xid))
|
||||
TransactionIdAbort(xid);
|
||||
|
||||
#ifdef XLOG
|
||||
if (MyLastRecPtr.xrecoff != 0)
|
||||
{
|
||||
xl_xact_abort xlrec;
|
||||
@ -841,9 +790,9 @@ RecordTransactionAbort(void)
|
||||
recptr = XLogInsert(RM_XACT_ID, XLOG_XACT_ABORT,
|
||||
(char*) &xlrec, SizeOfXactAbort, NULL, 0);
|
||||
|
||||
TransactionIdAbort(xid);
|
||||
MyProc->logRec.xrecoff = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Tell bufmgr and smgr to release resources.
|
||||
@ -1748,8 +1697,6 @@ IsTransactionBlock(void)
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef XLOG
|
||||
|
||||
void
|
||||
xact_redo(XLogRecPtr lsn, XLogRecord *record)
|
||||
{
|
||||
@ -1760,7 +1707,7 @@ xact_redo(XLogRecPtr lsn, XLogRecord *record)
|
||||
xl_xact_commit *xlrec = (xl_xact_commit*) XLogRecGetData(record);
|
||||
|
||||
TransactionIdCommit(record->xl_xid);
|
||||
/* MUST REMOVE FILES OF ALL DROPPED RELATIONS */
|
||||
/* SHOULD REMOVE FILES OF ALL DROPPED RELATIONS */
|
||||
}
|
||||
else if (info == XLOG_XACT_ABORT)
|
||||
{
|
||||
@ -1825,5 +1772,3 @@ XactPopRollback(void)
|
||||
{
|
||||
_RollbackFunc = NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -6,7 +6,7 @@
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.37 2000/11/30 01:47:31 vadim Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.38 2000/11/30 08:46:22 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -1443,12 +1443,10 @@ void
|
||||
BootStrapXLOG()
|
||||
{
|
||||
CheckPoint checkPoint;
|
||||
#ifdef XLOG
|
||||
char buffer[BLCKSZ];
|
||||
bool usexistent = false;
|
||||
XLogPageHeader page = (XLogPageHeader) buffer;
|
||||
XLogRecord *record;
|
||||
#endif
|
||||
|
||||
checkPoint.redo.xlogid = 0;
|
||||
checkPoint.redo.xrecoff = SizeOfXLogPHD;
|
||||
@ -1462,8 +1460,6 @@ BootStrapXLOG()
|
||||
ShmemVariableCache->nextOid = checkPoint.nextOid;
|
||||
ShmemVariableCache->oidCount = 0;
|
||||
|
||||
#ifdef XLOG
|
||||
|
||||
memset(buffer, 0, BLCKSZ);
|
||||
page->xlp_magic = XLOG_PAGE_MAGIC;
|
||||
page->xlp_info = 0;
|
||||
@ -1488,8 +1484,6 @@ BootStrapXLOG()
|
||||
close(logFile);
|
||||
logFile = -1;
|
||||
|
||||
#endif
|
||||
|
||||
memset(ControlFile, 0, sizeof(ControlFileData));
|
||||
ControlFile->logId = 0;
|
||||
ControlFile->logSeg = 1;
|
||||
@ -1513,14 +1507,12 @@ str_time(time_t tnow)
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* This func must be called ONCE on system startup
|
||||
*/
|
||||
void
|
||||
StartupXLOG()
|
||||
{
|
||||
#ifdef XLOG
|
||||
XLogCtlInsert *Insert;
|
||||
CheckPoint checkPoint;
|
||||
XLogRecPtr RecPtr,
|
||||
@ -1529,8 +1521,6 @@ StartupXLOG()
|
||||
char buffer[MAXLOGRECSZ + SizeOfXLogRecord];
|
||||
bool sie_saved = false;
|
||||
|
||||
#endif
|
||||
|
||||
elog(LOG, "starting up");
|
||||
|
||||
XLogCtl->xlblocks = (XLogRecPtr *) (((char *) XLogCtl) + sizeof(XLogCtlData));
|
||||
@ -1580,8 +1570,6 @@ StartupXLOG()
|
||||
elog(LOG, "database system was interrupted at %s",
|
||||
str_time(ControlFile->time));
|
||||
|
||||
#ifdef XLOG
|
||||
|
||||
LastRec = RecPtr = ControlFile->checkPoint;
|
||||
if (!XRecOffIsValid(RecPtr.xrecoff))
|
||||
elog(STOP, "Invalid checkPoint in control file");
|
||||
@ -1602,12 +1590,7 @@ StartupXLOG()
|
||||
checkPoint.nextXid, checkPoint.nextOid);
|
||||
if (checkPoint.nextXid < FirstTransactionId ||
|
||||
checkPoint.nextOid < BootstrapObjectIdData)
|
||||
|
||||
#ifdef XLOG_2
|
||||
elog(STOP, "Invalid NextTransactionId/NextOid");
|
||||
#else
|
||||
elog(LOG, "Invalid NextTransactionId/NextOid");
|
||||
#endif
|
||||
|
||||
ShmemVariableCache->nextXid = checkPoint.nextXid;
|
||||
ShmemVariableCache->nextOid = checkPoint.nextOid;
|
||||
@ -1751,8 +1734,6 @@ StartupXLOG()
|
||||
}
|
||||
InRecovery = false;
|
||||
|
||||
#endif /* XLOG */
|
||||
|
||||
ControlFile->state = DB_IN_PRODUCTION;
|
||||
ControlFile->time = time(NULL);
|
||||
UpdateControlFile();
|
||||
@ -1783,9 +1764,7 @@ ShutdownXLOG()
|
||||
{
|
||||
elog(LOG, "shutting down");
|
||||
|
||||
#ifdef XLOG
|
||||
CreateDummyCaches();
|
||||
#endif
|
||||
CreateCheckPoint(true);
|
||||
|
||||
elog(LOG, "database system is shut down");
|
||||
@ -1796,7 +1775,6 @@ extern XLogRecPtr GetUndoRecPtr(void);
|
||||
void
|
||||
CreateCheckPoint(bool shutdown)
|
||||
{
|
||||
#ifdef XLOG
|
||||
CheckPoint checkPoint;
|
||||
XLogRecPtr recptr;
|
||||
XLogCtlInsert *Insert = &XLogCtl->Insert;
|
||||
@ -1880,12 +1858,9 @@ CreateCheckPoint(bool shutdown)
|
||||
|
||||
XLogFlush(recptr);
|
||||
|
||||
#endif /* XLOG */
|
||||
|
||||
SpinAcquire(ControlFileLockId);
|
||||
if (shutdown)
|
||||
ControlFile->state = DB_SHUTDOWNED;
|
||||
#ifdef XLOG
|
||||
else /* create new log file */
|
||||
{
|
||||
if (recptr.xrecoff % XLogSegSize >=
|
||||
@ -1914,16 +1889,10 @@ CreateCheckPoint(bool shutdown)
|
||||
_logSeg = ControlFile->logSeg - 1;
|
||||
strcpy(archdir, ControlFile->archdir);
|
||||
|
||||
#else
|
||||
ControlFile->checkPoint.xlogid = 0;
|
||||
ControlFile->checkPoint.xrecoff = SizeOfXLogPHD;
|
||||
#endif
|
||||
|
||||
ControlFile->time = time(NULL);
|
||||
UpdateControlFile();
|
||||
SpinRelease(ControlFileLockId);
|
||||
|
||||
#ifdef XLOG
|
||||
/*
|
||||
* Delete offline log files. Get oldest online
|
||||
* log file from undo rec if it's valid.
|
||||
@ -1948,7 +1917,6 @@ CreateCheckPoint(bool shutdown)
|
||||
S_UNLOCK(&(XLogCtl->chkp_lck));
|
||||
|
||||
MyLastRecPtr.xrecoff = 0; /* to avoid commit record */
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -1,142 +0,0 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* varsup.c
|
||||
* postgres OID & XID variables support routines
|
||||
*
|
||||
* Copyright (c) 2000, PostgreSQL, Inc
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/Attic/xlog_varsup.c,v 1.1 2000/11/03 11:39:35 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
|
||||
#include "access/transam.h"
|
||||
#include "storage/proc.h"
|
||||
|
||||
SPINLOCK OidGenLockId;
|
||||
|
||||
extern SPINLOCK XidGenLockId;
|
||||
extern void XLogPutNextOid(Oid nextOid);
|
||||
|
||||
/* pointer to "variable cache" in shared memory (set up by shmem.c) */
|
||||
VariableCache ShmemVariableCache = NULL;
|
||||
|
||||
void
|
||||
GetNewTransactionId(TransactionId *xid)
|
||||
{
|
||||
/*
|
||||
* During bootstrap initialization, we return the special
|
||||
* bootstrap transaction id.
|
||||
*/
|
||||
if (AMI_OVERRIDE)
|
||||
{
|
||||
*xid = AmiTransactionId;
|
||||
return;
|
||||
}
|
||||
|
||||
SpinAcquire(XidGenLockId);
|
||||
*xid = ShmemVariableCache->nextXid;
|
||||
(ShmemVariableCache->nextXid)++;
|
||||
|
||||
if (MyProc != (PROC *) NULL)
|
||||
MyProc->xid = *xid;
|
||||
|
||||
SpinRelease(XidGenLockId);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Like GetNewTransactionId reads nextXid but don't fetch it.
|
||||
*/
|
||||
void
|
||||
ReadNewTransactionId(TransactionId *xid)
|
||||
{
|
||||
|
||||
/*
|
||||
* During bootstrap initialization, we return the special
|
||||
* bootstrap transaction id.
|
||||
*/
|
||||
if (AMI_OVERRIDE)
|
||||
{
|
||||
*xid = AmiTransactionId;
|
||||
return;
|
||||
}
|
||||
|
||||
SpinAcquire(XidGenLockId);
|
||||
*xid = ShmemVariableCache->nextXid;
|
||||
SpinRelease(XidGenLockId);
|
||||
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* object id generation support
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define VAR_OID_PREFETCH 8192
|
||||
static Oid lastSeenOid = InvalidOid;
|
||||
|
||||
void
|
||||
GetNewObjectId(Oid *oid_return)
|
||||
{
|
||||
SpinAcquire(OidGenLockId);
|
||||
|
||||
/* If we run out of logged for use oids then we log more */
|
||||
if (ShmemVariableCache->oidCount == 0)
|
||||
{
|
||||
XLogPutNextOid(ShmemVariableCache->nextOid + VAR_OID_PREFETCH);
|
||||
ShmemVariableCache->oidCount = VAR_OID_PREFETCH;
|
||||
}
|
||||
|
||||
if (PointerIsValid(oid_return))
|
||||
lastSeenOid = (*oid_return) = ShmemVariableCache->nextOid;
|
||||
|
||||
(ShmemVariableCache->nextOid)++;
|
||||
(ShmemVariableCache->oidCount)--;
|
||||
|
||||
SpinRelease(OidGenLockId);
|
||||
}
|
||||
|
||||
void
|
||||
CheckMaxObjectId(Oid assigned_oid)
|
||||
{
|
||||
|
||||
if (lastSeenOid != InvalidOid && assigned_oid < lastSeenOid)
|
||||
return;
|
||||
|
||||
SpinAcquire(OidGenLockId);
|
||||
if (assigned_oid < ShmemVariableCache->nextOid)
|
||||
{
|
||||
lastSeenOid = ShmemVariableCache->nextOid - 1;
|
||||
SpinRelease(OidGenLockId);
|
||||
return;
|
||||
}
|
||||
|
||||
/* If we are in the logged oid range, just bump nextOid up */
|
||||
if (assigned_oid <= ShmemVariableCache->nextOid +
|
||||
ShmemVariableCache->oidCount - 1)
|
||||
{
|
||||
ShmemVariableCache->oidCount -=
|
||||
assigned_oid - ShmemVariableCache->nextOid + 1;
|
||||
ShmemVariableCache->nextOid = assigned_oid + 1;
|
||||
SpinRelease(OidGenLockId);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* We have exceeded the logged oid range.
|
||||
* We should lock the database and kill all other backends
|
||||
* but we are loading oid's that we can not guarantee are unique
|
||||
* anyway, so we must rely on the user.
|
||||
*/
|
||||
|
||||
XLogPutNextOid(assigned_oid + VAR_OID_PREFETCH);
|
||||
ShmemVariableCache->oidCount = VAR_OID_PREFETCH - 1;
|
||||
ShmemVariableCache->nextOid = assigned_oid + 1;
|
||||
|
||||
SpinRelease(OidGenLockId);
|
||||
|
||||
}
|
@ -10,9 +10,6 @@
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
|
||||
#ifdef XLOG
|
||||
|
||||
#include "access/xlog.h"
|
||||
#include "access/transam.h"
|
||||
#include "access/xact.h"
|
||||
@ -397,5 +394,3 @@ XLogOpenRelation(bool redo, RmgrId rmid, RelFileNode rnode)
|
||||
|
||||
return(&(res->reldata));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.69 2000/11/18 03:36:48 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.70 2000/11/30 08:46:22 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -153,13 +153,11 @@ createdb(const char *dbname, const char *dbpath,
|
||||
elog(ERROR, "database path may not contain single quotes");
|
||||
/* ... otherwise we'd be open to shell exploits below */
|
||||
|
||||
#ifdef XLOG
|
||||
/* Force dirty buffers out to disk, to ensure source database is
|
||||
* up-to-date for the copy. (We really only need to flush buffers
|
||||
* for the source database...)
|
||||
*/
|
||||
BufferSync();
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Close virtual file descriptors so the kernel has more available for
|
||||
@ -255,13 +253,11 @@ createdb(const char *dbname, const char *dbpath,
|
||||
/* Close pg_database, but keep lock till commit */
|
||||
heap_close(pg_database_rel, NoLock);
|
||||
|
||||
#ifdef XLOG
|
||||
/* Force dirty buffers out to disk, so that newly-connecting backends
|
||||
* will see the new database in pg_database right away. (They'll see
|
||||
* an uncommitted tuple, but they don't care; see GetRawDatabaseInfo.)
|
||||
*/
|
||||
BufferSync();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.173 2000/11/16 22:30:19 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.174 2000/11/30 08:46:22 vadim Exp $
|
||||
*
|
||||
|
||||
*-------------------------------------------------------------------------
|
||||
@ -47,11 +47,9 @@
|
||||
#include <sys/resource.h>
|
||||
#endif
|
||||
|
||||
#ifdef XLOG
|
||||
#include "access/xlog.h"
|
||||
XLogRecPtr log_heap_move(Relation reln,
|
||||
ItemPointerData from, HeapTuple newtup);
|
||||
#endif
|
||||
extern XLogRecPtr log_heap_move(Relation reln,
|
||||
ItemPointerData from, HeapTuple newtup);
|
||||
|
||||
static MemoryContext vac_context = NULL;
|
||||
|
||||
@ -1492,7 +1490,6 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
|
||||
newtup.t_data = (HeapTupleHeader) PageGetItem(ToPage, newitemid);
|
||||
ItemPointerSet(&(newtup.t_self), destvacpage->blkno, newoff);
|
||||
|
||||
#ifdef XLOG
|
||||
{
|
||||
XLogRecPtr recptr =
|
||||
log_heap_move(onerel, tuple.t_self, &newtup);
|
||||
@ -1505,7 +1502,6 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
|
||||
PageSetLSN(ToPage, recptr);
|
||||
PageSetSUI(ToPage, ThisStartUpID);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (((int) destvacpage->blkno) > last_move_dest_block)
|
||||
last_move_dest_block = destvacpage->blkno;
|
||||
@ -1655,7 +1651,6 @@ failed to add item with len = %lu to page %u (free space %lu, nusd %u, noff %u)"
|
||||
~(HEAP_XMIN_COMMITTED | HEAP_XMIN_INVALID | HEAP_MOVED_IN);
|
||||
tuple.t_data->t_infomask |= HEAP_MOVED_OFF;
|
||||
|
||||
#ifdef XLOG
|
||||
{
|
||||
XLogRecPtr recptr =
|
||||
log_heap_move(onerel, tuple.t_self, &newtup);
|
||||
@ -1665,7 +1660,6 @@ failed to add item with len = %lu to page %u (free space %lu, nusd %u, noff %u)"
|
||||
PageSetLSN(ToPage, recptr);
|
||||
PageSetSUI(ToPage, ThisStartUpID);
|
||||
}
|
||||
#endif
|
||||
|
||||
cur_page->offsets_used++;
|
||||
num_moved++;
|
||||
@ -1786,19 +1780,12 @@ failed to add item with len = %lu to page %u (free space %lu, nusd %u, noff %u)"
|
||||
|
||||
if (num_moved > 0)
|
||||
{
|
||||
#ifdef XLOG
|
||||
RecordTransactionCommit();
|
||||
#else
|
||||
/*
|
||||
* We have to commit our tuple' movings before we'll truncate
|
||||
* relation, but we shouldn't lose our locks. And so - quick hack:
|
||||
* flush buffers and record status of current transaction as
|
||||
* committed, and continue. - vadim 11/13/96
|
||||
* record status of current transaction as committed, and continue.
|
||||
*/
|
||||
FlushBufferPool();
|
||||
TransactionIdCommit(myXID);
|
||||
FlushBufferPool();
|
||||
#endif
|
||||
RecordTransactionCommit();
|
||||
}
|
||||
|
||||
/*
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,284 +0,0 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* xlog_localbuf.c
|
||||
* local buffer manager. Fast buffer manager for temporary tables
|
||||
* or special cases when the operation is not visible to other backends.
|
||||
*
|
||||
* When a relation is being created, the descriptor will have rd_islocal
|
||||
* set to indicate that the local buffer manager should be used. During
|
||||
* the same transaction the relation is being created, any inserts or
|
||||
* selects from the newly created relation will use the local buffer
|
||||
* pool. rd_islocal is reset at the end of a transaction (commit/abort).
|
||||
* This is useful for queries like SELECT INTO TABLE and create index.
|
||||
*
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994-5, Regents of the University of California
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/buffer/Attic/xlog_localbuf.c,v 1.2 2000/11/30 01:39:07 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#include "postgres.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/file.h>
|
||||
#include <math.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include "executor/execdebug.h"
|
||||
#include "storage/buf_internals.h"
|
||||
#include "storage/bufmgr.h"
|
||||
#include "storage/smgr.h"
|
||||
#include "utils/relcache.h"
|
||||
|
||||
extern long int LocalBufferFlushCount;
|
||||
|
||||
int NLocBuffer = 64;
|
||||
BufferDesc *LocalBufferDescriptors = NULL;
|
||||
Block *LocalBufferBlockPointers = NULL;
|
||||
long *LocalRefCount = NULL;
|
||||
|
||||
static int nextFreeLocalBuf = 0;
|
||||
|
||||
/*#define LBDEBUG*/
|
||||
|
||||
/*
|
||||
* LocalBufferAlloc -
|
||||
* allocate a local buffer. We do round robin allocation for now.
|
||||
*/
|
||||
BufferDesc *
|
||||
LocalBufferAlloc(Relation reln, BlockNumber blockNum, bool *foundPtr)
|
||||
{
|
||||
int i;
|
||||
BufferDesc *bufHdr = (BufferDesc *) NULL;
|
||||
|
||||
if (blockNum == P_NEW)
|
||||
{
|
||||
blockNum = reln->rd_nblocks;
|
||||
reln->rd_nblocks++;
|
||||
}
|
||||
|
||||
/* a low tech search for now -- not optimized for scans */
|
||||
for (i = 0; i < NLocBuffer; i++)
|
||||
{
|
||||
if (LocalBufferDescriptors[i].tag.rnode.relNode ==
|
||||
reln->rd_node.relNode &&
|
||||
LocalBufferDescriptors[i].tag.blockNum == blockNum)
|
||||
{
|
||||
|
||||
#ifdef LBDEBUG
|
||||
fprintf(stderr, "LB ALLOC (%u,%d) %d\n",
|
||||
RelationGetRelid(reln), blockNum, -i - 1);
|
||||
#endif
|
||||
LocalRefCount[i]++;
|
||||
*foundPtr = TRUE;
|
||||
return &LocalBufferDescriptors[i];
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef LBDEBUG
|
||||
fprintf(stderr, "LB ALLOC (%u,%d) %d\n",
|
||||
RelationGetRelid(reln), blockNum, -nextFreeLocalBuf - 1);
|
||||
#endif
|
||||
|
||||
/* need to get a new buffer (round robin for now) */
|
||||
for (i = 0; i < NLocBuffer; i++)
|
||||
{
|
||||
int b = (nextFreeLocalBuf + i) % NLocBuffer;
|
||||
|
||||
if (LocalRefCount[b] == 0)
|
||||
{
|
||||
bufHdr = &LocalBufferDescriptors[b];
|
||||
LocalRefCount[b]++;
|
||||
nextFreeLocalBuf = (b + 1) % NLocBuffer;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (bufHdr == NULL)
|
||||
elog(ERROR, "no empty local buffer.");
|
||||
|
||||
/*
|
||||
* this buffer is not referenced but it might still be dirty (the last
|
||||
* transaction to touch it doesn't need its contents but has not
|
||||
* flushed it). if that's the case, write it out before reusing it!
|
||||
*/
|
||||
if (bufHdr->flags & BM_DIRTY || bufHdr->cntxDirty)
|
||||
{
|
||||
Relation bufrel = RelationNodeCacheGetRelation(bufHdr->tag.rnode);
|
||||
|
||||
Assert(bufrel != NULL);
|
||||
|
||||
/* flush this page */
|
||||
smgrwrite(DEFAULT_SMGR, bufrel, bufHdr->tag.blockNum,
|
||||
(char *) MAKE_PTR(bufHdr->data));
|
||||
LocalBufferFlushCount++;
|
||||
|
||||
/*
|
||||
* drop relcache refcount incremented by
|
||||
* RelationIdCacheGetRelation
|
||||
*/
|
||||
RelationDecrementReferenceCount(bufrel);
|
||||
}
|
||||
|
||||
/*
|
||||
* it's all ours now.
|
||||
*
|
||||
* We need not in tblNode currently but will in future I think,
|
||||
* when we'll give up rel->rd_fd to fmgr cache.
|
||||
*/
|
||||
bufHdr->tag.rnode = reln->rd_node;
|
||||
bufHdr->tag.blockNum = blockNum;
|
||||
bufHdr->flags &= ~BM_DIRTY;
|
||||
bufHdr->cntxDirty = false;
|
||||
|
||||
/*
|
||||
* lazy memory allocation: allocate space on first use of a buffer.
|
||||
*/
|
||||
if (bufHdr->data == (SHMEM_OFFSET) 0)
|
||||
{
|
||||
char *data = (char *) malloc(BLCKSZ);
|
||||
|
||||
if (data == NULL)
|
||||
elog(FATAL, "Out of memory in LocalBufferAlloc");
|
||||
/*
|
||||
* This is a bit of a hack: bufHdr->data needs to be a shmem offset
|
||||
* for consistency with the shared-buffer case, so make it one
|
||||
* even though it's not really a valid shmem offset.
|
||||
*/
|
||||
bufHdr->data = MAKE_OFFSET(data);
|
||||
/*
|
||||
* Set pointer for use by BufferGetBlock() macro.
|
||||
*/
|
||||
LocalBufferBlockPointers[-(bufHdr->buf_id + 2)] = (Block) data;
|
||||
}
|
||||
|
||||
*foundPtr = FALSE;
|
||||
return bufHdr;
|
||||
}
|
||||
|
||||
/*
|
||||
* WriteLocalBuffer -
|
||||
* writes out a local buffer
|
||||
*/
|
||||
int
|
||||
WriteLocalBuffer(Buffer buffer, bool release)
|
||||
{
|
||||
int bufid;
|
||||
|
||||
Assert(BufferIsLocal(buffer));
|
||||
|
||||
#ifdef LBDEBUG
|
||||
fprintf(stderr, "LB WRITE %d\n", buffer);
|
||||
#endif
|
||||
|
||||
bufid = -(buffer + 1);
|
||||
LocalBufferDescriptors[bufid].flags |= BM_DIRTY;
|
||||
|
||||
if (release)
|
||||
{
|
||||
Assert(LocalRefCount[bufid] > 0);
|
||||
LocalRefCount[bufid]--;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* InitLocalBuffer -
|
||||
* init the local buffer cache. Since most queries (esp. multi-user ones)
|
||||
* don't involve local buffers, we delay allocating actual memory for the
|
||||
* buffer until we need it.
|
||||
*/
|
||||
void
|
||||
InitLocalBuffer(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
* these aren't going away. I'm not gonna use palloc.
|
||||
*/
|
||||
LocalBufferDescriptors =
|
||||
(BufferDesc *) calloc(NLocBuffer, sizeof(BufferDesc));
|
||||
LocalBufferBlockPointers = (Block *) calloc(NLocBuffer, sizeof(Block));
|
||||
LocalRefCount = (long *) calloc(NLocBuffer, sizeof(long));
|
||||
nextFreeLocalBuf = 0;
|
||||
|
||||
for (i = 0; i < NLocBuffer; i++)
|
||||
{
|
||||
BufferDesc *buf = &LocalBufferDescriptors[i];
|
||||
|
||||
/*
|
||||
* negative to indicate local buffer. This is tricky: shared
|
||||
* buffers start with 0. We have to start with -2. (Note that the
|
||||
* routine BufferDescriptorGetBuffer adds 1 to buf_id so our first
|
||||
* buffer id is -1.)
|
||||
*/
|
||||
buf->buf_id = -i - 2;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* LocalBufferSync
|
||||
*
|
||||
* Flush all dirty buffers in the local buffer cache at commit time.
|
||||
* Since the buffer cache is only used for keeping relations visible
|
||||
* during a transaction, we will not need these buffers again.
|
||||
*
|
||||
* Note that we have to *flush* local buffers because of them are not
|
||||
* visible to checkpoint makers. But we can skip XLOG flush check.
|
||||
*/
|
||||
void
|
||||
LocalBufferSync(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NLocBuffer; i++)
|
||||
{
|
||||
BufferDesc *buf = &LocalBufferDescriptors[i];
|
||||
Relation bufrel;
|
||||
|
||||
if (buf->flags & BM_DIRTY || buf->cntxDirty)
|
||||
{
|
||||
#ifdef LBDEBUG
|
||||
fprintf(stderr, "LB SYNC %d\n", -i - 1);
|
||||
#endif
|
||||
bufrel = RelationNodeCacheGetRelation(buf->tag.rnode);
|
||||
|
||||
Assert(bufrel != NULL);
|
||||
|
||||
smgrwrite(DEFAULT_SMGR, bufrel, buf->tag.blockNum,
|
||||
(char *) MAKE_PTR(buf->data));
|
||||
smgrmarkdirty(DEFAULT_SMGR, bufrel, buf->tag.blockNum);
|
||||
LocalBufferFlushCount++;
|
||||
|
||||
/* drop relcache refcount from RelationIdCacheGetRelation */
|
||||
RelationDecrementReferenceCount(bufrel);
|
||||
|
||||
buf->flags &= ~BM_DIRTY;
|
||||
buf->cntxDirty = false;
|
||||
}
|
||||
}
|
||||
|
||||
MemSet(LocalRefCount, 0, sizeof(long) * NLocBuffer);
|
||||
nextFreeLocalBuf = 0;
|
||||
}
|
||||
|
||||
void
|
||||
ResetLocalBufferPool(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NLocBuffer; i++)
|
||||
{
|
||||
BufferDesc *buf = &LocalBufferDescriptors[i];
|
||||
|
||||
buf->tag.rnode.relNode = InvalidOid;
|
||||
buf->flags &= ~BM_DIRTY;
|
||||
buf->cntxDirty = false;
|
||||
}
|
||||
|
||||
MemSet(LocalRefCount, 0, sizeof(long) * NLocBuffer);
|
||||
nextFreeLocalBuf = 0;
|
||||
}
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/file/fd.c,v 1.67 2000/11/23 01:08:57 vadim Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/file/fd.c,v 1.68 2000/11/30 08:46:23 vadim Exp $
|
||||
*
|
||||
* NOTES:
|
||||
*
|
||||
@ -192,20 +192,6 @@ static File fileNameOpenFile(FileName fileName, int fileFlags, int fileMode);
|
||||
static char *filepath(char *filename);
|
||||
static long pg_nofile(void);
|
||||
|
||||
#ifndef XLOG
|
||||
/*
|
||||
* pg_fsync --- same as fsync except does nothing if -F switch was given
|
||||
*/
|
||||
int
|
||||
pg_fsync(int fd)
|
||||
{
|
||||
if (enableFsync)
|
||||
return fsync(fd);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* BasicOpenFile --- same as open(2) except can free other FDs if needed
|
||||
*
|
||||
@ -665,7 +651,6 @@ fileNameOpenFile(FileName fileName,
|
||||
vfdP->fileFlags = fileFlags & ~(O_TRUNC | O_EXCL);
|
||||
vfdP->fileMode = fileMode;
|
||||
vfdP->seekPos = 0;
|
||||
#ifdef XLOG
|
||||
/*
|
||||
* Have to fsync file on commit. Alternative way - log
|
||||
* file creation and fsync log before actual file creation.
|
||||
@ -673,7 +658,6 @@ fileNameOpenFile(FileName fileName,
|
||||
if (fileFlags & O_CREAT)
|
||||
vfdP->fdstate = FD_DIRTY;
|
||||
else
|
||||
#endif
|
||||
vfdP->fdstate = 0x0;
|
||||
|
||||
return file;
|
||||
@ -832,13 +816,7 @@ FileWrite(File file, char *buffer, int amount)
|
||||
FileAccess(file);
|
||||
returnCode = write(VfdCache[file].fd, buffer, amount);
|
||||
if (returnCode > 0)
|
||||
{
|
||||
VfdCache[file].seekPos += returnCode;
|
||||
#ifndef XLOG
|
||||
/* mark the file as needing fsync */
|
||||
VfdCache[file].fdstate |= FD_DIRTY;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
VfdCache[file].seekPos = FileUnknownPos;
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.79 2000/11/10 03:53:45 vadim Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.80 2000/11/30 08:46:24 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -569,14 +569,6 @@ mdblindwrt(RelFileNode rnode,
|
||||
elog(DEBUG, "mdblindwrt: write() failed: %m");
|
||||
status = SM_FAIL;
|
||||
}
|
||||
#ifndef XLOG
|
||||
else if (dofsync &&
|
||||
pg_fsync(fd) < 0)
|
||||
{
|
||||
elog(DEBUG, "mdblindwrt: fsync() failed: %m");
|
||||
status = SM_FAIL;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (close(fd) < 0)
|
||||
{
|
||||
@ -840,7 +832,6 @@ mdabort()
|
||||
return SM_SUCCESS;
|
||||
}
|
||||
|
||||
#ifdef XLOG
|
||||
/*
|
||||
* mdsync() -- Sync storage.
|
||||
*
|
||||
@ -854,7 +845,6 @@ mdsync()
|
||||
sync();
|
||||
return SM_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* _fdvec_alloc () -- grab a free (or new) md file descriptor vector.
|
||||
|
@ -11,7 +11,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgr.c,v 1.45 2000/11/21 21:16:01 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgr.c,v 1.46 2000/11/30 08:46:24 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -47,9 +47,7 @@ typedef struct f_smgr
|
||||
int (*smgr_truncate) (Relation reln, int nblocks);
|
||||
int (*smgr_commit) (void); /* may be NULL */
|
||||
int (*smgr_abort) (void); /* may be NULL */
|
||||
#ifdef XLOG
|
||||
int (*smgr_sync) (void);
|
||||
#endif
|
||||
} f_smgr;
|
||||
|
||||
/*
|
||||
@ -62,11 +60,7 @@ static f_smgr smgrsw[] = {
|
||||
/* magnetic disk */
|
||||
{mdinit, NULL, mdcreate, mdunlink, mdextend, mdopen, mdclose,
|
||||
mdread, mdwrite, mdflush, mdblindwrt, mdmarkdirty, mdblindmarkdirty,
|
||||
#ifdef XLOG
|
||||
mdnblocks, mdtruncate, mdcommit, mdabort, mdsync
|
||||
#else
|
||||
mdnblocks, mdtruncate, mdcommit, mdabort
|
||||
#endif
|
||||
},
|
||||
|
||||
#ifdef STABLE_MEMORY_STORAGE
|
||||
@ -545,7 +539,6 @@ smgrabort()
|
||||
return SM_SUCCESS;
|
||||
}
|
||||
|
||||
#ifdef XLOG
|
||||
int
|
||||
smgrsync()
|
||||
{
|
||||
@ -564,7 +557,6 @@ smgrsync()
|
||||
|
||||
return SM_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef NOT_USED
|
||||
bool
|
||||
@ -578,8 +570,6 @@ smgriswo(int16 smgrno)
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef XLOG
|
||||
|
||||
void
|
||||
smgr_redo(XLogRecPtr lsn, XLogRecord *record)
|
||||
{
|
||||
@ -594,4 +584,3 @@ void
|
||||
smgr_desc(char *buf, uint8 xl_info, char* rec)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
7
src/backend/utils/cache/relcache.c
vendored
7
src/backend/utils/cache/relcache.c
vendored
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.116 2000/11/10 00:33:10 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.117 2000/11/30 08:46:24 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -2027,8 +2027,7 @@ RelationCacheInitializePhase2(void)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef XLOG /* used by XLogInitCache */
|
||||
|
||||
/* used by XLogInitCache */
|
||||
void CreateDummyCaches(void);
|
||||
void DestroyDummyCaches(void);
|
||||
|
||||
@ -2082,8 +2081,6 @@ DestroyDummyCaches(void)
|
||||
MemoryContextSwitchTo(oldcxt);
|
||||
}
|
||||
|
||||
#endif /* XLOG */
|
||||
|
||||
static void
|
||||
AttrDefaultFetch(Relation relation)
|
||||
{
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.73 2000/11/28 23:27:57 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.74 2000/11/30 08:46:25 vadim Exp $
|
||||
*
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
@ -177,11 +177,6 @@ InitPostgres(const char *dbname, const char *username)
|
||||
{
|
||||
bool bootstrap = IsBootstrapProcessingMode();
|
||||
|
||||
#ifndef XLOG
|
||||
if (!TransactionFlushEnabled())
|
||||
on_shmem_exit(FlushBufferPool, 0);
|
||||
#endif
|
||||
|
||||
SetDatabaseName(dbname);
|
||||
/* ----------------
|
||||
* initialize the database id used for system caches and lock tables
|
||||
@ -190,11 +185,7 @@ InitPostgres(const char *dbname, const char *username)
|
||||
if (bootstrap)
|
||||
{
|
||||
MyDatabaseId = TemplateDbOid;
|
||||
#ifdef OLD_FILE_NAMING
|
||||
SetDatabasePath(ExpandDatabasePath(dbname));
|
||||
#else
|
||||
SetDatabasePath(GetDatabasePath(MyDatabaseId));
|
||||
#endif
|
||||
LockDisable(true);
|
||||
}
|
||||
else
|
||||
@ -228,13 +219,7 @@ InitPostgres(const char *dbname, const char *username)
|
||||
"Database \"%s\" does not exist in the system catalog.",
|
||||
dbname);
|
||||
|
||||
#ifdef OLD_FILE_NAMING
|
||||
fullpath = ExpandDatabasePath(datpath);
|
||||
if (!fullpath)
|
||||
elog(FATAL, "Database path could not be resolved.");
|
||||
#else
|
||||
fullpath = GetDatabasePath(MyDatabaseId);
|
||||
#endif
|
||||
|
||||
/* Verify the database path */
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: htup.h,v 1.40 2000/11/30 01:47:32 vadim Exp $
|
||||
* $Id: htup.h,v 1.41 2000/11/30 08:46:25 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -63,11 +63,6 @@ typedef struct HeapTupleHeaderData
|
||||
|
||||
typedef HeapTupleHeaderData *HeapTupleHeader;
|
||||
|
||||
|
||||
#ifdef XLOG
|
||||
|
||||
/* XLOG stuff */
|
||||
|
||||
/*
|
||||
* XLOG allows to store some information in high 4 bits of log
|
||||
* record xl_info field
|
||||
@ -127,11 +122,6 @@ typedef struct xl_heap_update
|
||||
|
||||
#define SizeOfHeapUpdate (offsetof(xl_heap_update, mask) + sizeof(uint8))
|
||||
|
||||
/* end of XLOG stuff */
|
||||
|
||||
#endif /* XLOG */
|
||||
|
||||
|
||||
/*
|
||||
* MaxTupleSize is the maximum allowed size of a tuple, including header and
|
||||
* MAXALIGN alignment padding. Basically it's BLCKSZ minus the other stuff
|
||||
@ -147,7 +137,6 @@ typedef struct xl_heap_update
|
||||
#define MaxTupleSize \
|
||||
(BLCKSZ - MAXALIGN(sizeof(PageHeaderData) + MaxSpecialSpace))
|
||||
|
||||
|
||||
/*
|
||||
* MaxAttrSize is a somewhat arbitrary upper limit on the declared size of
|
||||
* data fields of char(n) and similar types. It need not have anything
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: nbtree.h,v 1.47 2000/11/21 21:16:05 petere Exp $
|
||||
* $Id: nbtree.h,v 1.48 2000/11/30 08:46:25 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -42,10 +42,7 @@ typedef struct BTPageOpaqueData
|
||||
#define BTP_ROOT (1 << 1) /* It's the root page (has no parent) */
|
||||
#define BTP_FREE (1 << 2) /* not currently used... */
|
||||
#define BTP_META (1 << 3) /* Set in the meta-page only */
|
||||
|
||||
#ifdef XLOG
|
||||
#define BTP_REORDER (1 << 4) /* items must be re-ordered */
|
||||
#endif
|
||||
} BTPageOpaqueData;
|
||||
|
||||
typedef BTPageOpaqueData *BTPageOpaque;
|
||||
@ -209,11 +206,6 @@ typedef BTStackData *BTStack;
|
||||
#define P_FIRSTKEY ((OffsetNumber) 2)
|
||||
#define P_FIRSTDATAKEY(opaque) (P_RIGHTMOST(opaque) ? P_HIKEY : P_FIRSTKEY)
|
||||
|
||||
|
||||
#ifdef XLOG
|
||||
|
||||
/* XLOG stuff */
|
||||
|
||||
/*
|
||||
* XLOG allows to store some information in high 4 bits of log
|
||||
* record xl_info field
|
||||
@ -257,7 +249,6 @@ typedef struct xl_btree_insert
|
||||
|
||||
#define SizeOfBtreeInsert (offsetof(xl_btreetid, tid) + SizeOfIptrData)
|
||||
|
||||
|
||||
/*
|
||||
* This is what we need to know about insert with split -
|
||||
* 22 + {4 + 8 | left hi-key} + [btitem] + right sibling btitems. Note that
|
||||
@ -292,10 +283,6 @@ typedef struct xl_btree_newroot
|
||||
|
||||
#define SizeOfBtreeNewroot (offsetof(xl_btree_newroot, rootblk) + sizeof(BlockIdData))
|
||||
|
||||
/* end of XLOG stuff */
|
||||
|
||||
#endif /* XLOG */
|
||||
|
||||
/*
|
||||
* Operator strategy numbers -- ordering of these is <, <=, =, >=, >
|
||||
*/
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: transam.h,v 1.27 2000/11/21 21:16:05 petere Exp $
|
||||
* $Id: transam.h,v 1.28 2000/11/30 08:46:25 vadim Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Transaction System Version 101 now support proper oid
|
||||
@ -67,11 +67,7 @@ typedef unsigned char XidStatus;/* (2 bits) */
|
||||
* transaction page definitions
|
||||
* ----------------
|
||||
*/
|
||||
#ifdef XLOG
|
||||
#define TP_DataSize (BLCKSZ - sizeof(XLogRecPtr))
|
||||
#else
|
||||
#define TP_DataSize BLCKSZ
|
||||
#endif
|
||||
#define TP_NumXidStatusPerBlock (TP_DataSize * 4)
|
||||
|
||||
/* ----------------
|
||||
@ -88,10 +84,8 @@ typedef unsigned char XidStatus;/* (2 bits) */
|
||||
*/
|
||||
typedef struct LogRelationContentsData
|
||||
{
|
||||
#ifdef XLOG
|
||||
XLogRecPtr LSN; /* temp hack: LSN is member of any block */
|
||||
/* so should be described in bufmgr */
|
||||
#endif
|
||||
int TransSystemVersion;
|
||||
} LogRelationContentsData;
|
||||
|
||||
@ -115,9 +109,7 @@ typedef LogRelationContentsData *LogRelationContents;
|
||||
*/
|
||||
typedef struct VariableRelationContentsData
|
||||
{
|
||||
#ifdef XLOG
|
||||
XLogRecPtr LSN;
|
||||
#endif
|
||||
int TransSystemVersion;
|
||||
TransactionId nextXidData;
|
||||
TransactionId lastXidData; /* unused */
|
||||
@ -127,21 +119,14 @@ typedef struct VariableRelationContentsData
|
||||
typedef VariableRelationContentsData *VariableRelationContents;
|
||||
|
||||
/*
|
||||
* VariableCache is placed in shmem and used by backends to
|
||||
* get next available XID & OID without access to
|
||||
* variable relation. Actually, I would like to have two
|
||||
* different on-disk storages for next XID and OID...
|
||||
* But hoping that someday we will use per database OID
|
||||
* generator I leaved this as is. - vadim 07/21/98
|
||||
* VariableCache is placed in shmem and used by
|
||||
* backends to get next available XID & OID.
|
||||
*/
|
||||
typedef struct VariableCacheData
|
||||
{
|
||||
#ifndef XLOG
|
||||
uint32 xid_count;
|
||||
#endif
|
||||
TransactionId nextXid;
|
||||
Oid nextOid;
|
||||
uint32 oidCount;
|
||||
TransactionId nextXid;
|
||||
Oid nextOid;
|
||||
uint32 oidCount;
|
||||
} VariableCacheData;
|
||||
|
||||
typedef VariableCacheData *VariableCache;
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: xact.h,v 1.30 2000/11/21 21:16:05 petere Exp $
|
||||
* $Id: xact.h,v 1.31 2000/11/30 08:46:25 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -78,9 +78,6 @@ typedef TransactionStateData *TransactionState;
|
||||
#define StoreInvalidTransactionId(dest) \
|
||||
(*((TransactionId*) (dest)) = NullTransactionId)
|
||||
|
||||
|
||||
#ifdef XLOG
|
||||
|
||||
/*
|
||||
* XLOG allows to store some information in high 4 bits of log
|
||||
* record xl_info field
|
||||
@ -106,8 +103,6 @@ typedef struct xl_xact_abort
|
||||
|
||||
#define SizeOfXactAbort ((offsetof(xl_xact_abort, xtime) + sizeof(time_t)))
|
||||
|
||||
#endif
|
||||
|
||||
/* ----------------
|
||||
* extern definitions
|
||||
* ----------------
|
||||
|
@ -1,5 +1,5 @@
|
||||
|
||||
#ifndef XLOG_UTILS_H
|
||||
#define XLOG_UTILS_H
|
||||
|
||||
#include "access/rmgr.h"
|
||||
#include "utils/rel.h"
|
||||
|
@ -8,7 +8,7 @@
|
||||
* or in config.h afterwards. Of course, if you edit config.h, then your
|
||||
* changes will be overwritten the next time you run configure.
|
||||
*
|
||||
* $Id: config.h.in,v 1.150 2000/11/29 20:59:54 tgl Exp $
|
||||
* $Id: config.h.in,v 1.151 2000/11/30 08:46:25 vadim Exp $
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_H
|
||||
@ -234,9 +234,6 @@
|
||||
# define HAVE_UNIX_SOCKETS 1
|
||||
#endif
|
||||
|
||||
/* Enable WAL. Don't disable this, it was only used during development. */
|
||||
#define XLOG 1
|
||||
|
||||
/*
|
||||
*------------------------------------------------------------------------
|
||||
* These hand-configurable symbols are for enabling debugging code,
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: buf_internals.h,v 1.45 2000/11/30 01:39:08 tgl Exp $
|
||||
* $Id: buf_internals.h,v 1.46 2000/11/30 08:46:26 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -18,7 +18,6 @@
|
||||
#include "storage/lmgr.h"
|
||||
#include "storage/s_lock.h"
|
||||
|
||||
|
||||
/* Buf Mgr constants */
|
||||
/* in bufmgr.c */
|
||||
extern int Data_Descriptors;
|
||||
@ -28,7 +27,6 @@ extern int Num_Descriptors;
|
||||
|
||||
extern int ShowPinTrace;
|
||||
|
||||
|
||||
/*
|
||||
* Flags for buffer descriptors
|
||||
*/
|
||||
@ -105,9 +103,7 @@ typedef struct sbufdesc
|
||||
bool ri_lock; /* read-intent lock */
|
||||
bool w_lock; /* context exclusively locked */
|
||||
|
||||
#ifdef XLOG
|
||||
bool cntxDirty; /* new way to mark block as dirty */
|
||||
#endif
|
||||
|
||||
BufferBlindId blind; /* was used to support blind write */
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: bufmgr.h,v 1.45 2000/11/30 01:39:08 tgl Exp $
|
||||
* $Id: bufmgr.h,v 1.46 2000/11/30 08:46:26 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -192,10 +192,8 @@ extern void AbortBufferIO(void);
|
||||
extern bool BufferIsUpdatable(Buffer buffer);
|
||||
extern void MarkBufferForCleanup(Buffer buffer, void (*CleanupFunc)(Buffer));
|
||||
|
||||
#ifdef XLOG
|
||||
extern void BufmgrCommit(void);
|
||||
extern void BufferSync(void);
|
||||
#endif
|
||||
|
||||
extern void InitLocalBuffer(void);
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: bufpage.h,v 1.36 2000/11/20 21:12:26 vadim Exp $
|
||||
* $Id: bufpage.h,v 1.37 2000/11/30 08:46:26 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -118,13 +118,13 @@ typedef OpaqueData *Opaque;
|
||||
*/
|
||||
typedef struct PageHeaderData
|
||||
{
|
||||
#ifdef XLOG /* XXX LSN is member of *any* block, not */
|
||||
/* XXX LSN is member of *any* block, not */
|
||||
/* only page-organized - 'll change later */
|
||||
XLogRecPtr pd_lsn; /* LSN: next byte after last byte of xlog */
|
||||
/* record for last change of this page */
|
||||
StartUpID pd_sui; /* SUI of last changes (currently it's */
|
||||
/* used by heap AM only) */
|
||||
#endif
|
||||
|
||||
LocationIndex pd_lower; /* offset to start of free space */
|
||||
LocationIndex pd_upper; /* offset to end of free space */
|
||||
LocationIndex pd_special; /* offset to start of special space */
|
||||
@ -298,8 +298,6 @@ typedef enum
|
||||
(sizeof(PageHeaderData) - sizeof(ItemIdData)))) \
|
||||
/ ((int) sizeof(ItemIdData)))
|
||||
|
||||
#ifdef XLOG
|
||||
|
||||
#define PageGetLSN(page) \
|
||||
(((PageHeader) (page))->pd_lsn)
|
||||
#define PageSetLSN(page, lsn) \
|
||||
@ -310,8 +308,6 @@ typedef enum
|
||||
#define PageSetSUI(page, sui) \
|
||||
(((PageHeader) (page))->pd_sui = (StartUpID) (sui))
|
||||
|
||||
#endif
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* extern declarations
|
||||
* ----------------------------------------------------------------
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: fd.h,v 1.23 2000/11/10 03:53:45 vadim Exp $
|
||||
* $Id: fd.h,v 1.24 2000/11/30 08:46:26 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -71,10 +71,6 @@ extern int BasicOpenFile(FileName fileName, int fileFlags, int fileMode);
|
||||
extern void closeAllVfds(void);
|
||||
extern void AtEOXact_Files(void);
|
||||
|
||||
#ifdef XLOG
|
||||
#define pg_fsync(fd) fsync(fd)
|
||||
#else
|
||||
extern int pg_fsync(int fd);
|
||||
#endif
|
||||
|
||||
#endif /* FD_H */
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: smgr.h,v 1.25 2000/11/21 21:16:05 petere Exp $
|
||||
* $Id: smgr.h,v 1.26 2000/11/30 08:46:26 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -47,14 +47,11 @@ extern int smgrtruncate(int16 which, Relation reln, int nblocks);
|
||||
extern int smgrDoPendingDeletes(bool isCommit);
|
||||
extern int smgrcommit(void);
|
||||
extern int smgrabort(void);
|
||||
|
||||
#ifdef XLOG
|
||||
extern int smgrsync(void);
|
||||
|
||||
extern void smgr_redo(XLogRecPtr lsn, XLogRecord *record);
|
||||
extern void smgr_undo(XLogRecPtr lsn, XLogRecord *record);
|
||||
extern void smgr_desc(char *buf, uint8 xl_info, char* rec);
|
||||
#endif
|
||||
|
||||
|
||||
/* internals: move me elsewhere -- ay 7/94 */
|
||||
@ -77,10 +74,7 @@ extern int mdnblocks(Relation reln);
|
||||
extern int mdtruncate(Relation reln, int nblocks);
|
||||
extern int mdcommit(void);
|
||||
extern int mdabort(void);
|
||||
|
||||
#ifdef XLOG
|
||||
extern int mdsync(void);
|
||||
#endif
|
||||
|
||||
/* mm.c */
|
||||
extern SPINLOCK MMCacheLock;
|
||||
|
Loading…
x
Reference in New Issue
Block a user