Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9c54cfb

Browse files
committed
Fix CLOG truncation code to not do the Wrong Thing when there are already
wrapped-around databases. The unvacuumed databases might be fine, orthey might not, but things will definitely not be fine if we remove thewrong CLOG segments. Per trouble report from Gary Wolfe, 1-Apr-2002.
1 parent688781d commit9c54cfb

File tree

1 file changed

+45
-13
lines changed

1 file changed

+45
-13
lines changed

‎src/backend/commands/vacuum.c

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*
1414
*
1515
* IDENTIFICATION
16-
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.221 2002/04/0201:03:05 tgl Exp $
16+
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.222 2002/04/0205:11:55 tgl Exp $
1717
*
1818
*-------------------------------------------------------------------------
1919
*/
@@ -557,10 +557,15 @@ vac_update_dbstats(Oid dbid,
557557
staticvoid
558558
vac_truncate_clog(TransactionIdvacuumXID,TransactionIdfrozenXID)
559559
{
560+
TransactionIdmyXID;
560561
Relationrelation;
561562
HeapScanDescscan;
562563
HeapTupletuple;
563564
int32age;
565+
boolvacuumAlreadyWrapped= false;
566+
boolfrozenAlreadyWrapped= false;
567+
568+
myXID=GetCurrentTransactionId();
564569

565570
relation=heap_openr(DatabaseRelationName,AccessShareLock);
566571

@@ -575,28 +580,55 @@ vac_truncate_clog(TransactionId vacuumXID, TransactionId frozenXID)
575580
if (!dbform->datallowconn)
576581
continue;
577582

578-
if (TransactionIdIsNormal(dbform->datvacuumxid)&&
579-
TransactionIdPrecedes(dbform->datvacuumxid,vacuumXID))
580-
vacuumXID=dbform->datvacuumxid;
581-
if (TransactionIdIsNormal(dbform->datfrozenxid)&&
582-
TransactionIdPrecedes(dbform->datfrozenxid,frozenXID))
583-
frozenXID=dbform->datfrozenxid;
583+
if (TransactionIdIsNormal(dbform->datvacuumxid))
584+
{
585+
if (TransactionIdPrecedes(myXID,dbform->datvacuumxid))
586+
vacuumAlreadyWrapped= true;
587+
elseif (TransactionIdPrecedes(dbform->datvacuumxid,vacuumXID))
588+
vacuumXID=dbform->datvacuumxid;
589+
}
590+
if (TransactionIdIsNormal(dbform->datfrozenxid))
591+
{
592+
if (TransactionIdPrecedes(myXID,dbform->datfrozenxid))
593+
frozenAlreadyWrapped= true;
594+
elseif (TransactionIdPrecedes(dbform->datfrozenxid,frozenXID))
595+
frozenXID=dbform->datfrozenxid;
596+
}
584597
}
585598

586599
heap_endscan(scan);
587600

588601
heap_close(relation,AccessShareLock);
589602

603+
/*
604+
* Do not truncate CLOG if we seem to have suffered wraparound already;
605+
* the computed minimum XID might be bogus.
606+
*/
607+
if (vacuumAlreadyWrapped)
608+
{
609+
elog(WARNING,"Some databases have not been vacuumed in over 2 billion transactions."
610+
"\n\tYou may have already suffered transaction-wraparound data loss.");
611+
return;
612+
}
613+
590614
/* Truncate CLOG to the oldest vacuumxid */
591615
TruncateCLOG(vacuumXID);
592616

593617
/* Give warning about impending wraparound problems */
594-
age= (int32) (GetCurrentTransactionId()-frozenXID);
595-
if (age> (int32) ((MaxTransactionId >>3)*3))
596-
elog(WARNING,"Some databases have not been vacuumed in %d transactions."
597-
"\n\tBetter vacuum them within %d transactions,"
598-
"\n\tor you may have a wraparound failure.",
599-
age, (int32) (MaxTransactionId >>1)-age);
618+
if (frozenAlreadyWrapped)
619+
{
620+
elog(WARNING,"Some databases have not been vacuumed in over 1 billion transactions."
621+
"\n\tBetter vacuum them soon, or you may have a wraparound failure.");
622+
}
623+
else
624+
{
625+
age= (int32) (myXID-frozenXID);
626+
if (age> (int32) ((MaxTransactionId >>3)*3))
627+
elog(WARNING,"Some databases have not been vacuumed in %d transactions."
628+
"\n\tBetter vacuum them within %d transactions,"
629+
"\n\tor you may have a wraparound failure.",
630+
age, (int32) (MaxTransactionId >>1)-age);
631+
}
600632
}
601633

602634

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp