mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	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
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user