6
6
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
7
7
* Portions Copyright (c) 1994, Regents of the University of California
8
8
*
9
- * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.52 2001/02/13 08:44:09 vadim Exp $
9
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.53 2001/02/13 20:40:25 vadim Exp $
10
10
*
11
11
*-------------------------------------------------------------------------
12
12
*/
@@ -612,6 +612,7 @@ begin:;
612
612
if (updrqst )
613
613
{
614
614
S_LOCK (& (XLogCtl -> info_lck ));
615
+ LgwrResult = XLogCtl -> LgwrResult ;
615
616
if (XLByteLT (XLogCtl -> LgwrRqst .Write , LgwrRqst .Write ))
616
617
XLogCtl -> LgwrRqst .Write = LgwrRqst .Write ;
617
618
S_UNLOCK (& (XLogCtl -> info_lck ));
@@ -760,6 +761,10 @@ XLogFlush(XLogRecPtr record)
760
761
761
762
}
762
763
764
+ /*
765
+ * We use this routine when Insert->curridx block is full and the next XLOG
766
+ * buffer looks as unwritten to OS' cache. insert_lck is assumed here.
767
+ */
763
768
static void
764
769
GetFreeXLBuffer ()
765
770
{
@@ -768,12 +773,24 @@ GetFreeXLBuffer()
768
773
uint16 curridx = NextBufIdx (Insert -> curridx );
769
774
unsigned spins = 0 ;
770
775
776
+ /* Use Insert->LgwrResult copy if it's more fresh */
777
+ if (XLByteLT (LgwrResult .Write , Insert -> LgwrResult .Write ))
778
+ {
779
+ LgwrResult = Insert -> LgwrResult ;
780
+ if (XLByteLE (XLogCtl -> xlblocks [curridx ], LgwrResult .Write ))
781
+ {
782
+ InitXLBuffer (curridx );
783
+ return ;
784
+ }
785
+ }
786
+
771
787
LgwrRqst .Write = XLogCtl -> xlblocks [Insert -> curridx ];
772
788
for (;;)
773
789
{
774
790
if (!TAS (& (XLogCtl -> info_lck )))
775
791
{
776
792
LgwrResult = XLogCtl -> LgwrResult ;
793
+ /* LgwrRqst.Write GE XLogCtl->LgwrRqst.Write */
777
794
XLogCtl -> LgwrRqst .Write = LgwrRqst .Write ;
778
795
S_UNLOCK (& (XLogCtl -> info_lck ));
779
796
if (XLByteLE (XLogCtl -> xlblocks [curridx ], LgwrResult .Write ))
0 commit comments