diff options
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r-- | src/backend/access/transam/xlog.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 70be51695dd..e1a8ef97d17 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -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.38 2000/11/30 08:46:22 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.39 2000/12/03 10:27:26 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -40,7 +40,7 @@ int XLOGbuffers = 8; XLogRecPtr MyLastRecPtr = {0, 0}; -bool StopIfError = false; +uint32 StopIfError = 0; bool InRecovery = false; StartUpID ThisStartUpID = 0; @@ -270,6 +270,8 @@ XLogInsert(RmgrId rmid, uint8 info, char *hdr, uint32 hdrlen, char *buf, uint32 return (RecPtr); } + START_CRIT_CODE; + /* obtain xlog insert lock */ if (TAS(&(XLogCtl->insert_lck))) /* busy */ { @@ -496,6 +498,7 @@ nbuf: } } + END_CRIT_CODE; return (RecPtr); } @@ -523,6 +526,9 @@ XLogFlush(XLogRecPtr record) return; if (XLByteLE(record, LgwrResult.Flush)) return; + + START_CRIT_CODE; + WriteRqst = LgwrRqst.Write; for (;;) { @@ -533,6 +539,7 @@ XLogFlush(XLogRecPtr record) if (XLByteLE(record, LgwrResult.Flush)) { S_UNLOCK(&(XLogCtl->info_lck)); + END_CRIT_CODE; return; } if (XLByteLT(XLogCtl->LgwrRqst.Flush, record)) @@ -578,6 +585,7 @@ XLogFlush(XLogRecPtr record) if (XLByteLE(record, LgwrResult.Flush)) { S_UNLOCK(&(XLogCtl->lgwr_lck)); + END_CRIT_CODE; return; } if (XLByteLT(LgwrResult.Write, WriteRqst)) @@ -587,6 +595,7 @@ XLogFlush(XLogRecPtr record) S_UNLOCK(&(XLogCtl->lgwr_lck)); if (XLByteLT(LgwrResult.Flush, record)) elog(STOP, "XLogFlush: request is not satisfied"); + END_CRIT_CODE; return; } break; @@ -632,6 +641,8 @@ XLogFlush(XLogRecPtr record) XLogCtl->Write.LgwrResult = LgwrResult; S_UNLOCK(&(XLogCtl->lgwr_lck)); + + END_CRIT_CODE; return; } @@ -1519,9 +1530,9 @@ StartupXLOG() LastRec; XLogRecord *record; char buffer[MAXLOGRECSZ + SizeOfXLogRecord]; - bool sie_saved = false; elog(LOG, "starting up"); + StopIfError++; XLogCtl->xlblocks = (XLogRecPtr *) (((char *) XLogCtl) + sizeof(XLogCtlData)); XLogCtl->pages = ((char *) XLogCtl->xlblocks + sizeof(XLogRecPtr) * XLOGbuffers); @@ -1628,9 +1639,6 @@ StartupXLOG() ControlFile->time = time(NULL); UpdateControlFile(); - sie_saved = StopIfError; - StopIfError = true; - XLogOpenLogRelation(); /* open pg_log */ XLogInitRelationCache(); @@ -1729,7 +1737,6 @@ StartupXLOG() if (InRecovery) { CreateCheckPoint(true); - StopIfError = sie_saved; XLogCloseRelationCache(); } InRecovery = false; @@ -1742,6 +1749,7 @@ StartupXLOG() XLogCtl->ThisStartUpID = ThisStartUpID; elog(LOG, "database system is in production state"); + StopIfError--; return; } @@ -1764,8 +1772,10 @@ ShutdownXLOG() { elog(LOG, "shutting down"); + StopIfError++; CreateDummyCaches(); CreateCheckPoint(true); + StopIfError--; elog(LOG, "database system is shut down"); } @@ -1787,6 +1797,7 @@ CreateCheckPoint(bool shutdown) if (MyLastRecPtr.xrecoff != 0) elog(ERROR, "CreateCheckPoint: cannot be called inside transaction block"); + START_CRIT_CODE; while (TAS(&(XLogCtl->chkp_lck))) { struct timeval delay = {2, 0}; @@ -1917,6 +1928,7 @@ CreateCheckPoint(bool shutdown) S_UNLOCK(&(XLogCtl->chkp_lck)); MyLastRecPtr.xrecoff = 0; /* to avoid commit record */ + END_CRIT_CODE; return; } |