1
0
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:
Vadim B. Mikheev
2000-12-03 10:27:29 +00:00
parent 5e3bc5ebcd
commit 65b362fae1
12 changed files with 94 additions and 29 deletions

View File

@ -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;
}