mirror of
https://github.com/postgres/postgres.git
synced 2025-06-29 10:41:53 +03:00
Disable elog(ERROR|FATAL) in signal handlers in
critical sections of code.
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user