aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2017-12-13 16:09:00 -0500
committerRobert Haas <rhaas@postgresql.org>2017-12-13 16:15:44 -0500
commit884a60840cd684dd7925e7a4f9bf10288c37694d (patch)
tree150f5a00af7478f53d71d7973370bb51e2a50aa0
parent1d6fb35ad62968c8678d0321887e2b9ca8fe1a84 (diff)
downloadpostgresql-884a60840cd684dd7925e7a4f9bf10288c37694d.tar.gz
postgresql-884a60840cd684dd7925e7a4f9bf10288c37694d.zip
Fix parallel index scan hang with deleted or half-dead pages.
The previous coding forgot to release the scan before seizing it again, leading to a lockup. Report by Patrick Hemmer. Diagnosis by Thomas Munro. Patch by Amit Kapila. Discussion: http://postgr.es/m/CAEepm=2xZUcOGP9V0O_G0=2P2wwXwPrkF=upWTCJSisUxMnuSg@mail.gmail.com
-rw-r--r--src/backend/access/nbtree/nbtsearch.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c
index 558113bd13a..12d3f081b61 100644
--- a/src/backend/access/nbtree/nbtsearch.c
+++ b/src/backend/access/nbtree/nbtsearch.c
@@ -1486,6 +1486,11 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir)
if (_bt_readpage(scan, dir, P_FIRSTDATAKEY(opaque)))
break;
}
+ else if (scan->parallel_scan != NULL)
+ {
+ /* allow next page be processed by parallel worker */
+ _bt_parallel_release(scan, opaque->btpo_next);
+ }
/* nope, keep going */
if (scan->parallel_scan != NULL)
@@ -1581,6 +1586,11 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir)
if (_bt_readpage(scan, dir, PageGetMaxOffsetNumber(page)))
break;
}
+ else if (scan->parallel_scan != NULL)
+ {
+ /* allow next page be processed by parallel worker */
+ _bt_parallel_release(scan, BufferGetBlockNumber(so->currPos.buf));
+ }
/*
* For parallel scans, get the last page scanned as it is quite