mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Create a "relation mapping" infrastructure to support changing the relfilenodes
of shared or nailed system catalogs. This has two key benefits: * The new CLUSTER-based VACUUM FULL can be applied safely to all catalogs. * We no longer have to use an unsafe reindex-in-place approach for reindexing shared catalogs. CLUSTER on nailed catalogs now works too, although I left it disabled on shared catalogs because the resulting pg_index.indisclustered update would only be visible in one database. Since reindexing shared system catalogs is now fully transactional and crash-safe, the former special cases in REINDEX behavior have been removed; shared catalogs are treated the same as non-shared. This commit does not do anything about the recently-discussed problem of deadlocks between VACUUM FULL/CLUSTER on a system catalog and other concurrent queries; will address that in a separate patch. As a stopgap, parallel_schedule has been tweaked to run vacuum.sql by itself, to avoid such failures during the regression tests.
This commit is contained in:
		@@ -7,7 +7,7 @@
 | 
			
		||||
 * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
 | 
			
		||||
 * Portions Copyright (c) 1994, Regents of the University of California
 | 
			
		||||
 *
 | 
			
		||||
 * $PostgreSQL: pgsql/src/include/utils/rel.h,v 1.121 2010/02/04 00:09:14 tgl Exp $
 | 
			
		||||
 * $PostgreSQL: pgsql/src/include/utils/rel.h,v 1.122 2010/02/07 20:48:13 tgl Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *-------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
@@ -339,6 +339,16 @@ typedef struct StdRdOptions
 | 
			
		||||
#define RelationGetNamespace(relation) \
 | 
			
		||||
	((relation)->rd_rel->relnamespace)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * RelationIsMapped
 | 
			
		||||
 *		True if the relation uses the relfilenode map.
 | 
			
		||||
 *
 | 
			
		||||
 * NB: this is only meaningful for relkinds that have storage, else it
 | 
			
		||||
 * will misleadingly say "true".
 | 
			
		||||
 */
 | 
			
		||||
#define RelationIsMapped(relation) \
 | 
			
		||||
	((relation)->rd_rel->relfilenode == InvalidOid)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * RelationOpenSmgr
 | 
			
		||||
 *		Open the relation at the smgr level, if not already done.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user