mirror of
https://github.com/postgres/postgres.git
synced 2025-11-07 19:06:32 +03:00
Add WaitForLockers in lmgr, refactoring index.c code
This is in support of a future REINDEX CONCURRENTLY feature. Michael Paquier
This commit is contained in:
@@ -1323,7 +1323,6 @@ index_drop(Oid indexId, bool concurrent)
|
||||
indexrelid;
|
||||
LOCKTAG heaplocktag;
|
||||
LOCKMODE lockmode;
|
||||
VirtualTransactionId *old_lockholders;
|
||||
|
||||
/*
|
||||
* To drop an index safely, we must grab exclusive lock on its parent
|
||||
@@ -1445,11 +1444,8 @@ index_drop(Oid indexId, bool concurrent)
|
||||
|
||||
/*
|
||||
* Now we must wait until no running transaction could be using the
|
||||
* index for a query. To do this, inquire which xacts currently would
|
||||
* conflict with AccessExclusiveLock on the table -- ie, which ones
|
||||
* have a lock of any kind on the table. Then wait for each of these
|
||||
* xacts to commit or abort. Note we do not need to worry about xacts
|
||||
* that open the table for reading after this point; they will see the
|
||||
* index for a query. Note we do not need to worry about xacts that
|
||||
* open the table for reading after this point; they will see the
|
||||
* index as invalid when they open the relation.
|
||||
*
|
||||
* Note: the reason we use actual lock acquisition here, rather than
|
||||
@@ -1457,18 +1453,8 @@ index_drop(Oid indexId, bool concurrent)
|
||||
* possible if one of the transactions in question is blocked trying
|
||||
* to acquire an exclusive lock on our table. The lock code will
|
||||
* detect deadlock and error out properly.
|
||||
*
|
||||
* Note: GetLockConflicts() never reports our own xid, hence we need
|
||||
* not check for that. Also, prepared xacts are not reported, which
|
||||
* is fine since they certainly aren't going to do anything more.
|
||||
*/
|
||||
old_lockholders = GetLockConflicts(&heaplocktag, AccessExclusiveLock);
|
||||
|
||||
while (VirtualTransactionIdIsValid(*old_lockholders))
|
||||
{
|
||||
VirtualXactLock(*old_lockholders, true);
|
||||
old_lockholders++;
|
||||
}
|
||||
WaitForLockers(heaplocktag, AccessExclusiveLock);
|
||||
|
||||
/*
|
||||
* No more predicate locks will be acquired on this index, and we're
|
||||
@@ -1510,15 +1496,9 @@ index_drop(Oid indexId, bool concurrent)
|
||||
|
||||
/*
|
||||
* Wait till every transaction that saw the old index state has
|
||||
* finished. The logic here is the same as above.
|
||||
* finished.
|
||||
*/
|
||||
old_lockholders = GetLockConflicts(&heaplocktag, AccessExclusiveLock);
|
||||
|
||||
while (VirtualTransactionIdIsValid(*old_lockholders))
|
||||
{
|
||||
VirtualXactLock(*old_lockholders, true);
|
||||
old_lockholders++;
|
||||
}
|
||||
WaitForLockers(heaplocktag, AccessExclusiveLock);
|
||||
|
||||
/*
|
||||
* Re-open relations to allow us to complete our actions.
|
||||
|
||||
Reference in New Issue
Block a user