@ -320,6 +320,7 @@ DefineIndex(IndexStmt *stmt,
int16 * coloptions ;
int16 * coloptions ;
IndexInfo * indexInfo ;
IndexInfo * indexInfo ;
int numberOfAttributes ;
int numberOfAttributes ;
TransactionId limitXmin ;
VirtualTransactionId * old_lockholders ;
VirtualTransactionId * old_lockholders ;
VirtualTransactionId * old_snapshots ;
VirtualTransactionId * old_snapshots ;
int n_old_snapshots ;
int n_old_snapshots ;
@ -769,6 +770,18 @@ DefineIndex(IndexStmt *stmt,
*/
*/
validate_index ( relationId , indexRelationId , snapshot ) ;
validate_index ( relationId , indexRelationId , snapshot ) ;
/*
* Drop the reference snapshot . We must do this before waiting out other
* snapshot holders , else we will deadlock against other processes also
* doing CREATE INDEX CONCURRENTLY , which would see our snapshot as one
* they must wait for . But first , save the snapshot ' s xmin to use as
* limitXmin for GetCurrentVirtualXIDs ( ) .
*/
limitXmin = snapshot - > xmin ;
PopActiveSnapshot ( ) ;
UnregisterSnapshot ( snapshot ) ;
/*
/*
* The index is now valid in the sense that it contains all currently
* The index is now valid in the sense that it contains all currently
* interesting tuples . But since it might not contain tuples deleted just
* interesting tuples . But since it might not contain tuples deleted just
@ -801,7 +814,7 @@ DefineIndex(IndexStmt *stmt,
* GetCurrentVirtualXIDs . If , during any iteration , a particular vxid
* GetCurrentVirtualXIDs . If , during any iteration , a particular vxid
* doesn ' t show up in the output , we know we can forget about it .
* doesn ' t show up in the output , we know we can forget about it .
*/
*/
old_snapshots = GetCurrentVirtualXIDs ( snapshot - > x min, true , false ,
old_snapshots = GetCurrentVirtualXIDs ( limitX min, true , false ,
PROC_IS_AUTOVACUUM | PROC_IN_VACUUM ,
PROC_IS_AUTOVACUUM | PROC_IN_VACUUM ,
& n_old_snapshots ) ;
& n_old_snapshots ) ;
@ -818,7 +831,7 @@ DefineIndex(IndexStmt *stmt,
int j ;
int j ;
int k ;
int k ;
newer_snapshots = GetCurrentVirtualXIDs ( snapshot - > x min,
newer_snapshots = GetCurrentVirtualXIDs ( limitX min,
true , false ,
true , false ,
PROC_IS_AUTOVACUUM | PROC_IN_VACUUM ,
PROC_IS_AUTOVACUUM | PROC_IN_VACUUM ,
& n_newer_snapshots ) ;
& n_newer_snapshots ) ;
@ -857,12 +870,6 @@ DefineIndex(IndexStmt *stmt,
*/
*/
CacheInvalidateRelcacheByRelid ( heaprelid . relId ) ;
CacheInvalidateRelcacheByRelid ( heaprelid . relId ) ;
/* we can now do away with our active snapshot */
PopActiveSnapshot ( ) ;
/* And we can remove the validating snapshot too */
UnregisterSnapshot ( snapshot ) ;
/*
/*
* Last thing to do is release the session - level lock on the parent table .
* Last thing to do is release the session - level lock on the parent table .
*/
*/