It may happen that we try to read the status of a transaction
authorMason Sharp <[email protected]>
Mon, 2 May 2016 18:44:53 +0000 (14:44 -0400)
committerMason Sharp <[email protected]>
Mon, 2 May 2016 18:44:53 +0000 (14:44 -0400)
in clog before the page has been committed.

There are places in the code that try to extend clog,
but here we simply just do one retry if it looks like
we failed to read the desired page.

src/backend/access/transam/slru.c

index 89c56a1b78fa39711d59f772bf4d7e66941d3a64..bf19338c12bdf167c90b01e862988b9fd20b2cda 100644 (file)
@@ -410,6 +410,17 @@ SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok,
                /* Do the read */
                ok = SlruPhysicalReadPage(ctl, pageno, slotno);
 
+               /*
+                * If we failed, it may be because we tried to read the status
+                * before the page was created. Retry once
+                */
+               if (!ok && slru_errcause == SLRU_READ_FAILED)
+               {
+                       ExtendLogs(xid);
+                       /* Retry */
+                       ok = SlruPhysicalReadPage(ctl, pageno, slotno);
+               }
+
                /* Set the LSNs for this newly read-in page to zero */
                SimpleLruZeroLSNs(ctl, slotno);