Comments about GetFreeXLBuffer().

GetFreeXLBuffer(): use Insert->LgwrResult instead of private LgwrResult
copy if it's more fresh (attempt to avoid acquiring info_lck/lgwr_lck).
This commit is contained in:
Vadim B. Mikheev 2001-02-13 20:40:25 +00:00
parent 3d21bf82c3
commit 7e04843ba7
1 changed files with 18 additions and 1 deletions

View File

@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.52 2001/02/13 08:44:09 vadim Exp $
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.53 2001/02/13 20:40:25 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@ -612,6 +612,7 @@ begin:;
if (updrqst)
{
S_LOCK(&(XLogCtl->info_lck));
LgwrResult = XLogCtl->LgwrResult;
if (XLByteLT(XLogCtl->LgwrRqst.Write, LgwrRqst.Write))
XLogCtl->LgwrRqst.Write = LgwrRqst.Write;
S_UNLOCK(&(XLogCtl->info_lck));
@ -760,6 +761,10 @@ XLogFlush(XLogRecPtr record)
}
/*
* We use this routine when Insert->curridx block is full and the next XLOG
* buffer looks as unwritten to OS' cache. insert_lck is assumed here.
*/
static void
GetFreeXLBuffer()
{
@ -768,12 +773,24 @@ GetFreeXLBuffer()
uint16 curridx = NextBufIdx(Insert->curridx);
unsigned spins = 0;
/* Use Insert->LgwrResult copy if it's more fresh */
if (XLByteLT(LgwrResult.Write, Insert->LgwrResult.Write))
{
LgwrResult = Insert->LgwrResult;
if (XLByteLE(XLogCtl->xlblocks[curridx], LgwrResult.Write))
{
InitXLBuffer(curridx);
return;
}
}
LgwrRqst.Write = XLogCtl->xlblocks[Insert->curridx];
for (;;)
{
if (!TAS(&(XLogCtl->info_lck)))
{
LgwrResult = XLogCtl->LgwrResult;
/* LgwrRqst.Write GE XLogCtl->LgwrRqst.Write */
XLogCtl->LgwrRqst.Write = LgwrRqst.Write;
S_UNLOCK(&(XLogCtl->info_lck));
if (XLByteLE(XLogCtl->xlblocks[curridx], LgwrResult.Write))