aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam
diff options
context:
space:
mode:
authorSimon Riggs <simon@2ndQuadrant.com>2016-02-19 08:31:12 +0000
committerSimon Riggs <simon@2ndQuadrant.com>2016-02-19 08:31:12 +0000
commit481725c0ba731b77fb32cadb12013373e378011a (patch)
tree16348e2d654c913c54da6e0fb9859811f28f56ff /src/backend/access/transam
parenta914a0414232e30943f7b2ffd997d74bd018a7b1 (diff)
downloadpostgresql-481725c0ba731b77fb32cadb12013373e378011a.tar.gz
postgresql-481725c0ba731b77fb32cadb12013373e378011a.zip
Correct StartupSUBTRANS for page wraparound
StartupSUBTRANS() incorrectly handled cases near the max pageid in the subtrans data structure, which in some cases could lead to errors in startup for Hot Standby. This patch wraps the pageids correctly, avoiding any such errors. Identified by exhaustive crash testing by Jeff Janes. Jeff Janes
Diffstat (limited to 'src/backend/access/transam')
-rw-r--r--src/backend/access/transam/subtrans.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/backend/access/transam/subtrans.c b/src/backend/access/transam/subtrans.c
index 8170ba3e3e7..c02046c0730 100644
--- a/src/backend/access/transam/subtrans.c
+++ b/src/backend/access/transam/subtrans.c
@@ -44,7 +44,8 @@
* 0xFFFFFFFF/SUBTRANS_XACTS_PER_PAGE, and segment numbering at
* 0xFFFFFFFF/SUBTRANS_XACTS_PER_PAGE/SLRU_PAGES_PER_SEGMENT. We need take no
* explicit notice of that fact in this module, except when comparing segment
- * and page numbers in TruncateSUBTRANS (see SubTransPagePrecedes).
+ * and page numbers in TruncateSUBTRANS (see SubTransPagePrecedes) and zeroing
+ * them in StartupSUBTRANS.
*/
/* We need four bytes per xact */
@@ -254,6 +255,9 @@ StartupSUBTRANS(TransactionId oldestActiveXID)
{
(void) ZeroSUBTRANSPage(startPage);
startPage++;
+ /* must account for wraparound */
+ if (startPage > TransactionIdToPage(MaxTransactionId))
+ startPage=0;
}
(void) ZeroSUBTRANSPage(startPage);