6
6
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
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.21 2000/10/24 09:56:09 vadim Exp $
9
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.22 2000/10/28 16:20:54 vadim Exp $
10
10
*
11
11
*-------------------------------------------------------------------------
12
12
*/
@@ -220,6 +220,8 @@ static uint32 readOff = 0;
220
220
static char readBuf [BLCKSZ ];
221
221
static XLogRecord * nextRecord = NULL ;
222
222
223
+ static bool InRedo = false;
224
+
223
225
XLogRecPtr
224
226
XLogInsert (RmgrId rmid , uint8 info , char * hdr , uint32 hdrlen , char * buf , uint32 buflen )
225
227
{
@@ -481,6 +483,19 @@ XLogFlush(XLogRecPtr record)
481
483
unsigned i = 0 ;
482
484
bool force_lgwr = false;
483
485
486
+ if (XLOG_DEBUG )
487
+ {
488
+ fprintf (stderr , "XLogFlush%s%s: rqst %u/%u; wrt %u/%u; flsh %u/%u\n" ,
489
+ (IsBootstrapProcessingMode ()) ? "(bootstrap)" : "" ,
490
+ (InRedo ) ? "(redo)" : "" ,
491
+ record .xlogid , record .xrecoff ,
492
+ LgwrResult .Write .xlogid , LgwrResult .Write .xrecoff ,
493
+ LgwrResult .Flush .xlogid , LgwrResult .Flush .xrecoff );
494
+ fflush (stderr );
495
+ }
496
+
497
+ if (IsBootstrapProcessingMode () || InRedo )
498
+ return ;
484
499
if (XLByteLE (record , LgwrResult .Flush ))
485
500
return ;
486
501
WriteRqst = LgwrRqst .Write ;
@@ -894,7 +909,7 @@ ReadRecord(XLogRecPtr *RecPtr, char *buffer)
894
909
record = (XLogRecord * ) ((char * ) readBuf + RecPtr -> xrecoff % BLCKSZ );
895
910
896
911
got_record :;
897
- if (record -> xl_len == 0 || record -> xl_len >
912
+ if (record -> xl_len >
898
913
(BLCKSZ - RecPtr -> xrecoff % BLCKSZ - SizeOfXLogRecord ))
899
914
{
900
915
elog (emode , "ReadRecord: invalid record len %u in (%u, %u)" ,
@@ -1259,7 +1274,6 @@ StartupXLOG()
1259
1274
LastRec ;
1260
1275
XLogRecord * record ;
1261
1276
char buffer [MAXLOGRECSZ + SizeOfXLogRecord ];
1262
- int recovery = 0 ;
1263
1277
bool sie_saved = false;
1264
1278
1265
1279
#endif
@@ -1380,16 +1394,15 @@ StartupXLOG()
1380
1394
elog (STOP , "Invalid Redo/Undo record in shutdown checkpoint" );
1381
1395
if (ControlFile -> state == DB_SHUTDOWNED )
1382
1396
elog (STOP , "Invalid Redo/Undo record in Shutdowned state" );
1383
- recovery = 1 ;
1397
+ InRecovery = true ;
1384
1398
}
1385
1399
else if (ControlFile -> state != DB_SHUTDOWNED )
1386
1400
{
1387
- if (checkPoint .Shutdown )
1388
- elog (STOP , "Invalid state in control file" );
1389
- recovery = 1 ;
1401
+ InRecovery = true;
1390
1402
}
1391
1403
1392
- if (recovery )
1404
+ /* REDO */
1405
+ if (InRecovery )
1393
1406
{
1394
1407
elog (LOG , "The DataBase system was not properly shut down\n"
1395
1408
"\tAutomatic recovery is in progress..." );
@@ -1401,6 +1414,7 @@ StartupXLOG()
1401
1414
StopIfError = true;
1402
1415
1403
1416
XLogOpenLogRelation (); /* open pg_log */
1417
+ XLogInitRelationCache ();
1404
1418
1405
1419
/* Is REDO required ? */
1406
1420
if (XLByteLT (checkPoint .redo , RecPtr ))
@@ -1409,9 +1423,9 @@ StartupXLOG()
1409
1423
/* read past CheckPoint record */
1410
1424
record = ReadRecord (NULL , buffer );
1411
1425
1412
- /* REDO */
1413
1426
if (record -> xl_len != 0 )
1414
1427
{
1428
+ InRedo = true;
1415
1429
elog (LOG , "Redo starts at (%u, %u)" ,
1416
1430
ReadRecPtr .xlogid , ReadRecPtr .xrecoff );
1417
1431
do
@@ -1441,12 +1455,40 @@ StartupXLOG()
1441
1455
elog (LOG , "Redo done at (%u, %u)" ,
1442
1456
ReadRecPtr .xlogid , ReadRecPtr .xrecoff );
1443
1457
LastRec = ReadRecPtr ;
1458
+ InRedo = false;
1444
1459
}
1445
1460
else
1446
1461
elog (LOG , "Redo is not required" );
1462
+ }
1463
+
1464
+ /* Init xlog buffer cache */
1465
+ record = ReadRecord (& LastRec , buffer );
1466
+ logId = EndRecPtr .xlogid ;
1467
+ logSeg = (EndRecPtr .xrecoff - 1 ) / XLogSegSize ;
1468
+ logOff = 0 ;
1469
+ logFile = XLogFileOpen (logId , logSeg , false);
1470
+ XLogCtl -> xlblocks [0 ].xlogid = logId ;
1471
+ XLogCtl -> xlblocks [0 ].xrecoff =
1472
+ ((EndRecPtr .xrecoff - 1 ) / BLCKSZ + 1 ) * BLCKSZ ;
1473
+ Insert = & XLogCtl -> Insert ;
1474
+ memcpy ((char * ) (Insert -> currpage ), readBuf , BLCKSZ );
1475
+ Insert -> currpos = ((char * ) Insert -> currpage ) +
1476
+ (EndRecPtr .xrecoff + BLCKSZ - XLogCtl -> xlblocks [0 ].xrecoff );
1477
+ Insert -> PrevRecord = LastRec ;
1478
+
1479
+ LgwrRqst .Write = LgwrRqst .Flush =
1480
+ LgwrResult .Write = LgwrResult .Flush = EndRecPtr ;
1481
+
1482
+ XLogCtl -> Write .LgwrResult = LgwrResult ;
1483
+ Insert -> LgwrResult = LgwrResult ;
1484
+
1485
+ XLogCtl -> LgwrRqst = LgwrRqst ;
1486
+ XLogCtl -> LgwrResult = LgwrResult ;
1447
1487
1448
1488
#ifdef NOT_USED
1449
- /* UNDO */
1489
+ /* UNDO */
1490
+ if (InRecovery )
1491
+ {
1450
1492
RecPtr = ReadRecPtr ;
1451
1493
if (XLByteLT (checkPoint .undo , RecPtr ))
1452
1494
{
@@ -1465,29 +1507,16 @@ StartupXLOG()
1465
1507
}
1466
1508
else
1467
1509
elog (LOG , "Undo is not required" );
1468
- #endif
1469
1510
}
1511
+ #endif
1470
1512
1471
- /* Init xlog buffer cache */
1472
- record = ReadRecord (& LastRec , buffer );
1473
- logId = EndRecPtr .xlogid ;
1474
- logSeg = (EndRecPtr .xrecoff - 1 ) / XLogSegSize ;
1475
- logOff = 0 ;
1476
- logFile = XLogFileOpen (logId , logSeg , false);
1477
- XLogCtl -> xlblocks [0 ].xlogid = logId ;
1478
- XLogCtl -> xlblocks [0 ].xrecoff =
1479
- ((EndRecPtr .xrecoff - 1 ) / BLCKSZ + 1 ) * BLCKSZ ;
1480
- Insert = & XLogCtl -> Insert ;
1481
- memcpy ((char * ) (Insert -> currpage ), readBuf , BLCKSZ );
1482
- Insert -> currpos = ((char * ) Insert -> currpage ) +
1483
- (EndRecPtr .xrecoff + BLCKSZ - XLogCtl -> xlblocks [0 ].xrecoff );
1484
- Insert -> PrevRecord = ControlFile -> checkPoint ;
1485
-
1486
- if (recovery )
1513
+ if (InRecovery )
1487
1514
{
1488
1515
CreateCheckPoint (true);
1489
1516
StopIfError = sie_saved ;
1517
+ XLogCloseRelationCache ();
1490
1518
}
1519
+ InRecovery = false;
1491
1520
1492
1521
#endif /* XLOG */
1493
1522
0 commit comments