mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Put a CHECK_FOR_INTERRUPTS call into the loops that try to find a unique new
OID or new relfilenode. If the existing OIDs are sufficiently densely populated, this could take a long time (perhaps even be an infinite loop), so it seems wise to allow the system to respond to a cancel interrupt here. Per a gripe from Jacky Leng. Backpatch as far as 8.1. Older versions just fail on OID collision, instead of looping.
This commit is contained in:
		@@ -10,7 +10,7 @@
 | 
				
			|||||||
 *
 | 
					 *
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * IDENTIFICATION
 | 
					 * IDENTIFICATION
 | 
				
			||||||
 *	  $PostgreSQL: pgsql/src/backend/catalog/catalog.c,v 1.72 2008/01/01 19:45:48 momjian Exp $
 | 
					 *	  $PostgreSQL: pgsql/src/backend/catalog/catalog.c,v 1.73 2008/02/20 17:44:09 tgl Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *-------------------------------------------------------------------------
 | 
					 *-------------------------------------------------------------------------
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -374,6 +374,8 @@ GetNewOidWithIndex(Relation relation, Relation indexrel)
 | 
				
			|||||||
	/* Generate new OIDs until we find one not in the table */
 | 
						/* Generate new OIDs until we find one not in the table */
 | 
				
			||||||
	do
 | 
						do
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							CHECK_FOR_INTERRUPTS();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		newOid = GetNewObjectId();
 | 
							newOid = GetNewObjectId();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ScanKeyInit(&key,
 | 
							ScanKeyInit(&key,
 | 
				
			||||||
@@ -423,6 +425,8 @@ GetNewRelFileNode(Oid reltablespace, bool relisshared, Relation pg_class)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	do
 | 
						do
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							CHECK_FOR_INTERRUPTS();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Generate the OID */
 | 
							/* Generate the OID */
 | 
				
			||||||
		if (pg_class)
 | 
							if (pg_class)
 | 
				
			||||||
			rnode.relNode = GetNewOid(pg_class);
 | 
								rnode.relNode = GetNewOid(pg_class);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user